|
{"version":3,"file":"module.js","sources":["src/constants.js","src/canvas-effects/ease.js","src/lib/lib.js","node_modules/svelte/internal/index.mjs","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/util/index.js","node_modules/svelte/store/index.mjs","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/store/index.js","node_modules/svelte/easing/index.mjs","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/math/index.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/animation/AnimationControl.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/animation/AnimationManager.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/constants.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/convertRelative.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/animation/AnimationAPI.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/animation/AnimationGroupControl.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/animation/AnimationGroupAPI.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/initial/Centered.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/initial/index.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/PositionChangeSet.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/PositionData.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/PositionStateAPI.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/StyleCache.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/transform/TransformData.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/validators/AdapterValidators.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/validators/BasicBounds.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/validators/TransformBounds.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/validators/index.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/transform/Transforms.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/update/UpdateElementData.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/animate/index.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/update/UpdateElementManager.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/position/Position.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/internal/ApplicationState.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/internal/GetSvelteData.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/internal/loadSvelteConfig.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/internal/SvelteReactive.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/SvelteApplication.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/component/core/cssVariables.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/action/index.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/transition/index.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/component/core/application/AppShellContextInternal.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/helper/index.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/component/core/application/TJSHeaderButton.svelte","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/component/core/application/TJSApplicationHeader.svelte","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/component/core/application/TJSFocusWrap.svelte","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/component/core/application/ResizableHandle.svelte","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/component/core/application/ApplicationShell.svelte","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/component/core/index.js","node_modules/@typhonjs-fvtt/runtime/_dist/svelte/application/index.js","src/utils/loadingBar.js","src/modules/sequencer-file-cache.js","src/modules/sequencer-file.js","src/modules/sequencer-database.js","src/formapplications/database/TreeViewEntry.svelte","src/formapplications/database/TreeViewSeparator.svelte","src/formapplications/database/DatabaseStore.js","src/formapplications/database/DatabaseEntry.svelte","node_modules/svelte-virtual-scroll-list/src/virtual.js","node_modules/svelte-virtual-scroll-list/src/Item.svelte","node_modules/svelte-virtual-scroll-list/src/VirtualScroll.svelte","src/formapplications/database/database-shell.svelte","src/formapplications/database/database-viewer-app.js","src/formapplications/effects-ui/HowTo.svelte","src/formapplications/effects-ui/Tabs.svelte","src/modules/sequence-manager.js","src/lib/filters/color-matrix-filter.js","src/lib/filters/blur-filter.js","src/lib/filters/noise-filter.js","src/lib/filters/glow-filter.js","src/lib/filters/clip-filter.js","src/lib/filters.js","src/modules/sequencer-animation-engine.js","src/modules/sequencer-audio-helper.js","src/modules/sequencer-foundry-replicator.js","src/sockets.js","src/utils/flag-manager.js","src/modules/sequencer-effect-manager.js","src/canvas-effects/effects-layer.js","src/lib/filters/vision-mask-filter.js","src/lib/filters/mask-filter.js","src/canvas-effects/canvas-effect.js","src/lib/canvas-lib.js","src/formapplications/effects-ui/effect-player-store.js","src/modules/sequencer-interaction-manager.js","src/formapplications/effects-ui/components/EffectEntry.svelte","src/formapplications/effects-ui/components/SoundEntry.svelte","src/formapplications/effects-ui/Manager.svelte","src/formapplications/effects-ui/components/SliderInput.svelte","src/formapplications/effects-ui/components/Checkbox.svelte","src/formapplications/effects-ui/components/NumberInput.svelte","src/formapplications/effects-ui/components/SwitchToggle.svelte","src/formapplications/effects-ui/Player.svelte","src/formapplications/effects-ui/components/SequenceStatus.svelte","src/formapplications/effects-ui/components/SequenceSection.svelte","src/formapplications/effects-ui/components/Sequence.svelte","src/formapplications/effects-ui/Sequences.svelte","src/formapplications/effects-ui/effects-ui-shell.svelte","src/formapplications/effects-ui/effects-ui-app.js","src/settings.js","src/layers.js","src/hotkeys.js","typings/typings.js","src/modules/sequencer-presets.js","src/sections/section.js","src/sections/func.js","src/sections/traits/animation.js","src/sections/traits/audio.js","src/sections/traits/files.js","src/sections/traits/moves.js","src/sections/traits/opacity.js","src/sections/traits/rotation.js","src/sections/traits/scale.js","src/sections/traits/time.js","src/sections/traits/users.js","src/sections/traits/filter.js","src/sections/traits/tint.js","src/sections/traits/location.js","src/sections/traits/offset.js","src/sections/traits/text.js","src/sections/traits/_traits.js","src/sections/effect.js","src/sections/sound.js","src/sections/animation.js","src/sections/scrollingText.js","src/sections/canvasPan.js","src/sections/wait.js","src/modules/sequencer.js","src/modules/sequencer-preloader.js","src/modules/sequencer-section-manager.js","src/lib/libWrapper/shim.js","src/libwrapper.js","src/migrations.js","src/module.js"],"sourcesContent":["const CONSTANTS = {\n MODULE_NAME: \"sequencer\",\n FLAG_NAME: \"effects\",\n COLOR: {\n PRIMARY: 0xee442f,\n SECONDARY: 0x601a4a,\n TERTIARY: 0x601a4a,\n },\n SHAPES: {\n POLY: \"polygon\",\n RECT: \"rectangle\",\n CIRC: \"circle\",\n ELIP: \"ellipse\",\n RREC: \"roundedRect\",\n },\n FEET_REGEX: new RegExp(/\\.[0-9]+ft\\.*/g),\n ARRAY_REGEX: new RegExp(/\\.[0-9]$/g),\n STATUS: {\n READY: 0,\n RUNNING: 1,\n COMPLETE: 2,\n SKIPPED: 3,\n ABORTED: 4,\n },\n};\n\nCONSTANTS.INTEGRATIONS = {};\nCONSTANTS.INTEGRATIONS.ISOMETRIC = {};\nCONSTANTS.INTEGRATIONS.ISOMETRIC.ACTIVE = false;\nCONSTANTS.INTEGRATIONS.ISOMETRIC.MODULE_NAME = \"grape_juice-isometrics\";\nCONSTANTS.INTEGRATIONS.ISOMETRIC.SCENE_ENABLED = `flags.${CONSTANTS.INTEGRATIONS.ISOMETRIC.MODULE_NAME}.is_isometric`;\nCONSTANTS.INTEGRATIONS.ISOMETRIC.PROJECTION_FLAG = `flags.${CONSTANTS.INTEGRATIONS.ISOMETRIC.MODULE_NAME}.original_image_projection_type`;\nCONSTANTS.INTEGRATIONS.ISOMETRIC.PROJECTION_TYPES = {\n TOPDOWN: \"topdown\",\n TRUE: \"true_isometric\",\n DIAMETRIC: \"diametric\",\n};\nCONSTANTS.INTEGRATIONS.ISOMETRIC.ISOMETRIC_CONVERSION = Math.sqrt(3);\nCONSTANTS.INTEGRATIONS.ISOMETRIC.DIMETRIC_CONVERSION =\n 2 / CONSTANTS.INTEGRATIONS.ISOMETRIC.ISOMETRIC_CONVERSION;\nCONSTANTS.INTEGRATIONS.ISOMETRIC.DUNGEON_BUILDER_CONVERSION =\n 278 / 154 / CONSTANTS.INTEGRATIONS.ISOMETRIC.ISOMETRIC_CONVERSION;\n\nCONSTANTS.EFFECTS_FLAG = `flags.${CONSTANTS.MODULE_NAME}.${CONSTANTS.FLAG_NAME}`;\n\nexport default CONSTANTS;\n","import * as lib from \"../lib/lib.js\";\n\nexport function registerEase(easeName, easeFunction, overwrite = false) {\n if (typeof easeName !== \"string\")\n throw lib.custom_error(\"registerEase\", \"easeName must be of type string\");\n if (!lib.is_function(easeFunction))\n throw lib.custom_error(\n \"registerEase\",\n \"easeFunction must be of type function\"\n );\n if (easeFunctions[easeName] !== undefined && !overwrite) return;\n lib.debug(`registerEase | Registered ease function: ${easeName}`);\n easeFunctions[easeName] = easeFunction;\n}\n\nexport const easeFunctions = {\n linear: linear,\n easeInSine: easeInSine,\n easeOutSine: easeOutSine,\n easeInOutSine: easeInOutSine,\n easeInQuad: easeInQuad,\n easeOutQuad: easeOutQuad,\n easeInOutQuad: easeInOutQuad,\n easeInCubic: easeInCubic,\n easeOutCubic: easeOutCubic,\n easeInOutCubic: easeInOutCubic,\n easeInQuart: easeInQuart,\n easeOutQuart: easeOutQuart,\n easeInOutQuart: easeInOutQuart,\n easeInQuint: easeInQuint,\n easeOutQuint: easeOutQuint,\n easeInOutQuint: easeInOutQuint,\n easeInExpo: easeInExpo,\n easeOutExpo: easeOutExpo,\n easeInOutExpo: easeInOutExpo,\n easeInCirc: easeInCirc,\n easeOutCirc: easeOutCirc,\n easeInOutCirc: easeInOutCirc,\n easeInBack: easeInBack,\n easeOutBack: easeOutBack,\n easeInOutBack: easeInOutBack,\n easeInElastic: easeInElastic,\n easeOutElastic: easeOutElastic,\n easeInOutElastic: easeInOutElastic,\n easeInBounce: easeInBounce,\n easeOutBounce: easeOutBounce,\n easeInOutBounce: easeInOutBounce,\n};\n\nexport const EASE = {\n LINEAR: \"linear\",\n SINE_IN: \"easeInSine\",\n SINE_OUT: \"easeOutSine\",\n SINE_IN_OUT: \"easeInOutSine\",\n QUAD_IN: \"easeInQuad\",\n QUAD_OUT: \"easeOutQuad\",\n QUAD_IN_OUT: \"easeInOutQuad\",\n CUBIC_IN: \"easeInCubic\",\n CUBIC_OUT: \"easeOutCubic\",\n CUBIC_IN_OUT: \"easeInOutCubic\",\n QUART_IN: \"easeInQuart\",\n QUART_OUT: \"easeOutQuart\",\n QUART_IN_OUT: \"easeInOutQuart\",\n QUINT_IN: \"easeInQuint\",\n QUINT_OUT: \"easeOutQuint\",\n QUINT_IN_OUT: \"easeInOutQuint\",\n EXPO_IN: \"easeInExpo\",\n EXPO_OUT: \"easeOutExpo\",\n EXPO_IN_OUT: \"easeInOutExpo\",\n CIRC_IN: \"easeInCirc\",\n CIRC_OUT: \"easeOutCirc\",\n CIRC_IN_OUT: \"easeInOutCirc\",\n BACK_IN: \"easeInBack\",\n BACK_OUT: \"easeOutBack\",\n BACK_IN_OUT: \"easeInOutBack\",\n ELASTIC_IN: \"easeInElastic\",\n ELASTIC_OUT: \"easeOutElastic\",\n ELASTIC_IN_OUT: \"easeInOutElastic\",\n BOUNCE_IN: \"easeInBounce\",\n BOUNCE_OUT: \"easeOutBounce\",\n BOUNCE_IN_OUT: \"easeInOutBounce\",\n};\n\nfunction linear(x) {\n return x;\n}\n\nfunction easeInSine(x) {\n return 1 - Math.cos((x * Math.PI) / 2);\n}\n\nfunction easeOutSine(x) {\n return Math.sin((x * Math.PI) / 2);\n}\n\nfunction easeInOutSine(x) {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n}\n\nfunction easeInQuad(x) {\n return x * x;\n}\n\nfunction easeOutQuad(x) {\n return 1 - (1 - x) * (1 - x);\n}\n\nfunction easeInOutQuad(x) {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n}\n\nfunction easeInCubic(x) {\n return x * x * x;\n}\n\nfunction easeOutCubic(x) {\n return 1 - Math.pow(1 - x, 3);\n}\n\nfunction easeInOutCubic(x) {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n}\n\nfunction easeInQuart(x) {\n return x * x * x * x;\n}\n\nfunction easeOutQuart(x) {\n return 1 - Math.pow(1 - x, 4);\n}\n\nfunction easeInOutQuart(x) {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n}\n\nfunction easeInQuint(x) {\n return x * x * x * x * x;\n}\n\nfunction easeOutQuint(x) {\n return 1 - Math.pow(1 - x, 5);\n}\n\nfunction easeInOutQuint(x) {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n}\n\nfunction easeInExpo(x) {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n}\n\nfunction easeOutExpo(x) {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n}\n\nfunction easeInOutExpo(x) {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n}\n\nfunction easeInCirc(x) {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n}\n\nfunction easeOutCirc(x) {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n}\n\nfunction easeInOutCirc(x) {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n}\n\nfunction easeInBack(x) {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n}\n\nfunction easeOutBack(x) {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n}\n\nfunction easeInOutBack(x) {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n}\n\nfunction easeInElastic(x) {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n}\n\nfunction easeOutElastic(x) {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n}\n\nfunction easeInOutElastic(x) {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 + 1;\n}\n\nfunction easeInBounce(x) {\n return 1 - easeOutBounce(1 - x);\n}\n\nfunction easeOutBounce(x) {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n}\n\nfunction easeInOutBounce(x) {\n return x < 0.5\n ? (1 - easeOutBounce(1 - 2 * x)) / 2\n : (1 + easeOutBounce(2 * x - 1)) / 2;\n}\n","import CONSTANTS from \"../constants.js\";\nimport { easeFunctions } from \"../canvas-effects/ease.js\";\n\n/**\n * This function linearly interpolates between p1 and p2 based on a normalized value of t\n *\n * @param {string} inFile The start value\n * @param {object} inOptions The end value\n * @return {array|boolean} Interpolated value\n */\nexport async function getFiles(\n inFile,\n { applyWildCard = false, softFail = false } = {}\n) {\n let source = \"data\";\n const browseOptions = { wildcard: applyWildCard };\n\n if (/\\.s3\\./.test(inFile)) {\n source = \"s3\";\n const { bucket, keyPrefix } = FilePicker.parseS3URL(inFile);\n if (bucket) {\n browseOptions.bucket = bucket;\n inFile = keyPrefix;\n }\n }\n\n try {\n return (await FilePicker.browse(source, inFile, browseOptions)).files;\n } catch (err) {\n if (softFail) return false;\n throw custom_error(\"Sequencer\", `getFiles | ${err}`);\n }\n}\n\n/**\n * This function interpolates between p1 and p2 based on a normalized value of t, determined by the ease provided (string or function)\n *\n * @param {number} p1 The start value\n * @param {number} p2 The end value\n * @param {number} t The normalized percentage\n * @param {string|function} ease Type of ease to interpolate\n * @return {number} Interpolated value\n */\nexport function interpolate(p1, p2, t, ease = \"linear\") {\n const easeFunction = is_function(ease) ? ease : easeFunctions[ease];\n return p1 + (p2 - p1) * easeFunction(t);\n}\n\n/**\n * Returns a floating point number between a minimum and maximum value\n *\n * @param {number} min The minimum value\n * @param {number} max The maximum value\n * @param {boolean|MersenneTwister} twister The twister to generate the random results from\n * @return {number} A random value between the range given\n */\nexport function random_float_between(min, max, twister = false) {\n const random = twister ? twister.random() : Math.random();\n const _max = Math.max(max, min);\n const _min = Math.min(max, min);\n return random * (_max - _min) + _min;\n}\n\n/**\n * Returns an integer between a minimum and maximum value\n *\n * @param {number} min The minimum value\n * @param {number} max The maximum value\n * @param {boolean|MersenneTwister} twister The twister to generate the random results from\n * @return {int} A random integer between the range given\n */\nexport function random_int_between(min, max, twister = false) {\n return Math.floor(random_float_between(min, max, twister));\n}\n\nexport function flip_negate(num_1, num_2) {\n if (num_1 > 0) {\n num_1 -= num_2;\n } else {\n num_1 += num_2;\n }\n return num_1;\n}\n\n/**\n * Returns a shuffled copy of the original array.\n *\n * @param {array} inArray\n * @param {boolean|MersenneTwister} twister The twister to generate the random results from\n * @return {array}\n */\nexport function shuffle_array(inArray, twister = false) {\n let shuffled = [...inArray];\n const randomMethod = twister?.random ?? Math.random;\n for (let i = shuffled.length - 1; i > 0; i--) {\n let j = Math.floor(randomMethod() * (i + 1));\n let temp = shuffled[i];\n shuffled[i] = shuffled[j];\n shuffled[j] = temp;\n }\n return shuffled;\n}\n\n/**\n * This function determines if the given parameter is a callable function\n *\n * @param {function} inFunc The function object to be tested\n * @return {boolean} A boolean whether the function is actually a function\n */\nexport function is_function(inFunc) {\n return (\n inFunc &&\n ({}.toString.call(inFunc) === \"[object Function]\" ||\n {}.toString.call(inFunc) === \"[object AsyncFunction]\")\n );\n}\n\n/**\n * Returns a random element in the given array\n *\n * @param {array} inArray An array\n * @param {boolean} recurse Whether to recurse if the randomly chosen element is also an array\n * @param {boolean|MersenneTwister} twister The twister to generate the random results from\n * @param {boolean} index Whether to return the chosen index instead\n * @return {object} A random element from the array\n */\nexport function random_array_element(\n inArray,\n { recurse = false, twister = false, index = false } = {}\n) {\n const chosenIndex = random_int_between(0, inArray.length, twister);\n let choice = inArray[chosenIndex];\n if (recurse && Array.isArray(choice)) {\n return random_array_element(choice, { recurse, twister, index });\n }\n if (index) {\n return chosenIndex;\n }\n return choice;\n}\n\n/**\n * Returns a random element in the given object\n *\n * @param {object} inObject An object\n * @param {boolean} recurse Whether to recurse if the randomly chosen element is also an object\n * @param {boolean|MersenneTwister} twister The twister to generate the random results from\n * @return {object} A random element from the object\n */\nexport function random_object_element(\n inObject,\n { recurse = false, twister = false } = {}\n) {\n let keys = Object.keys(inObject).filter((k) => !k.startsWith(\"_\"));\n let choice = inObject[random_array_element(keys, { twister })];\n if (typeof choice === \"object\" && recurse) {\n return random_object_element(choice, { recurse: true });\n }\n return choice;\n}\n\n/**\n * Tests a parameter whether it is a real number\n *\n * @param {any} inNumber The parameter to test\n * @return {boolean} Whether it is of type number, not infinite, and not NaN\n */\nexport function is_real_number(inNumber) {\n return !isNaN(inNumber) && typeof inNumber === \"number\" && isFinite(inNumber);\n}\n\n/**\n * Gets a property in an object based on a path in dot-notated string\n *\n * @param {object} obj The object to be queried\n * @param {array|string} path The path in the object to the property in a dot-notated string\n * @returns {any} Property value, if found\n */\nexport function deep_get(obj, path) {\n if (!Array.isArray(path)) path = path.split(\".\");\n try {\n let i;\n for (i = 0; i < path.length - 1; i++) {\n obj = obj[path[i]];\n }\n return obj[path[i]];\n } catch (err) {}\n}\n\n/**\n * Sets a property in an object based on a path in dot-notated string, example:\n * let obj = { first: { second: { third: \"value\" } } }\n * deep_set(obj, \"newValue\", \"first.second.third\")\n * let obj = { first: { second: { third: \"newValue\" } } }\n *\n * @param {object} obj The object to be modified\n * @param {array|string} path The path in the object to the property in a dot-notated string\n * @param {any} value The value to set\n */\nexport function deep_set(obj, path, value) {\n if (!Array.isArray(path)) path = path.split(\".\");\n try {\n let i;\n for (i = 0; i < path.length - 1; i++) {\n obj = obj[path[i]];\n }\n if (is_function(obj[path[i]])) {\n obj[path[i]](value);\n } else {\n obj[path[i]] = value;\n }\n } catch (err) {}\n}\n\n/**\n * Flattens an object in a dot-notated format, like:\n * { data: { entry: { thing: \"stuff\" } } }\n * Becomes:\n * [{ \"data.entry.thing\": \"stuff\" }]\n *\n * @param {object} obj The object to be flattened\n * @return {object} The flattened object\n */\nexport function flatten_object(obj) {\n let toReturn = [];\n for (let i in obj) {\n if (i.startsWith(\"_\")) continue;\n if (!obj.hasOwnProperty(i)) continue;\n if (typeof obj[i] == \"object\") {\n let flatObject = flatten_object(obj[i]);\n for (let x in flatObject) {\n if (!flatObject.hasOwnProperty(x)) continue;\n toReturn[i + \".\" + x] = flatObject[x];\n }\n } else {\n toReturn[i] = obj[i];\n }\n }\n return toReturn;\n}\n\n/**\n * Wait for a duration.\n *\n * @param {number} ms Milliseconds to wait\n * @return {Promise} A promise that resolves after a given amount of milliseconds\n */\nexport function wait(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Clamps a value between two numbers\n *\n * @param {number} num Number to clamp\n * @param {number} min The minimum the number can be\n * @param {number} max The maximum the number can be\n * @return {number} The clamped number\n */\nexport function clamp(num, min, max) {\n const _max = Math.max(min, max);\n const _min = Math.min(min, max);\n return Math.max(_min, Math.min(_max, num));\n}\n\n/**\n * Checks whether a given string is a valid UUID or not\n *\n * @param {string} inId\n * @returns {boolean}\n */\nexport function is_UUID(inId) {\n return (\n typeof inId === \"string\" &&\n (inId.startsWith(\"Scene\") ||\n inId.startsWith(\"Actor\") ||\n inId.startsWith(\"Item\")) &&\n (inId.match(/\\./g) || []).length &&\n !inId.endsWith(\".\")\n );\n}\n\n/**\n * Gets an object by an unique identifier, such as an ID, name, tag, label\n *\n * @param {String} inObjectId The object identifier to search for\n * @param {String} inSceneId The scene ID to search within\n * @return {any} Object if found, else undefined\n */\nexport function get_object_from_scene(\n inObjectId,\n inSceneId = game.user.viewedScene\n) {\n let tryUUID = is_UUID(inObjectId);\n if (tryUUID) {\n const obj = fromUuidSync(inObjectId);\n if (obj) return obj;\n tryUUID = false;\n }\n return get_all_documents_from_scene(inSceneId).find((obj) => {\n return get_object_identifier(obj, tryUUID) === inObjectId;\n });\n}\n\n/**\n * Gets all documents from the given scene\n *\n * @param inSceneId [inSceneId]\n * @returns {Array<Document>}\n */\nexport function get_all_documents_from_scene(inSceneId = false) {\n const scene = inSceneId\n ? game.scenes.get(inSceneId)\n : game.scenes.get(game.user?.viewedScene);\n if (!scene) return [];\n return [\n ...(canvas.templates?.preview?.children ?? []),\n ...Array.from(scene?.tokens ?? []),\n ...Array.from(scene?.lights ?? []),\n ...Array.from(scene?.sounds ?? []),\n ...Array.from(scene?.templates ?? []),\n ...Array.from(scene?.tiles ?? []),\n ...Array.from(scene?.walls ?? []),\n ...Array.from(scene?.drawings ?? []),\n ]\n .deepFlatten()\n .filter(Boolean);\n}\n\n/**\n * Gets the document from an object, if it has one\n *\n * @param inObject\n * @returns {Document|{document}|*}\n */\nexport function validate_document(inObject) {\n const document = inObject?.document ?? inObject;\n return is_UUID(document?.uuid) ? document : inObject;\n}\n\n/**\n * Get the unique identifier from an object\n *\n * @param {Object} inObject The object to get the unique identifier from\n * @param {Boolean} tryUUID The object to get the unique identifier from\n * @return {String} The identifier\n */\nexport function get_object_identifier(inObject, tryUUID = true) {\n const uuid = tryUUID && is_UUID(inObject?.uuid) ? inObject?.uuid : undefined;\n return (\n uuid ??\n inObject?.id ??\n inObject?.document?.name ??\n inObject?.name ??\n (inObject?.tag !== \"\" ? inObject?.tag : undefined) ??\n (inObject?.label !== \"\" ? inObject?.label : undefined)\n );\n}\n\n/**\n * Turns an array containing multiples of the same string, objects, etc, and removes duplications, and returns a fresh array\n *\n * @param {Array} inArray An array of multiple duplicate collections to be made unique\n * @return {Array} An array containing only unique objects\n */\nexport function make_array_unique(inArray) {\n return Array.from(new Set(inArray));\n}\n\nexport function debug(msg, args = \"\") {\n if (game.settings.get(CONSTANTS.MODULE_NAME, \"debug\"))\n console.log(`DEBUG | Sequencer | ${msg}`, args);\n}\n\nexport function debug_error(msg, args) {\n if (game.settings.get(CONSTANTS.MODULE_NAME, \"debug\"))\n console.error(`DEBUG | Sequencer | ${msg}`, args);\n}\n\nexport function custom_warning(inClassName, warning, notify = false) {\n inClassName =\n inClassName !== \"Sequencer\"\n ? \"Sequencer | Module: \" + inClassName\n : inClassName;\n warning = `${inClassName} | ${warning}`;\n if (notify) ui.notifications.warn(warning, { console: false });\n console.warn(warning.replace(\"<br>\", \"\\n\"));\n}\n\nconst throttledWarnings = {};\nexport function throttled_custom_warning(\n inClassName,\n warning,\n delay = 10000,\n notify = false\n) {\n inClassName =\n inClassName !== \"Sequencer\"\n ? \"Sequencer | Module: \" + inClassName\n : inClassName;\n warning = `${inClassName} | ${warning}`;\n if (throttledWarnings[warning]) return;\n throttledWarnings[warning] = true;\n if (notify) ui.notifications.warn(warning, { console: false });\n console.warn(warning.replace(\"<br>\", \"\\n\"));\n setTimeout(() => {\n delete throttledWarnings[warning];\n }, delay);\n}\n\nexport function custom_error(inClassName, error, notify = true) {\n inClassName =\n inClassName !== \"Sequencer\"\n ? \"Sequencer | Module: \" + inClassName\n : inClassName;\n error = `${inClassName} | ${error}`;\n if (notify) ui.notifications.error(error, { console: false });\n return new Error(error.replace(\"<br>\", \"\\n\"));\n}\n\nexport function user_can_do(inSetting) {\n return game.user.role > game.settings.get(CONSTANTS.MODULE_NAME, inSetting);\n}\n\nexport function group_by(xs, key) {\n return xs.reduce(function (acc, obj) {\n let property = getProperty(obj, key);\n acc[property] = acc[property] || [];\n acc[property].push(obj);\n return acc;\n }, {});\n}\n\nfunction objHasProperty(obj, prop) {\n return obj.constructor.prototype.hasOwnProperty(prop);\n}\n\nexport function sequence_proxy_wrap(inSequence) {\n return new Proxy(inSequence, {\n get: function (target, prop) {\n if (!objHasProperty(target, prop)) {\n if (Sequencer.SectionManager.externalSections[prop] === undefined) {\n const section = target.sections[target.sections.length - 1];\n if (section && objHasProperty(section, prop)) {\n const targetProperty = Reflect.get(section, prop);\n return is_function(targetProperty)\n ? targetProperty.bind(section)\n : targetProperty;\n }\n return Reflect.get(target, prop);\n }\n target.sectionToCreate =\n Sequencer.SectionManager.externalSections[prop];\n return Reflect.get(target, \"_createCustomSection\");\n }\n return Reflect.get(target, prop);\n },\n });\n}\n\nexport function section_proxy_wrap(inClass) {\n return new Proxy(inClass, {\n get: function (target, prop) {\n if (\n !objHasProperty(target, prop) &&\n objHasProperty(target.sequence, prop)\n ) {\n const targetProperty = Reflect.get(target.sequence, prop);\n return is_function(targetProperty)\n ? targetProperty.bind(target.sequence)\n : targetProperty;\n }\n return Reflect.get(target, prop);\n },\n });\n}\n\nexport function str_to_search_regex_str(str) {\n return str\n .trim()\n .replace(/[^A-Za-z0-9 .*_-]/g, \"\")\n .replace(/\\*+/g, \".*?\");\n}\n\nexport function safe_str(str) {\n return str.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\");\n}\n\nexport function scroll_to_element(\n scrollElement,\n scrollToElement,\n duration = 500\n) {\n if (!duration) {\n scrollElement.scrollTop(\n scrollElement.scrollTop() -\n scrollElement.offset().top +\n scrollToElement.offset().top\n );\n return;\n }\n\n scrollElement.animate(\n {\n scrollTop:\n scrollElement.scrollTop() -\n scrollElement.offset().top +\n scrollToElement.offset().top,\n },\n duration\n );\n\n return wait(duration);\n}\n\nexport async function highlight_element(\n element,\n { duration = false, color = \"#FF0000\", size = \"3px\" } = {}\n) {\n element.prop(\n \"style\",\n `-webkit-box-shadow: inset 0px 0px ${size} ${size} ${color}; box-shadow: inset 0px 0px ${size} ${size} ${color};`\n );\n if (!duration) return;\n await wait(duration);\n element.prop(\"style\", \"\");\n}\n\nexport function get_hash(input) {\n let hash = 0;\n const len = input.length;\n for (let i = 0; i < len; i++) {\n hash = (hash << 5) - hash + input.charCodeAt(i);\n hash |= 0; // to 32bit integer\n }\n return hash;\n}\n\nexport function parseColor(inColor) {\n return {\n hexadecimal: is_real_number(inColor) ? inColor.toString(16) : inColor,\n decimal:\n typeof inColor === \"string\" && inColor.startsWith(\"#\")\n ? parseInt(inColor.slice(1), 16)\n : inColor,\n };\n}\n\nexport function getCanvasMouse() {\n return game.release.generation === 11\n ? canvas.app.renderer.plugins.interaction.pointer\n : canvas.app.renderer.plugins.interaction.mouse;\n}\n","function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\nfunction is_promise(value) {\n return !!value && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n let children = target.childNodes;\n // If target is <head>, there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n return style.sheet;\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentNode !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data_map(node, data_map) {\n Object.keys(data_map).forEach((key) => {\n set_custom_element_data(node, key, data_map[key]);\n });\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration(undefined, is_svg);\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.wholeText !== data)\n text.data = data;\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n if (value === null) {\n node.style.removeProperty(key);\n }\n else {\n node.style.setProperty(key, value, important ? 'important' : '');\n }\n}\nfunction select_option(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n select.selectedIndex = -1; // no option should be selected\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked') || select.options[0];\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, cancelable, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nfunction head_selector(nodeId, head) {\n const result = [];\n let started = 0;\n for (const node of head.childNodes) {\n if (node.nodeType === 8 /* comment node */) {\n const comment = node.textContent.trim();\n if (comment === `HEAD_${nodeId}_END`) {\n started -= 1;\n result.push(node);\n }\n else if (comment === `HEAD_${nodeId}_START`) {\n started += 1;\n result.push(node);\n }\n }\n else if (started > 0) {\n result.push(node);\n }\n }\n return result;\n}\nclass HtmlTag {\n constructor(is_svg = false) {\n this.is_svg = false;\n this.is_svg = is_svg;\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n if (this.is_svg)\n this.e = svg_element(target.nodeName);\n else\n this.e = element(target.nodeName);\n this.t = target;\n this.c(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\nclass HtmlTagHydration extends HtmlTag {\n constructor(claimed_nodes, is_svg = false) {\n super(is_svg);\n this.e = this.n = null;\n this.l = claimed_nodes;\n }\n c(html) {\n if (this.l) {\n this.n = this.l;\n }\n else {\n super.c(html);\n }\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert_hydration(this.t, this.n[i], anchor);\n }\n }\n}\nfunction attribute_to_object(attributes) {\n const result = {};\n for (const attribute of attributes) {\n result[attribute.name] = attribute.value;\n }\n return result;\n}\nfunction get_custom_elements_slots(element) {\n const result = {};\n element.childNodes.forEach((node) => {\n result[node.slot || 'default'] = true;\n });\n return result;\n}\nfunction construct_svelte_component(component, props) {\n return new component(props);\n}\n\n// we need to store the information for multiple documents because a Svelte application could also contain iframes\n// https://github.com/sveltejs/svelte/issues/3624\nconst managed_styles = new Map();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_style_information(doc, node) {\n const info = { stylesheet: append_empty_stylesheet(node), rules: {} };\n managed_styles.set(doc, info);\n return info;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = get_root_for_style(node);\n const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);\n if (!rules[name]) {\n rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n managed_styles.forEach(info => {\n const { ownerNode } = info.stylesheet;\n // there is no ownerNode if it runs on jsdom.\n if (ownerNode)\n detach(ownerNode);\n });\n managed_styles.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error('Function called outside component initialization');\n return current_component;\n}\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs#run-time-svelte-beforeupdate\n */\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs#run-time-svelte-onmount\n */\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n */\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs#run-time-svelte-ondestroy\n */\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * https://svelte.dev/docs#run-time-svelte-createeventdispatcher\n */\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail, { cancelable = false } = {}) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail, { cancelable });\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n return !event.defaultPrevented;\n }\n return true;\n };\n}\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-setcontext\n */\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n return context;\n}\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-getcontext\n */\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs#run-time-svelte-getallcontexts\n */\nfunction getAllContexts() {\n return get_current_component().$$.context;\n}\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-hascontext\n */\nfunction hasContext(key) {\n return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n // @ts-ignore\n callbacks.slice().forEach(fn => fn.call(this, event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n// for afterUpdates called during the initial onMount, which are called in\n// reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n// dirty_components array and will cause a reentrant call to flush(). Because\n// the flush index is kept outside the function, the reentrant call will pick\n// up where the earlier call left off and go through all dirty components. The\n// current_component value is saved and restored so that the reentrant call will\n// not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n// callback called a second time; the seen_callbacks set, outside the flush()\n// function, guarantees this behavior.\nconst seen_callbacks = new Set();\nlet flushidx = 0; // Do *not* move this inside the flush() function\nfunction flush() {\n // Do not reenter flush while dirty components are updated, as this can\n // result in an infinite loop. Instead, let the inner flush handle it.\n // Reentrancy is ok afterwards for bindings etc.\n if (flushidx !== 0) {\n return;\n }\n const saved_component = current_component;\n do {\n // first, call beforeUpdate functions\n // and update components\n try {\n while (flushidx < dirty_components.length) {\n const component = dirty_components[flushidx];\n flushidx++;\n set_current_component(component);\n update(component.$$);\n }\n }\n catch (e) {\n // reset dirty state to not end up in a deadlocked state and then rethrow\n dirty_components.length = 0;\n flushidx = 0;\n throw e;\n }\n set_current_component(null);\n dirty_components.length = 0;\n flushidx = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n seen_callbacks.clear();\n set_current_component(saved_component);\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n else if (callback) {\n callback();\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n const options = { direction: 'in' };\n let config = fn(node, params, options);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n started = true;\n delete_rule(node);\n if (is_function(config)) {\n config = config(options);\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n const options = { direction: 'out' };\n let config = fn(node, params, options);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n const options = { direction: 'both' };\n let config = fn(node, params, options);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = (program.b - t);\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program || pending_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config(options);\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n if (info.blocks[i] === block) {\n info.blocks[i] = null;\n }\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n const child_ctx = ctx.slice();\n const { resolved } = info;\n if (info.current === info.then) {\n child_ctx[info.value] = resolved;\n }\n if (info.current === info.catch) {\n child_ctx[info.error] = resolved;\n }\n info.block.p(child_ctx, dirty);\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n block.p(child_ctx, dirty);\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error('Cannot have duplicate keys in a keyed each');\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'itemscope',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n]);\n\n/** regex of all html void element names */\nconst void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;\nfunction is_void(name) {\n return void_element_names.test(name) || name.toLowerCase() === '!doctype';\n}\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, attrs_to_add) {\n const attributes = Object.assign({}, ...args);\n if (attrs_to_add) {\n const classes_to_add = attrs_to_add.classes;\n const styles_to_add = attrs_to_add.styles;\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n if (styles_to_add) {\n if (attributes.style == null) {\n attributes.style = style_object_to_string(styles_to_add);\n }\n else {\n attributes.style = style_object_to_string(merge_ssr_styles(attributes.style, styles_to_add));\n }\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += ' ' + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += ' ' + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${value}\"`;\n }\n });\n return str;\n}\nfunction merge_ssr_styles(style_attribute, style_directive) {\n const style_object = {};\n for (const individual_style of style_attribute.split(';')) {\n const colon_index = individual_style.indexOf(':');\n const name = individual_style.slice(0, colon_index).trim();\n const value = individual_style.slice(colon_index + 1).trim();\n if (!name)\n continue;\n style_object[name] = value;\n }\n for (const name in style_directive) {\n const value = style_directive[name];\n if (value) {\n style_object[name] = value;\n }\n else {\n delete style_object[name];\n }\n }\n return style_object;\n}\nconst ATTR_REGEX = /[&\"]/g;\nconst CONTENT_REGEX = /[&<]/g;\n/**\n * Note: this method is performance sensitive and has been optimized\n * https://github.com/sveltejs/svelte/pull/5701\n */\nfunction escape(value, is_attr = false) {\n const str = String(value);\n const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX;\n pattern.lastIndex = 0;\n let escaped = '';\n let last = 0;\n while (pattern.test(str)) {\n const i = pattern.lastIndex - 1;\n const ch = str[i];\n escaped += str.substring(last, i) + (ch === '&' ? '&' : (ch === '\"' ? '"' : '<'));\n last = i + 1;\n }\n return escaped + str.substring(last);\n}\nfunction escape_attribute_value(value) {\n // keep booleans, null, and undefined for the sake of `spread`\n const should_escape = typeof value === 'string' || (value && typeof value === 'object');\n return should_escape ? escape(value, true) : value;\n}\nfunction escape_object(obj) {\n const result = {};\n for (const key in obj) {\n result[key] = escape_attribute_value(obj[key]);\n }\n return result;\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules. Otherwise you may need to fix a <${name}>.`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots, context) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, $$slots, context);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n const assignment = (boolean && value === true) ? '' : `=\"${escape(value, true)}\"`;\n return ` ${name}${assignment}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : '';\n}\nfunction style_object_to_string(style_object) {\n return Object.keys(style_object)\n .filter(key => style_object[key])\n .map(key => `${key}: ${escape_attribute_value(style_object[key])};`)\n .join(' ');\n}\nfunction add_styles(style_object) {\n const styles = style_object_to_string(style_object);\n return styles ? ` style=\"${styles}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n const { fragment, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n if (!customElement) {\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n // if the component was destroyed immediately\n // it will update the `$$.on_destroy` reference to `null`.\n // the destructured on_destroy may still reference to the old array\n if (component.$$.on_destroy) {\n component.$$.on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n }\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const $$ = component.$$ = {\n fragment: null,\n ctx: [],\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n on_disconnect: [],\n before_update: [],\n after_update: [],\n context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false,\n root: options.target || parent_component.$$.root\n };\n append_styles && append_styles($$.root);\n let ready = false;\n $$.ctx = instance\n ? instance(component, options.props || {}, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n start_hydrating();\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor, options.customElement);\n end_hydrating();\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n const { on_mount } = this.$$;\n this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n disconnectedCallback() {\n run_all(this.$$.on_disconnect);\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n if (!is_function(callback)) {\n return noop;\n }\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.55.1' }, detail), { bubbles: true }));\n}\nfunction append_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev('SvelteDOMRemove', { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n else\n dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nfunction validate_dynamic_element(tag) {\n const is_string = typeof tag === 'string';\n if (tag && !is_string) {\n throw new Error('<svelte:element> expects \"this\" attribute to be a string.');\n }\n}\nfunction validate_void_dynamic_element(tag) {\n if (tag && is_void(tag)) {\n console.warn(`<svelte:element this=\"${tag}\"> is self-closing and cannot have content.`);\n }\n}\nfunction construct_svelte_component_dev(component, props) {\n const error_message = 'this={...} of <svelte:component> should specify a Svelte component.';\n try {\n const instance = new component(props);\n if (!instance.$$ || !instance.$set || !instance.$on || !instance.$destroy) {\n throw new Error(error_message);\n }\n return instance;\n }\n catch (err) {\n const { message } = err;\n if (typeof message === 'string' && message.indexOf('is not a constructor') !== -1) {\n throw new Error(error_message);\n }\n else {\n throw err;\n }\n }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(\"'target' is a required option\");\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn('Component was already destroyed'); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n constructor(options) {\n super(options);\n }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error('Infinite loop detected');\n }\n };\n}\n\nexport { HtmlTag, HtmlTagHydration, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_styles, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, component_subscribe, compute_rest_props, compute_slots, construct_svelte_component, construct_svelte_component_dev, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, head_selector, identity, init, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, is_void, listen, listen_dev, loop, loop_guard, merge_ssr_styles, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_custom_element_data_map, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, src_url_equal, start_hydrating, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_dynamic_element, validate_each_argument, validate_each_keys, validate_slots, validate_store, validate_void_dynamic_element, xlink_attr };\n","import { group_outros, transition_out, check_outros } from 'svelte/internal';\n\n/**\n * Provides common object manipulation utilities including depth traversal, obtaining accessors, safely setting values /\n * equality tests, and validation.\n */\n\nconst s_TAG_OBJECT = '[object Object]';\n\n/**\n * Recursively deep merges all source objects into the target object in place. Like `Object.assign` if you provide `{}`\n * as the target a copy is produced. If the target and source property are object literals they are merged.\n * Deleting keys is supported by specifying a property starting with `-=`.\n *\n * @param {object} target - Target object.\n *\n * @param {...object} sourceObj - One or more source objects.\n *\n * @returns {object} Target object.\n */\nfunction deepMerge(target = {}, ...sourceObj)\n{\n if (Object.prototype.toString.call(target) !== s_TAG_OBJECT)\n {\n throw new TypeError(`deepMerge error: 'target' is not an 'object'.`);\n }\n\n for (let cntr = 0; cntr < sourceObj.length; cntr++)\n {\n if (Object.prototype.toString.call(sourceObj[cntr]) !== s_TAG_OBJECT)\n {\n throw new TypeError(`deepMerge error: 'sourceObj[${cntr}]' is not an 'object'.`);\n }\n }\n\n return _deepMerge(target, ...sourceObj);\n}\n\n/**\n * Tests for whether an object is iterable.\n *\n * @param {*} value - Any value.\n *\n * @returns {boolean} Whether object is iterable.\n */\nfunction isIterable(value)\n{\n if (value === null || value === void 0 || typeof value !== 'object') { return false; }\n\n return typeof value[Symbol.iterator] === 'function';\n}\n\n/**\n * Tests for whether an object is async iterable.\n *\n * @param {*} value - Any value.\n *\n * @returns {boolean} Whether value is async iterable.\n */\nfunction isIterableAsync(value)\n{\n if (value === null || value === void 0 || typeof value !== 'object') { return false; }\n\n return typeof value[Symbol.asyncIterator] === 'function';\n}\n\n/**\n * Tests for whether object is not null and a typeof object.\n *\n * @param {*} value - Any value.\n *\n * @returns {boolean} Is it an object.\n */\nfunction isObject(value)\n{\n return value !== null && typeof value === 'object';\n}\n\n/**\n * Tests for whether the given value is a plain object.\n *\n * An object is plain if it is created by either: {}, new Object() or Object.create(null).\n *\n * @param {*} value - Any value\n *\n * @returns {boolean} Is it a plain object.\n */\nfunction isPlainObject(value)\n{\n if (Object.prototype.toString.call(value) !== s_TAG_OBJECT) { return false; }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Provides a way to safely access an objects data / entries given an accessor string which describes the\n * entries to walk. To access deeper entries into the object format the accessor string with `.` between entries\n * to walk.\n *\n * @param {object} data - An object to access entry data.\n *\n * @param {string} accessor - A string describing the entries to access.\n *\n * @param {*} defaultValue - (Optional) A default value to return if an entry for accessor is not found.\n *\n * @returns {object} The data object.\n */\nfunction safeAccess(data, accessor, defaultValue = void 0)\n{\n if (typeof data !== 'object') { return defaultValue; }\n if (typeof accessor !== 'string') { return defaultValue; }\n\n const access = accessor.split('.');\n\n // Walk through the given object by the accessor indexes.\n for (let cntr = 0; cntr < access.length; cntr++)\n {\n // If the next level of object access is undefined or null then return the empty string.\n if (typeof data[access[cntr]] === 'undefined' || data[access[cntr]] === null) { return defaultValue; }\n\n data = data[access[cntr]];\n }\n\n return data;\n}\n\n/**\n * Provides a way to safely set an objects data / entries given an accessor string which describes the\n * entries to walk. To access deeper entries into the object format the accessor string with `.` between entries\n * to walk.\n *\n * @param {object} data - An object to access entry data.\n *\n * @param {string} accessor - A string describing the entries to access.\n *\n * @param {*} value - A new value to set if an entry for accessor is found.\n *\n * @param {string} [operation='set'] - Operation to perform including: 'add', 'div', 'mult', 'set',\n * 'set-undefined', 'sub'.\n *\n * @param {boolean} [createMissing=true] - If true missing accessor entries will be created as objects\n * automatically.\n *\n * @returns {boolean} True if successful.\n */\nfunction safeSet(data, accessor, value, operation = 'set', createMissing = true)\n{\n if (typeof data !== 'object') { throw new TypeError(`safeSet Error: 'data' is not an 'object'.`); }\n if (typeof accessor !== 'string') { throw new TypeError(`safeSet Error: 'accessor' is not a 'string'.`); }\n\n const access = accessor.split('.');\n\n // Walk through the given object by the accessor indexes.\n for (let cntr = 0; cntr < access.length; cntr++)\n {\n // If data is an array perform validation that the accessor is a positive integer otherwise quit.\n if (Array.isArray(data))\n {\n const number = (+access[cntr]);\n\n if (!Number.isInteger(number) || number < 0) { return false; }\n }\n\n if (cntr === access.length - 1)\n {\n switch (operation)\n {\n case 'add':\n data[access[cntr]] += value;\n break;\n\n case 'div':\n data[access[cntr]] /= value;\n break;\n\n case 'mult':\n data[access[cntr]] *= value;\n break;\n\n case 'set':\n data[access[cntr]] = value;\n break;\n\n case 'set-undefined':\n if (typeof data[access[cntr]] === 'undefined') { data[access[cntr]] = value; }\n break;\n\n case 'sub':\n data[access[cntr]] -= value;\n break;\n }\n }\n else\n {\n // If createMissing is true and the next level of object access is undefined then create a new object entry.\n if (createMissing && typeof data[access[cntr]] === 'undefined') { data[access[cntr]] = {}; }\n\n // Abort if the next level is null or not an object and containing a value.\n if (data[access[cntr]] === null || typeof data[access[cntr]] !== 'object') { return false; }\n\n data = data[access[cntr]];\n }\n }\n\n return true;\n}\n\n/**\n * Internal implementation for `deepMerge`.\n *\n * @param {object} target - Target object.\n *\n * @param {...object} sourceObj - One or more source objects.\n *\n * @returns {object} Target object.\n */\nfunction _deepMerge(target = {}, ...sourceObj)\n{\n // Iterate and merge all source objects into target.\n for (let cntr = 0; cntr < sourceObj.length; cntr++)\n {\n const obj = sourceObj[cntr];\n\n for (const prop in obj)\n {\n if (Object.prototype.hasOwnProperty.call(obj, prop))\n {\n // Handle the special property starting with '-=' to delete keys.\n if (prop.startsWith('-='))\n {\n delete target[prop.slice(2)];\n continue;\n }\n\n // If target already has prop and both target[prop] and obj[prop] are object literals then merge them\n // otherwise assign obj[prop] to target[prop].\n target[prop] = Object.prototype.hasOwnProperty.call(target, prop) && target[prop]?.constructor === Object &&\n obj[prop]?.constructor === Object ? _deepMerge({}, target[prop], obj[prop]) : obj[prop];\n }\n }\n }\n\n return target;\n}\n\n/**\n * Provides several helpful utility methods for accessibility and keyboard navigation.\n */\nclass A11yHelper\n{\n /**\n * Apply focus to the HTMLElement targets in a given A11yFocusSource data object. An iterable list `options.focusEl`\n * can contain HTMLElements or selector strings. If multiple focus targets are provided in a list then the first\n * valid target found will be focused. If focus target is a string then a lookup via `document.querySelector` is\n * performed. In this case you should provide a unique selector for the desired focus target.\n *\n * Note: The body of this method is postponed to the next clock tick to allow any changes in the DOM to occur that\n * might alter focus targets before applying.\n *\n * @param {A11yFocusSource|{ focusSource: A11yFocusSource }} options - The focus options instance to apply.\n */\n static applyFocusSource(options)\n {\n if (!isObject(options)) { return; }\n\n // Handle the case of receiving an object with embedded `focusSource`.\n const focusOpts = isObject(options?.focusSource) ? options.focusSource : options;\n\n setTimeout(() =>\n {\n const debug = typeof focusOpts.debug === 'boolean' ? focusOpts.debug : false;\n\n if (isIterable(focusOpts.focusEl))\n {\n if (debug)\n {\n console.debug(`A11yHelper.applyFocusSource debug - Attempting to apply focus target: `, focusOpts.focusEl);\n }\n\n for (const target of focusOpts.focusEl)\n {\n if (target instanceof HTMLElement && target.isConnected)\n {\n target.focus();\n if (debug)\n {\n console.debug(`A11yHelper.applyFocusSource debug - Applied focus to target: `, target);\n }\n break;\n }\n else if (typeof target === 'string')\n {\n const element = document.querySelector(target);\n if (element instanceof HTMLElement && element.isConnected)\n {\n element.focus();\n if (debug)\n {\n console.debug(`A11yHelper.applyFocusSource debug - Applied focus to target: `, element);\n }\n break;\n }\n else if (debug)\n {\n console.debug(`A11yHelper.applyFocusSource debug - Could not query selector: `, target);\n }\n }\n }\n }\n else if (debug)\n {\n console.debug(`A11yHelper.applyFocusSource debug - No focus targets defined.`);\n }\n }, 0);\n }\n\n /**\n * Returns first focusable element within a specified element.\n *\n * @param {HTMLElement|Document} [element=document] - Optional element to start query.\n *\n * @param {object} [options] - Optional parameters.\n *\n * @param {Iterable<string>} [options.ignoreClasses] - Iterable list of classes to ignore elements.\n *\n * @param {Set<HTMLElement>} [options.ignoreElements] - Set of elements to ignore.\n *\n * @returns {HTMLElement} First focusable child element\n */\n static getFirstFocusableElement(element = document, options)\n {\n const focusableElements = this.getFocusableElements(element, options);\n\n return focusableElements.length > 0 ? focusableElements[0] : void 0;\n }\n\n /**\n * Returns all focusable elements within a specified element.\n *\n * @param {HTMLElement|Document} [element=document] Optional element to start query.\n *\n * @param {object} [options] - Optional parameters.\n *\n * @param {boolean} [options.anchorHref=true] - When true anchors must have an HREF.\n *\n * @param {Iterable<string>} [options.ignoreClasses] - Iterable list of classes to ignore elements.\n *\n * @param {Set<HTMLElement>} [options.ignoreElements] - Set of elements to ignore.\n *\n * @param {string} [options.selectors] - Custom list of focusable selectors for `querySelectorAll`.\n *\n * @returns {Array<HTMLElement>} Child keyboard focusable\n */\n static getFocusableElements(element = document, { anchorHref = true, ignoreClasses, ignoreElements, selectors } = {})\n {\n if (!(element instanceof HTMLElement) && !(element instanceof Document))\n {\n throw new TypeError(`'element' is not a HTMLElement or Document instance.`);\n }\n\n if (typeof anchorHref !== 'boolean')\n {\n throw new TypeError(`'anchorHref' is not a boolean.`);\n }\n\n if (ignoreClasses !== void 0 && !isIterable(ignoreClasses))\n {\n throw new TypeError(`'ignoreClasses' is not an iterable list.`);\n }\n\n if (ignoreElements !== void 0 && !(ignoreElements instanceof Set))\n {\n throw new TypeError(`'ignoreElements' is not a Set.`);\n }\n\n if (selectors !== void 0 && typeof selectors !== 'string')\n {\n throw new TypeError(`'selectors' is not a string.`);\n }\n\n const selectorQuery = selectors ?? this.#getFocusableSelectors(anchorHref);\n\n const allElements = [...element.querySelectorAll(selectorQuery)];\n\n if (ignoreElements && ignoreClasses)\n {\n return allElements.filter((el) =>\n {\n let hasIgnoreClass = false;\n for (const ignoreClass of ignoreClasses)\n {\n if (el.classList.contains(ignoreClass))\n {\n hasIgnoreClass = true;\n break;\n }\n }\n\n return !hasIgnoreClass && !ignoreElements.has(el) && el.style.display !== 'none' &&\n el.style.visibility !== 'hidden' && !el.hasAttribute('disabled') && !el.hasAttribute('inert') &&\n el.getAttribute('aria-hidden') !== 'true';\n });\n }\n else if (ignoreClasses)\n {\n return allElements.filter((el) =>\n {\n let hasIgnoreClass = false;\n for (const ignoreClass of ignoreClasses)\n {\n if (el.classList.contains(ignoreClass))\n {\n hasIgnoreClass = true;\n break;\n }\n }\n\n return !hasIgnoreClass && el.style.display !== 'none' && el.style.visibility !== 'hidden' &&\n !el.hasAttribute('disabled') && !el.hasAttribute('inert') && el.getAttribute('aria-hidden') !== 'true';\n });\n }\n else if (ignoreElements)\n {\n return allElements.filter((el) =>\n {\n return !ignoreElements.has(el) && el.style.display !== 'none' && el.style.visibility !== 'hidden' &&\n !el.hasAttribute('disabled') && !el.hasAttribute('inert') && el.getAttribute('aria-hidden') !== 'true';\n });\n }\n else\n {\n return allElements.filter((el) =>\n {\n return el.style.display !== 'none' && el.style.visibility !== 'hidden' && !el.hasAttribute('disabled') &&\n !el.hasAttribute('inert') && el.getAttribute('aria-hidden') !== 'true';\n });\n }\n }\n\n /**\n * Returns the default focusable selectors query.\n *\n * @param {boolean} [anchorHref=true] - When true anchors must have an HREF.\n *\n * @returns {string} Focusable selectors for `querySelectorAll`.\n */\n static #getFocusableSelectors(anchorHref = true)\n {\n return `button, [contenteditable=\"\"], [contenteditable=\"true\"], details summary:not([tabindex=\"-1\"]), embed, a${\n anchorHref ? '[href]' : ''}, iframe, object, input:not([type=hidden]), select, textarea, ` +\n `[tabindex]:not([tabindex=\"-1\"])`;\n }\n\n /**\n * Gets a A11yFocusSource object from the given DOM event allowing for optional X / Y screen space overrides.\n * Browsers (Firefox / Chrome) forwards a mouse event for the context menu keyboard button. Provides detection of\n * when the context menu event is from the keyboard. Firefox as of (1/23) does not provide the correct screen space\n * coordinates, so for keyboard context menu presses coordinates are generated from the centroid point of the\n * element.\n *\n * A default fallback element or selector string may be provided to provide the focus target. If the event comes from\n * the keyboard however the source focused element is inserted as the target with the fallback value appended to the\n * list of focus targets. When A11yFocusSource is applied by {@link A11yHelper.applyFocusSource} the target focus\n * list is iterated through until a connected target is found and focus applied.\n *\n * @param {object} options - Options\n *\n * @param {KeyboardEvent|MouseEvent} [options.event] - The source DOM event.\n *\n * @param {boolean} [options.debug] - When true {@link A11yHelper.applyFocusSource} logs focus target data.\n *\n * @param {HTMLElement|string} [options.focusEl] - A specific HTMLElement or selector string as the focus target.\n *\n * @param {number} [options.x] - Used when an event isn't provided; integer of event source in screen space.\n *\n * @param {number} [options.y] - Used when an event isn't provided; integer of event source in screen space.\n *\n * @returns {A11yFocusSource} A A11yFocusSource object.\n *\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=1426671\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=314314\n *\n * TODO: Evaluate / test against touch input devices.\n */\n static getFocusSource({ event, x, y, focusEl, debug = false })\n {\n if (focusEl !== void 0 && !(focusEl instanceof HTMLElement) && typeof focusEl !== 'string')\n {\n throw new TypeError(\n `A11yHelper.getFocusSource error: 'focusEl' is not a HTMLElement or string.`);\n }\n\n if (debug !== void 0 && typeof debug !== 'boolean')\n {\n throw new TypeError(`A11yHelper.getFocusSource error: 'debug' is not a boolean.`);\n }\n\n // Handle the case when no event is provided and x, y, or focusEl is explicitly defined.\n if (event === void 0)\n {\n if (typeof x !== 'number')\n {\n throw new TypeError(`A11yHelper.getFocusSource error: 'event' not defined and 'x' is not a number.`);\n }\n\n if (typeof y !== 'number')\n {\n throw new TypeError(`A11yHelper.getFocusSource error: 'event' not defined and 'y' is not a number.`);\n }\n\n return {\n debug,\n focusEl: focusEl !== void 0 ? [focusEl] : void 0,\n x,\n y,\n };\n }\n\n if (!(event instanceof KeyboardEvent) && !(event instanceof MouseEvent))\n {\n throw new TypeError(`A11yHelper.getFocusSource error: 'event' is not a KeyboardEvent or MouseEvent.`);\n }\n\n if (x !== void 0 && !Number.isInteger(x))\n {\n throw new TypeError(`A11yHelper.getFocusSource error: 'x' is not a number.`);\n }\n\n if (y !== void 0 && !Number.isInteger(y))\n {\n throw new TypeError(`A11yHelper.getFocusSource error: 'y' is not a number.`);\n }\n\n /** @type {HTMLElement} */\n const targetEl = event.target;\n\n if (!(targetEl instanceof HTMLElement))\n {\n throw new TypeError(`A11yHelper.getFocusSource error: 'event.target' is not an HTMLElement.`);\n }\n\n const result = { debug };\n\n if (event instanceof MouseEvent)\n {\n // Firefox currently (1/23) does not correctly determine the location of a keyboard originated\n // context menu location, so calculate position from middle of the event target.\n // Firefox fires a mouse event for the context menu key.\n if (event?.button !== 2 && event.type === 'contextmenu')\n {\n const rect = targetEl.getBoundingClientRect();\n result.x = x ?? rect.left + (rect.width / 2);\n result.y = y ?? rect.top + (rect.height / 2);\n result.focusEl = focusEl !== void 0 ? [targetEl, focusEl] : [targetEl];\n result.source = 'keyboard';\n }\n else\n {\n result.x = x ?? event.pageX;\n result.y = y ?? event.pageY;\n result.focusEl = focusEl !== void 0 ? [focusEl] : void 0;\n }\n }\n else\n {\n const rect = targetEl.getBoundingClientRect();\n result.x = x ?? rect.left + (rect.width / 2);\n result.y = y ?? rect.top + (rect.height / 2);\n result.focusEl = focusEl !== void 0 ? [targetEl, focusEl] : [targetEl];\n result.source = 'keyboard';\n }\n\n return result;\n }\n\n /**\n * Returns first focusable element within a specified element.\n *\n * @param {HTMLElement|Document} [element=document] - Optional element to start query.\n *\n * @param {object} [options] - Optional parameters.\n *\n * @param {Iterable<string>} [options.ignoreClasses] - Iterable list of classes to ignore elements.\n *\n * @param {Set<HTMLElement>} [options.ignoreElements] - Set of elements to ignore.\n *\n * @returns {HTMLElement} First focusable child element\n */\n static getLastFocusableElement(element = document, options)\n {\n const focusableElements = this.getFocusableElements(element, options);\n\n return focusableElements.length > 0 ? focusableElements[focusableElements.length - 1] : void 0;\n }\n\n /**\n * Tests if the given element is focusable.\n *\n * @param {HTMLElement} [el] - Element to test.\n *\n * @param {object} [options] - Optional parameters.\n *\n * @param {boolean} [options.anchorHref=true] - When true anchors must have an HREF.\n *\n * @param {Iterable<string>} [options.ignoreClasses] - Iterable list of classes to ignore elements.\n *\n * @returns {boolean} Element is focusable.\n */\n static isFocusable(el, { anchorHref = true, ignoreClasses } = {})\n {\n if (el === void 0 || el === null || !(el instanceof HTMLElement) || el?.hidden || !el?.isConnected)\n {\n return false;\n }\n\n if (typeof anchorHref !== 'boolean')\n {\n throw new TypeError(`'anchorHref' is not a boolean.`);\n }\n\n if (ignoreClasses !== void 0 && !isIterable(ignoreClasses))\n {\n throw new TypeError(`'ignoreClasses' is not an iterable list.`);\n }\n\n const contenteditableAttr = el.getAttribute('contenteditable');\n const contenteditableFocusable = typeof contenteditableAttr === 'string' &&\n (contenteditableAttr === '' || contenteditableAttr === 'true');\n\n const tabindexAttr = el.getAttribute('tabindex');\n const tabindexFocusable = typeof tabindexAttr === 'string' && tabindexAttr !== '-1';\n\n const isAnchor = el instanceof HTMLAnchorElement;\n\n if (contenteditableFocusable || tabindexFocusable || isAnchor || el instanceof HTMLButtonElement ||\n el instanceof HTMLDetailsElement || el instanceof HTMLEmbedElement || el instanceof HTMLIFrameElement ||\n el instanceof HTMLInputElement || el instanceof HTMLObjectElement || el instanceof HTMLSelectElement ||\n el instanceof HTMLTextAreaElement)\n {\n if (isAnchor && anchorHref && typeof el.getAttribute('href') !== 'string')\n {\n return false;\n }\n\n return el.style.display !== 'none' && el.style.visibility !== 'hidden' && !el.hasAttribute('disabled') &&\n !el.hasAttribute('inert') && el.getAttribute('aria-hidden') !== 'true';\n }\n\n return false;\n }\n\n /**\n * Convenience method to check if the given data is a valid focus source.\n *\n * @param {HTMLElement|string} data - Either an HTMLElement or selector string.\n *\n * @returns {boolean} Is valid focus source.\n */\n static isFocusSource(data)\n {\n return data instanceof HTMLElement || typeof data === 'string';\n }\n}\n\n/**\n * @typedef {object} A11yFocusSource - Provides essential data to return focus to an HTMLElement after a series of UI\n * actions like working with context menus and modal dialogs.\n *\n * @property {boolean} [debug] - When true logs to console the actions taken in {@link A11yHelper.applyFocusSource}.\n *\n * @property {Iterable<HTMLElement|string>} [focusEl] - List of targets to attempt to focus.\n *\n * @property {string} [source] - The source of the event: 'keyboard' for instance.\n *\n * @property {number} [x] - Potential X coordinate of initial event.\n *\n * @property {number} [y] - Potential Y coordinate of initial event.\n */\n\n/**\n * Provides management of a single Promise that can be shared and accessed across JS & Svelte components. This allows a\n * Promise to be created and managed as part of the TRL application lifecycle and accessed safely in various control\n * flow scenarios. When resolution of the current managed Promise starts further interaction is prevented.\n *\n * Note: to enable debugging / log statements set the static `logging` variable to true.\n */\nclass ManagedPromise\n{\n /** @type {boolean} */\n static #logging = false;\n\n /** @type {{ isProcessing?: boolean, promise?: Promise, reject: Function, resolve: Function }} */\n #current;\n\n /**\n * @returns {boolean} Whether global logging is enabled.\n */\n static get logging()\n {\n return this.#logging;\n }\n\n /**\n * @returns {boolean} Whether there is an active managed Promise.\n */\n get isActive()\n {\n return this.#current !== void 0;\n }\n\n /**\n * @returns {boolean} Whether there is an active managed Promise and resolution is currently being processed.\n */\n get isProcessing()\n {\n return this.#current !== void 0 ? this.#current.isProcessing : false;\n }\n\n /**\n * Sets global logging enabled state.\n *\n * @param {boolean} logging - New logging enabled state.\n */\n static set logging(logging)\n {\n if (typeof logging !== 'boolean')\n {\n throw new TypeError(`[TRL] ManagedPromise.logging error: 'logging' is not a boolean.`);\n }\n\n this.#logging = logging;\n }\n\n // ----------------------------------------------------------------------------------------------------------------\n\n /**\n * Resolves any current Promise with undefined and creates a new current Promise.\n *\n * @template T\n *\n * @param {object} opts - Options.\n *\n * @param {boolean} [opts.reuse=false] - When true if there is an existing live Promise it is returned immediately.\n *\n * @returns {Promise<T>} The new current managed Promise.\n */\n create({ reuse = false } = {})\n {\n if (typeof reuse !== 'boolean')\n {\n throw new TypeError(`[TRL] ManagedPromise.create error: 'reuse' is not a boolean.`);\n }\n\n if (reuse && this.#current !== void 0 && this.#current.promise instanceof Promise)\n {\n if (ManagedPromise.#logging)\n {\n console.warn(`[TRL] ManagedPromise.create info: Reusing / returning existing managed Promise.`);\n }\n\n return this.#current.promise;\n }\n\n if (this.#current !== void 0)\n {\n if (ManagedPromise.#logging)\n {\n console.warn(\n `[TRL] ManagedPromise.create info: Creating a new Promise and resolving existing immediately.`);\n }\n\n this.#current.resolve(void 0);\n this.#current = void 0;\n }\n\n const promise = new Promise((resolve, reject) =>\n {\n this.#current = {\n isProcessing: false,\n reject,\n resolve\n };\n });\n\n this.#current.promise = promise;\n\n return promise;\n }\n\n /**\n * Gets the current Promise if any.\n *\n * @returns {Promise<any>} Current Promise.\n */\n get()\n {\n return this.#current ? this.#current.promise : void 0;\n }\n\n /**\n * Rejects the current Promise if applicable.\n *\n * @param {*} [result] - Result to reject.\n *\n * @returns {boolean} Was the promise rejected.\n */\n reject(result = void 0)\n {\n // Early out as Promise resolution is currently processing.\n if (this.#current !== void 0 && this.#current.isProcessing)\n {\n if (ManagedPromise.#logging)\n {\n console.warn(`[TRL] ManagedPromise.reject info: Currently processing promise.`);\n }\n\n return true;\n }\n\n if (this.#current !== void 0)\n {\n this.#current.isProcessing = true;\n\n if (result instanceof Promise)\n {\n result.then((value) =>\n {\n this.#current.reject(value);\n this.#current = void 0;\n }).catch((err) =>\n {\n this.#current.reject(err);\n this.#current = void 0;\n });\n }\n else\n {\n this.#current.reject(result);\n this.#current = void 0;\n }\n\n return true;\n }\n else\n {\n if (ManagedPromise.#logging)\n {\n console.warn(`[TRL] ManagedPromise.reject warning: No current managed Promise to reject.`);\n }\n\n return false;\n }\n }\n\n /**\n * Resolves the current Promise if applicable.\n *\n * @param {*} [result] - Result to resolve.\n *\n * @returns {boolean} Was the promise resolved.\n */\n resolve(result = void 0)\n {\n // Early out as Promise resolution is currently processing.\n if (this.#current !== void 0 && this.#current.isProcessing)\n {\n if (ManagedPromise.#logging)\n {\n console.warn(`[TRL] ManagedPromise.resolve info: Currently processing promise.`);\n }\n\n return true;\n }\n\n if (this.#current !== void 0)\n {\n if (result instanceof Promise)\n {\n this.#current.isProcessing = true;\n\n result.then((value) =>\n {\n this.#current.resolve(value);\n this.#current = void 0;\n }).catch((err) =>\n {\n this.#current.reject(err);\n this.#current = void 0;\n });\n }\n else\n {\n this.#current.resolve(result);\n this.#current = void 0;\n }\n\n return true;\n }\n else\n {\n if (ManagedPromise.#logging)\n {\n console.warn(`[TRL] ManagedPromise.resolve warning: No current managed Promise to resolve.`);\n }\n\n return false;\n }\n }\n}\n\n/**\n * Provides access to the Clipboard API for reading / writing text strings. This requires a secure context.\n *\n * Note: `writeText` will attempt to use the older `execCommand` if available when `navigator.clipboard` is not\n * available.\n */\nclass ClipboardAccess\n{\n /**\n * Uses `navigator.clipboard` if available to read text from the clipboard.\n *\n * Note: Always returns `undefined` when `navigator.clipboard` is not available or the clipboard contains the\n * empty string.\n *\n * @returns {Promise<string|undefined>} The current clipboard text or undefined.\n */\n static async readText()\n {\n let result;\n\n if (globalThis?.navigator?.clipboard)\n {\n try\n {\n result = await globalThis.navigator.clipboard.readText();\n }\n catch (err) { /**/ }\n }\n\n return result === '' ? void 0 : result;\n }\n\n /**\n * Uses `navigator.clipboard` if available then falls back to `document.execCommand('copy')` if available to copy\n * the given text to the clipboard.\n *\n * @param {string} text - Text to copy to the browser clipboard.\n *\n * @returns {Promise<boolean>} Copy successful.\n */\n static async writeText(text)\n {\n if (typeof text !== 'string')\n {\n throw new TypeError(`ClipboardAccess.writeText error: 'text' is not a string.`);\n }\n\n let success = false;\n\n if (globalThis?.navigator?.clipboard)\n {\n try\n {\n await globalThis.navigator.clipboard.writeText(text);\n success = true;\n }\n catch (err) { /**/ }\n }\n else if (globalThis?.document?.execCommand instanceof Function)\n {\n const textArea = globalThis.document.createElement('textarea');\n\n // Place in the top-left corner of screen regardless of scroll position.\n textArea.style.position = 'fixed';\n textArea.style.top = '0';\n textArea.style.left = '0';\n\n // Ensure it has a small width and height. Setting to 1px / 1em\n // doesn't work as this gives a negative w/h on some browsers.\n textArea.style.width = '2em';\n textArea.style.height = '2em';\n\n // We don't need padding, reducing the size if it does flash render.\n textArea.style.padding = '0';\n\n // Clean up any borders.\n textArea.style.border = 'none';\n textArea.style.outline = 'none';\n textArea.style.boxShadow = 'none';\n\n // Avoid flash of the white box if rendered for any reason.\n textArea.style.background = 'transparent';\n\n textArea.value = text;\n\n globalThis.document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try\n {\n success = document.execCommand('copy');\n }\n catch (err) { /**/ }\n\n document.body.removeChild(textArea);\n }\n\n return success;\n }\n}\n\n/**\n * Provides a solid string hashing algorithm.\n *\n * Sourced from: https://stackoverflow.com/a/52171480\n *\n * @param {string} str - String to hash.\n *\n * @param {number} seed - A seed value altering the hash.\n *\n * @returns {number} Hash code.\n */\nfunction hashCode(str, seed = 0)\n{\n if (typeof str !== 'string') { return 0; }\n\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\n\n for (let ch, i = 0; i < str.length; i++)\n {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n}\n\nconst s_UUIDV4_REGEX = /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i;\n\n/**\n * Generates a UUID v4 compliant ID. Please use a complete UUID generation package for guaranteed compliance.\n *\n * This code is an evolution of the following Gist.\n * https://gist.github.com/jed/982883\n *\n * There is a public domain / free copy license attached to it that is not a standard OSS license...\n * https://gist.github.com/jed/982883#file-license-txt\n *\n * @returns {string} UUIDv4\n */\nfunction uuidv4()\n{\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\n (c ^ (globalThis.crypto || globalThis.msCrypto).getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16));\n}\n\n/**\n * Validates that the given string is formatted as a UUIDv4 string.\n *\n * @param {string} uuid - UUID string to test.\n *\n * @returns {boolean} Is UUIDv4 string.\n */\nuuidv4.isValid = (uuid) => s_UUIDV4_REGEX.test(uuid);\n\n/**\n * Normalizes a string.\n *\n * @param {string} query - A string to normalize for comparisons.\n *\n * @returns {string} Cleaned string.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize\n */\nfunction normalizeString(query)\n{\n return query.trim().normalize('NFD').replace(/[\\x00-\\x1F]/gm, ''); // eslint-disable-line no-control-regex\n}\n\n/**\n * Recursive function that finds the closest parent stacking context.\n * See also https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\n *\n * Original author: Kerry Liu / https://github.com/gwwar\n *\n * @see https://github.com/gwwar/z-context/blob/master/content-script.js\n * @see https://github.com/gwwar/z-context/blob/master/LICENSE\n *\n * @param {Element} node -\n *\n * @returns {StackingContext} The closest parent stacking context\n */\nfunction getStackingContext(node)\n{\n // the root element (HTML).\n if (!node || node.nodeName === 'HTML')\n {\n return { node: document.documentElement, reason: 'root' };\n }\n\n // handle shadow root elements.\n if (node.nodeName === '#document-fragment')\n {\n return getStackingContext(node.host);\n }\n\n const computedStyle = globalThis.getComputedStyle(node);\n\n // position: fixed or sticky.\n if (computedStyle.position === 'fixed' || computedStyle.position === 'sticky')\n {\n return { node, reason: `position: ${computedStyle.position}` };\n }\n\n // positioned (absolutely or relatively) with a z-index value other than \"auto\".\n if (computedStyle.zIndex !== 'auto' && computedStyle.position !== 'static')\n {\n return { node, reason: `position: ${computedStyle.position}; z-index: ${computedStyle.zIndex}` };\n }\n\n // elements with an opacity value less than 1.\n if (computedStyle.opacity !== '1')\n {\n return { node, reason: `opacity: ${computedStyle.opacity}` };\n }\n\n // elements with a transform value other than \"none\".\n if (computedStyle.transform !== 'none')\n {\n return { node, reason: `transform: ${computedStyle.transform}` };\n }\n\n // elements with a mix-blend-mode value other than \"normal\".\n if (computedStyle.mixBlendMode !== 'normal')\n {\n return { node, reason: `mixBlendMode: ${computedStyle.mixBlendMode}` };\n }\n\n // elements with a filter value other than \"none\".\n if (computedStyle.filter !== 'none')\n {\n return { node, reason: `filter: ${computedStyle.filter}` };\n }\n\n // elements with a perspective value other than \"none\".\n if (computedStyle.perspective !== 'none')\n {\n return { node, reason: `perspective: ${computedStyle.perspective}` };\n }\n\n // elements with a clip-path value other than \"none\".\n if (computedStyle.clipPath !== 'none')\n {\n return { node, reason: `clip-path: ${computedStyle.clipPath} ` };\n }\n\n // elements with a mask value other than \"none\".\n const mask = computedStyle.mask || computedStyle.webkitMask;\n if (mask !== 'none' && mask !== undefined)\n {\n return { node, reason: `mask: ${mask}` };\n }\n\n // elements with a mask-image value other than \"none\".\n const maskImage = computedStyle.maskImage || computedStyle.webkitMaskImage;\n if (maskImage !== 'none' && maskImage !== undefined)\n {\n return { node, reason: `mask-image: ${maskImage}` };\n }\n\n // elements with a mask-border value other than \"none\".\n const maskBorder = computedStyle.maskBorder || computedStyle.webkitMaskBorder;\n if (maskBorder !== 'none' && maskBorder !== undefined)\n {\n return { node, reason: `mask-border: ${maskBorder}` };\n }\n\n // elements with isolation set to \"isolate\".\n if (computedStyle.isolation === 'isolate')\n {\n return { node, reason: `isolation: ${computedStyle.isolation}` };\n }\n\n // transform or opacity in will-change even if you don't specify values for these attributes directly.\n if (computedStyle.willChange === 'transform' || computedStyle.willChange === 'opacity')\n {\n return { node, reason: `willChange: ${computedStyle.willChange}` };\n }\n\n // elements with -webkit-overflow-scrolling set to \"touch\".\n if (computedStyle.webkitOverflowScrolling === 'touch')\n {\n return { node, reason: '-webkit-overflow-scrolling: touch' };\n }\n\n // an item with a z-index value other than \"auto\".\n if (computedStyle.zIndex !== 'auto')\n {\n const parentStyle = globalThis.getComputedStyle(node.parentNode);\n // with a flex|inline-flex parent.\n if (parentStyle.display === 'flex' || parentStyle.display === 'inline-flex')\n {\n return { node, reason: `flex-item; z-index: ${computedStyle.zIndex}` };\n // with a grid parent.\n }\n else if (parentStyle.grid !== 'none / none / none / row / auto / auto')\n {\n return { node, reason: `child of grid container; z-index: ${computedStyle.zIndex}` };\n }\n }\n\n // contain with a value of layout, or paint, or a composite value that includes either of them\n const contain = computedStyle.contain;\n if (['layout', 'paint', 'strict', 'content'].indexOf(contain) > -1 ||\n contain.indexOf('paint') > -1 ||\n contain.indexOf('layout') > -1\n )\n {\n return { node, reason: `contain: ${contain}` };\n }\n\n return getStackingContext(node.parentNode);\n}\n\n/**\n * @typedef {object} StackingContext\n *\n * @property {Element} node - A DOM Element.\n *\n * @property {string} reason - Reason for why a stacking context was created.\n */\n\n/**\n * Provides a managed dynamic style sheet / element useful in configuring global CSS variables. When creating an\n * instance of StyleManager you must provide a \"document key\" / string for the style element added. The style element\n * can be accessed via `document[docKey]`.\n *\n * Instances of StyleManager can also be versioned by supplying a positive integer greater than or equal to `1` via the\n * 'version' option. This version number is assigned to the associated style element. When a StyleManager instance is\n * created and there is an existing instance with a version that is lower than the current instance all CSS rules are\n * removed letting the higher version to take precedence. This isn't a perfect system and requires thoughtful\n * construction of CSS variables exposed, but allows multiple independently compiled TRL packages to load the latest\n * CSS variables. It is recommended to always set `overwrite` option of {@link StyleManager.setProperty} and\n * {@link StyleManager.setProperties} to `false` when loading initial values.\n */\nclass StyleManager\n{\n /** @type {CSSStyleRule} */\n #cssRule;\n\n /** @type {string} */\n #docKey;\n\n /** @type {string} */\n #selector;\n\n /** @type {HTMLStyleElement} */\n #styleElement;\n\n /** @type {number} */\n #version;\n\n /**\n *\n * @param {object} opts - Options.\n *\n * @param {string} opts.docKey - Required key providing a link to a specific style sheet element.\n *\n * @param {string} [opts.selector=:root] - Selector element.\n *\n * @param {Document} [opts.document] - Target document to load styles into.\n *\n * @param {number} [opts.version] - An integer representing the version / level of styles being managed.\n *\n */\n constructor({ docKey, selector = ':root', document = globalThis.document, version } = {})\n {\n if (typeof docKey !== 'string') { throw new TypeError(`StyleManager error: 'docKey' is not a string.`); }\n\n // TODO: Verify 'document' type from Popout FVTT module. For some reason the popout document trips this\n // unintentionally.\n // if (!(document instanceof Document))\n // {\n // throw new TypeError(`StyleManager error: 'document' is not an instance of Document.`);\n // }\n\n if (typeof selector !== 'string') { throw new TypeError(`StyleManager error: 'selector' is not a string.`); }\n\n if (version !== void 0 && !Number.isSafeInteger(version) && version < 1)\n {\n throw new TypeError(`StyleManager error: 'version' is defined and is not a positive integer >= 1.`);\n }\n\n this.#selector = selector;\n this.#docKey = docKey;\n this.#version = version;\n\n if (document[this.#docKey] === void 0)\n {\n this.#styleElement = document.createElement('style');\n\n document.head.append(this.#styleElement);\n\n // Set initial style manager version if any supplied.\n this.#styleElement._STYLE_MANAGER_VERSION = version;\n\n this.#styleElement.sheet.insertRule(`${selector} {}`, 0);\n\n this.#cssRule = this.#styleElement.sheet.cssRules[0];\n\n document[docKey] = this.#styleElement;\n }\n else\n {\n this.#styleElement = document[docKey];\n this.#cssRule = this.#styleElement.sheet.cssRules[0];\n\n if (version)\n {\n const existingVersion = this.#styleElement._STYLE_MANAGER_VERSION ?? 0;\n\n // Remove all existing CSS rules / text if version is greater than existing version.\n if (version > existingVersion)\n {\n this.#cssRule.style.cssText = '';\n }\n }\n }\n }\n\n /**\n * @returns {string} Provides an accessor to get the `cssText` for the style sheet.\n */\n get cssText()\n {\n return this.#cssRule.style.cssText;\n }\n\n /**\n * @returns {number} Returns the version of this instance.\n */\n get version()\n {\n return this.#version;\n }\n\n /**\n * Provides a copy constructor to duplicate an existing StyleManager instance into a new document.\n *\n * Note: This is used to support the `PopOut` module.\n *\n * @param {Document} [document] Target browser document to clone into.\n *\n * @returns {StyleManager} New style manager instance.\n */\n clone(document = globalThis.document)\n {\n const newStyleManager = new StyleManager({\n selector: this.#selector,\n docKey: this.#docKey,\n document,\n version: this.#version\n });\n\n newStyleManager.#cssRule.style.cssText = this.#cssRule.style.cssText;\n\n return newStyleManager;\n }\n\n get()\n {\n const cssText = this.#cssRule.style.cssText;\n\n const result = {};\n\n if (cssText !== '')\n {\n for (const entry of cssText.split(';'))\n {\n if (entry !== '')\n {\n const values = entry.split(':');\n result[values[0].trim()] = values[1];\n }\n }\n }\n\n return result;\n }\n\n /**\n * Gets a particular CSS variable.\n *\n * @param {string} key - CSS variable property key.\n *\n * @returns {string} Returns CSS variable value.\n */\n getProperty(key)\n {\n if (typeof key !== 'string') { throw new TypeError(`StyleManager error: 'key' is not a string.`); }\n\n return this.#cssRule.style.getPropertyValue(key);\n }\n\n /**\n * Set rules by property / value; useful for CSS variables.\n *\n * @param {Object<string, string>} rules - An object with property / value string pairs to load.\n *\n * @param {boolean} [overwrite=true] - When true overwrites any existing values.\n */\n setProperties(rules, overwrite = true)\n {\n if (!isObject(rules)) { throw new TypeError(`StyleManager error: 'rules' is not an object.`); }\n\n if (typeof overwrite !== 'boolean') { throw new TypeError(`StyleManager error: 'overwrite' is not a boolean.`); }\n\n if (overwrite)\n {\n for (const [key, value] of Object.entries(rules))\n {\n this.#cssRule.style.setProperty(key, value);\n }\n }\n else\n {\n // Only set property keys for entries that don't have an existing rule set.\n for (const [key, value] of Object.entries(rules))\n {\n if (this.#cssRule.style.getPropertyValue(key) === '')\n {\n this.#cssRule.style.setProperty(key, value);\n }\n }\n }\n }\n\n /**\n * Sets a particular property.\n *\n * @param {string} key - CSS variable property key.\n *\n * @param {string} value - CSS variable value.\n *\n * @param {boolean} [overwrite=true] - Overwrite any existing value.\n */\n setProperty(key, value, overwrite = true)\n {\n if (typeof key !== 'string') { throw new TypeError(`StyleManager error: 'key' is not a string.`); }\n\n if (typeof value !== 'string') { throw new TypeError(`StyleManager error: 'value' is not a string.`); }\n\n if (typeof overwrite !== 'boolean') { throw new TypeError(`StyleManager error: 'overwrite' is not a boolean.`); }\n\n if (overwrite)\n {\n this.#cssRule.style.setProperty(key, value);\n }\n else\n {\n if (this.#cssRule.style.getPropertyValue(key) === '')\n {\n this.#cssRule.style.setProperty(key, value);\n }\n }\n }\n\n /**\n * Removes the property keys specified. If `keys` is an iterable list then all property keys in the list are removed.\n *\n * @param {Iterable<string>} keys - The property keys to remove.\n */\n removeProperties(keys)\n {\n if (!isIterable(keys)) { throw new TypeError(`StyleManager error: 'keys' is not an iterable list.`); }\n\n for (const key of keys)\n {\n if (typeof key === 'string') { this.#cssRule.style.removeProperty(key); }\n }\n }\n\n /**\n * Removes a particular CSS variable.\n *\n * @param {string} key - CSS variable property key.\n *\n * @returns {string} CSS variable value when removed.\n */\n removeProperty(key)\n {\n if (typeof key !== 'string') { throw new TypeError(`StyleManager error: 'key' is not a string.`); }\n\n return this.#cssRule.style.removeProperty(key);\n }\n}\n\nconst s_REGEX = /(\\d+)\\s*px/;\n\n/**\n * Parses a pixel string / computed styles. Ex. `100px` returns `100`.\n *\n * @param {string} value - Value to parse.\n *\n * @returns {number|undefined} The integer component of a pixel string.\n */\nfunction styleParsePixels(value)\n{\n if (typeof value !== 'string') { return void 0; }\n\n const isPixels = s_REGEX.test(value);\n const number = parseInt(value);\n\n return isPixels && Number.isFinite(number) ? number : void 0;\n}\n\n/**\n * Defines the application shell contract. If Svelte components export getter / setters for the following properties\n * then that component is considered an application shell.\n *\n * @type {string[]}\n */\nconst applicationShellContract = ['elementRoot'];\n\nObject.freeze(applicationShellContract);\n\n/**\n * Provides a method to determine if the passed in object / Svelte component follows the application shell contract.\n * This involves ensuring that the accessors defined in `applicationShellContract`.\n *\n * Note: A caveat is that when using Vite in a developer build components are wrapped in a proxy / ProxyComponent that\n * defines instance accessors versus on the prototype, so the check below ensures that all accessors in the contract are\n * either available on the prototype or directly on the instance.\n *\n * @param {*} component - Object / component to test.\n *\n * @returns {boolean} Whether the component is a ApplicationShell or TJSApplicationShell.\n */\nfunction isApplicationShell(component)\n{\n if (component === null || component === void 0) { return false; }\n\n let compHasContract = true;\n let protoHasContract = true;\n\n // Check for accessors on the instance.\n for (const accessor of applicationShellContract)\n {\n const descriptor = Object.getOwnPropertyDescriptor(component, accessor);\n if (descriptor === void 0 || descriptor.get === void 0 || descriptor.set === void 0) { compHasContract = false; }\n }\n\n // Get the prototype which is the parent SvelteComponent that has any getter / setters.\n const prototype = Object.getPrototypeOf(component);\n\n // Verify the application shell contract. If the accessors (getters / setters) are defined for\n // `applicationShellContract`.\n for (const accessor of applicationShellContract)\n {\n const descriptor = Object.getOwnPropertyDescriptor(prototype, accessor);\n if (descriptor === void 0 || descriptor.get === void 0 || descriptor.set === void 0) { protoHasContract = false; }\n }\n\n return compHasContract || protoHasContract;\n}\n\n/**\n * Provides basic duck typing to determine if the provided object is a HMR ProxyComponent instance or class.\n *\n * @param {*} comp - Data to check as a HMR proxy component.\n *\n * @returns {boolean} Whether basic duck typing succeeds.\n */\nfunction isHMRProxy(comp)\n{\n const instanceName = comp?.constructor?.name;\n if (typeof instanceName === 'string' && (instanceName.startsWith('Proxy<') || instanceName === 'ProxyComponent'))\n {\n return true;\n }\n\n const prototypeName = comp?.prototype?.constructor?.name;\n return typeof prototypeName === 'string' && (prototypeName.startsWith('Proxy<') ||\n prototypeName === 'ProxyComponent');\n}\n\n/**\n * Provides basic duck typing to determine if the provided function is a constructor function for a Svelte component.\n *\n * @param {*} comp - Data to check as a Svelte component.\n *\n * @returns {boolean} Whether basic duck typing succeeds.\n */\nfunction isSvelteComponent(comp)\n{\n if (comp === null || comp === void 0 || typeof comp !== 'function') { return false; }\n\n // When using Vite in a developer build the SvelteComponent is wrapped in a ProxyComponent class.\n // This class doesn't define methods on the prototype, so we must check if the constructor name\n // starts with `Proxy<` as it provides the wrapped component as `Proxy<_wrapped component name_>`.\n const prototypeName = comp?.prototype?.constructor?.name;\n if (typeof prototypeName === 'string' && (prototypeName.startsWith('Proxy<') || prototypeName === 'ProxyComponent'))\n {\n return true;\n }\n\n return typeof window !== void 0 ?\n typeof comp.prototype.$destroy === 'function' && typeof comp.prototype.$on === 'function' : // client-side\n typeof comp.render === 'function'; // server-side\n}\n\n/**\n * Runs outro transition then destroys Svelte component.\n *\n * Workaround for https://github.com/sveltejs/svelte/issues/4056\n *\n * @param {*} instance - A Svelte component.\n */\nasync function outroAndDestroy(instance)\n{\n return new Promise((resolve) =>\n {\n if (instance.$$.fragment && instance.$$.fragment.o)\n {\n group_outros();\n transition_out(instance.$$.fragment, 0, 0, () =>\n {\n instance.$destroy();\n resolve();\n });\n check_outros();\n }\n else\n {\n instance.$destroy();\n resolve();\n }\n });\n}\n\n/**\n * Parses a TyphonJS Svelte config object ensuring that classes specified are Svelte components and props are set\n * correctly.\n *\n * @param {object} config - Svelte config object.\n *\n * @param {*} [thisArg] - `This` reference to set for invoking any props function.\n *\n * @returns {object} The processed Svelte config object.\n */\nfunction parseSvelteConfig(config, thisArg = void 0)\n{\n if (typeof config !== 'object')\n {\n throw new TypeError(`parseSvelteConfig - 'config' is not an object:\\n${JSON.stringify(config)}.`);\n }\n\n if (!isSvelteComponent(config.class))\n {\n throw new TypeError(\n `parseSvelteConfig - 'class' is not a Svelte component constructor for config:\\n${JSON.stringify(config)}.`);\n }\n\n if (config.hydrate !== void 0 && typeof config.hydrate !== 'boolean')\n {\n throw new TypeError(\n `parseSvelteConfig - 'hydrate' is not a boolean for config:\\n${JSON.stringify(config)}.`);\n }\n\n if (config.intro !== void 0 && typeof config.intro !== 'boolean')\n {\n throw new TypeError(\n `parseSvelteConfig - 'intro' is not a boolean for config:\\n${JSON.stringify(config)}.`);\n }\n\n if (config.target !== void 0 && typeof config.target !== 'string' && !(config.target instanceof HTMLElement) &&\n !(config.target instanceof ShadowRoot) && !(config.target instanceof DocumentFragment))\n {\n throw new TypeError(\n `parseSvelteConfig - 'target' is not a string, HTMLElement, ShadowRoot, or DocumentFragment for config:\\n${\n JSON.stringify(config)}.`);\n }\n\n if (config.anchor !== void 0 && typeof config.anchor !== 'string' && !(config.anchor instanceof HTMLElement) &&\n !(config.anchor instanceof ShadowRoot) && !(config.anchor instanceof DocumentFragment))\n {\n throw new TypeError(\n `parseSvelteConfig - 'anchor' is not a string, HTMLElement, ShadowRoot, or DocumentFragment for config:\\n${\n JSON.stringify(config)}.`);\n }\n\n if (config.context !== void 0 && typeof config.context !== 'function' && !(config.context instanceof Map) &&\n typeof config.context !== 'object')\n {\n throw new TypeError(\n `parseSvelteConfig - 'context' is not a Map, function or object for config:\\n${JSON.stringify(config)}.`);\n }\n\n // Validate extra TyphonJS options --------------------------------------------------------------------------------\n\n // `selectorTarget` optionally stores a target element found in main element.\n if (config.selectorTarget !== void 0 && typeof config.selectorTarget !== 'string')\n {\n throw new TypeError(\n `parseSvelteConfig - 'selectorTarget' is not a string for config:\\n${JSON.stringify(config)}.`);\n }\n\n // `options` stores `injectApp`, `injectEventbus`, and `selectorElement`.\n if (config.options !== void 0 && typeof config.options !== 'object')\n {\n throw new TypeError(\n `parseSvelteConfig - 'options' is not an object for config:\\n${JSON.stringify(config)}.`);\n }\n\n // Validate TyphonJS standard options.\n if (config.options !== void 0)\n {\n if (config.options.injectApp !== void 0 && typeof config.options.injectApp !== 'boolean')\n {\n throw new TypeError(\n `parseSvelteConfig - 'options.injectApp' is not a boolean for config:\\n${JSON.stringify(config)}.`);\n }\n\n if (config.options.injectEventbus !== void 0 && typeof config.options.injectEventbus !== 'boolean')\n {\n throw new TypeError(\n `parseSvelteConfig - 'options.injectEventbus' is not a boolean for config:\\n${JSON.stringify(config)}.`);\n }\n\n // `selectorElement` optionally stores a main element selector to be found in a HTMLElement target.\n if (config.options.selectorElement !== void 0 && typeof config.options.selectorElement !== 'string')\n {\n throw new TypeError(\n `parseSvelteConfig - 'selectorElement' is not a string for config:\\n${JSON.stringify(config)}.`);\n }\n }\n\n const svelteConfig = { ...config };\n\n // Delete extra Svelte options.\n delete svelteConfig.options;\n\n let externalContext = {};\n\n // If a context callback function is provided then invoke it with `this` being the Foundry app.\n // If an object is returned it adds the entries to external context.\n if (typeof svelteConfig.context === 'function')\n {\n const contextFunc = svelteConfig.context;\n delete svelteConfig.context;\n\n const result = contextFunc.call(thisArg);\n if (isObject(result))\n {\n externalContext = { ...result };\n }\n else\n {\n throw new Error(`parseSvelteConfig - 'context' is a function that did not return an object for config:\\n${\n JSON.stringify(config)}`);\n }\n }\n else if (svelteConfig.context instanceof Map)\n {\n externalContext = Object.fromEntries(svelteConfig.context);\n delete svelteConfig.context;\n }\n else if (isObject(svelteConfig.context))\n {\n externalContext = svelteConfig.context;\n delete svelteConfig.context;\n }\n\n // If a props is a function then invoke it with `this` being the Foundry app.\n // If an object is returned set it as the props.\n svelteConfig.props = s_PROCESS_PROPS(svelteConfig.props, thisArg, config);\n\n // Process children components attaching to external context.\n if (Array.isArray(svelteConfig.children))\n {\n const children = [];\n\n for (let cntr = 0; cntr < svelteConfig.children.length; cntr++)\n {\n const child = svelteConfig.children[cntr];\n\n if (!isSvelteComponent(child.class))\n {\n throw new Error(`parseSvelteConfig - 'class' is not a Svelte component for child[${cntr}] for config:\\n${\n JSON.stringify(config)}`);\n }\n\n child.props = s_PROCESS_PROPS(child.props, thisArg, config);\n\n children.push(child);\n }\n\n if (children.length > 0)\n {\n externalContext.children = children;\n }\n\n delete svelteConfig.children;\n }\n else if (isObject(svelteConfig.children))\n {\n if (!isSvelteComponent(svelteConfig.children.class))\n {\n throw new Error(`parseSvelteConfig - 'class' is not a Svelte component for children object for config:\\n${\n JSON.stringify(config)}`);\n }\n\n svelteConfig.children.props = s_PROCESS_PROPS(svelteConfig.children.props, thisArg, config);\n\n externalContext.children = [svelteConfig.children];\n delete svelteConfig.children;\n }\n\n if (!(svelteConfig.context instanceof Map))\n {\n svelteConfig.context = new Map();\n }\n\n svelteConfig.context.set('#external', externalContext);\n\n return svelteConfig;\n}\n\n/**\n * Processes Svelte props. Potentially props can be a function to invoke with `thisArg`.\n *\n * @param {object|Function} props - Svelte props.\n *\n * @param {*} thisArg - `This` reference to set for invoking any props function.\n *\n * @param {object} config - Svelte config\n *\n * @returns {object|void} Svelte props.\n */\nfunction s_PROCESS_PROPS(props, thisArg, config)\n{\n // If a props is a function then invoke it with `this` being the Foundry app.\n // If an object is returned set it as the props.\n if (typeof props === 'function')\n {\n const result = props.call(thisArg);\n if (isObject(result))\n {\n return result;\n }\n else\n {\n throw new Error(`parseSvelteConfig - 'props' is a function that did not return an object for config:\\n${\n JSON.stringify(config)}`);\n }\n }\n else if (isObject(props))\n {\n return props;\n }\n else if (props !== void 0)\n {\n throw new Error(\n `parseSvelteConfig - 'props' is not a function or an object for config:\\n${JSON.stringify(config)}`);\n }\n\n return {};\n}\n\n/**\n * Wraps a callback in a debounced timeout.\n *\n * Delay execution of the callback function until the function has not been called for the given delay in milliseconds.\n *\n * @param {Function} callback - A function to execute once the debounced threshold has been passed.\n *\n * @param {number} delay - An amount of time in milliseconds to delay.\n *\n * @returns {Function} A wrapped function that can be called to debounce execution.\n */\nfunction debounce(callback, delay)\n{\n let timeoutId;\n\n return function(...args)\n {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => { callback.apply(this, args); }, delay);\n };\n}\n\n/**\n * Provides a method to determine if the passed in Svelte component has a getter accessor.\n *\n * @param {*} object - An object.\n *\n * @param {string} accessor - Accessor to test.\n *\n * @returns {boolean} Whether the component has the getter for accessor.\n */\nfunction hasGetter(object, accessor)\n{\n if (object === null || object === void 0) { return false; }\n\n // Check for instance accessor.\n const iDescriptor = Object.getOwnPropertyDescriptor(object, accessor);\n if (iDescriptor !== void 0 && iDescriptor.get !== void 0) { return true; }\n\n // Walk parent prototype chain. Check for descriptor at each prototype level.\n for (let o = Object.getPrototypeOf(object); o; o = Object.getPrototypeOf(o))\n {\n const descriptor = Object.getOwnPropertyDescriptor(o, accessor);\n if (descriptor !== void 0 && descriptor.get !== void 0) { return true; }\n }\n\n return false;\n}\n\n/**\n * Provides a method to determine if the passed in Svelte component has a getter & setter accessor.\n *\n * @param {*} object - An object.\n *\n * @param {string} accessor - Accessor to test.\n *\n * @returns {boolean} Whether the component has the getter and setter for accessor.\n */\nfunction hasAccessor(object, accessor)\n{\n if (object === null || object === void 0) { return false; }\n\n // Check for instance accessor.\n const iDescriptor = Object.getOwnPropertyDescriptor(object, accessor);\n if (iDescriptor !== void 0 && iDescriptor.get !== void 0 && iDescriptor.set !== void 0) { return true; }\n\n // Walk parent prototype chain. Check for descriptor at each prototype level.\n for (let o = Object.getPrototypeOf(object); o; o = Object.getPrototypeOf(o))\n {\n const descriptor = Object.getOwnPropertyDescriptor(o, accessor);\n if (descriptor !== void 0 && descriptor.get !== void 0 && descriptor.set !== void 0) { return true; }\n }\n\n return false;\n}\n\n/**\n * Provides a method to determine if the passed in Svelte component has a setter accessor.\n *\n * @param {*} object - An object.\n *\n * @param {string} accessor - Accessor to test.\n *\n * @returns {boolean} Whether the component has the setter for accessor.\n */\nfunction hasSetter(object, accessor)\n{\n if (object === null || object === void 0) { return false; }\n\n // Check for instance accessor.\n const iDescriptor = Object.getOwnPropertyDescriptor(object, accessor);\n if (iDescriptor !== void 0 && iDescriptor.set !== void 0) { return true; }\n\n // Walk parent prototype chain. Check for descriptor at each prototype level.\n for (let o = Object.getPrototypeOf(object); o; o = Object.getPrototypeOf(o))\n {\n const descriptor = Object.getOwnPropertyDescriptor(o, accessor);\n if (descriptor !== void 0 && descriptor.set !== void 0) { return true; }\n }\n\n return false;\n}\n\n/**\n * Returns whether the target is or has the given prototype walking up the prototype chain.\n *\n * @param {*} target - Any target to test.\n *\n * @param {Function} Prototype - Prototype function / class constructor to find.\n *\n * @returns {boolean} Target matches prototype.\n */\nfunction hasPrototype(target, Prototype)\n{\n /* c8 ignore next */\n if (typeof target !== 'function') { return false; }\n\n if (target === Prototype) { return true; }\n\n // Walk parent prototype chain. Check for descriptor at each prototype level.\n for (let proto = Object.getPrototypeOf(target); proto; proto = Object.getPrototypeOf(proto))\n {\n if (proto === Prototype) { return true; }\n }\n\n return false;\n}\n\nfunction set(obj, key, val) {\n\tif (typeof val.value === 'object') val.value = klona(val.value);\n\tif (!val.enumerable || val.get || val.set || !val.configurable || !val.writable || key === '__proto__') {\n\t\tObject.defineProperty(obj, key, val);\n\t} else obj[key] = val.value;\n}\n\nfunction klona(x) {\n\tif (typeof x !== 'object') return x;\n\n\tvar i=0, k, list, tmp, str=Object.prototype.toString.call(x);\n\n\tif (str === '[object Object]') {\n\t\ttmp = Object.create(x.__proto__ || null);\n\t} else if (str === '[object Array]') {\n\t\ttmp = Array(x.length);\n\t} else if (str === '[object Set]') {\n\t\ttmp = new Set;\n\t\tx.forEach(function (val) {\n\t\t\ttmp.add(klona(val));\n\t\t});\n\t} else if (str === '[object Map]') {\n\t\ttmp = new Map;\n\t\tx.forEach(function (val, key) {\n\t\t\ttmp.set(klona(key), klona(val));\n\t\t});\n\t} else if (str === '[object Date]') {\n\t\ttmp = new Date(+x);\n\t} else if (str === '[object RegExp]') {\n\t\ttmp = new RegExp(x.source, x.flags);\n\t} else if (str === '[object DataView]') {\n\t\ttmp = new x.constructor( klona(x.buffer) );\n\t} else if (str === '[object ArrayBuffer]') {\n\t\ttmp = x.slice(0);\n\t} else if (str.slice(-6) === 'Array]') {\n\t\t// ArrayBuffer.isView(x)\n\t\t// ~> `new` bcuz `Buffer.slice` => ref\n\t\ttmp = new x.constructor(x);\n\t}\n\n\tif (tmp) {\n\t\tfor (list=Object.getOwnPropertySymbols(x); i < list.length; i++) {\n\t\t\tset(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i]));\n\t\t}\n\n\t\tfor (i=0, list=Object.getOwnPropertyNames(x); i < list.length; i++) {\n\t\t\tif (Object.hasOwnProperty.call(tmp, k=list[i]) && tmp[k] === x[k]) continue;\n\t\t\tset(tmp, k, Object.getOwnPropertyDescriptor(x, k));\n\t\t}\n\t}\n\n\treturn tmp || x;\n}\n\nfunction isSpace(character) {\n return character == \" \" || character == \"\\n\" || character == \"\\r\" || character == \"\\t\";\n}\nfunction isQuote(character) {\n return character == '\"' || character == \"'\";\n}\nconst TAG_START = \"<\";\nconst TAG_END = \">\";\nconst ENCODED_TAG_START = \"<\";\nconst ENCODED_TAG_END = \">\";\nclass InPlaintextState {\n constructor(options) {\n this.options = options;\n }\n consume(character, transition) {\n if (character == TAG_START) {\n transition(new InTagNameState(this.options));\n return \"\";\n }\n else if (character == TAG_END && this.options.encodePlaintextTagDelimiters) {\n return ENCODED_TAG_END;\n }\n return character;\n }\n}\nclass InTagNameState {\n constructor(options) {\n this.options = options;\n this.nameBuffer = \"\";\n this.isClosingTag = false;\n }\n consume(character, transition) {\n if (this.nameBuffer.length == 0) {\n if (isSpace(character)) {\n transition(new InPlaintextState(this.options));\n return ((this.options.encodePlaintextTagDelimiters ? ENCODED_TAG_START : \"<\") +\n character);\n }\n if (character == \"/\") {\n this.isClosingTag = true;\n return \"\";\n }\n }\n if (isSpace(character)) {\n if (this.isNameBufferAnAllowedTag()) {\n transition(new InTagState(0 /* TagMode.Allowed */, this.options));\n return TAG_START + (this.isClosingTag ? \"/\" : \"\") + this.nameBuffer + character;\n }\n else {\n transition(new InTagState(1 /* TagMode.Disallowed */, this.options));\n return this.options.tagReplacementText;\n }\n }\n if (character == TAG_START) {\n this.nameBuffer += ENCODED_TAG_START;\n return \"\";\n }\n if (character == TAG_END) {\n transition(new InPlaintextState(this.options));\n if (this.isNameBufferAnAllowedTag()) {\n return TAG_START + (this.isClosingTag ? \"/\" : \"\") + this.nameBuffer + character;\n }\n else {\n return this.options.tagReplacementText;\n }\n }\n if (character == \"-\" && this.nameBuffer == \"!-\") {\n transition(new InCommentState(this.options));\n return \"\";\n }\n this.nameBuffer += character;\n return \"\";\n }\n isNameBufferAnAllowedTag() {\n const tagName = this.nameBuffer.toLowerCase();\n if (this.options.allowedTags) {\n return this.options.allowedTags.has(tagName);\n }\n else if (this.options.disallowedTags) {\n return !this.options.disallowedTags.has(tagName);\n }\n else {\n return false;\n }\n }\n}\nclass InTagState {\n constructor(mode, options) {\n this.mode = mode;\n this.options = options;\n }\n consume(character, transition) {\n if (character == TAG_END) {\n transition(new InPlaintextState(this.options));\n }\n else if (isQuote(character)) {\n transition(new InQuotedStringInTagState(this.mode, character, this.options));\n }\n if (this.mode == 1 /* TagMode.Disallowed */) {\n return \"\";\n }\n if (character == TAG_START) {\n return ENCODED_TAG_START;\n }\n else {\n return character;\n }\n }\n}\nclass InQuotedStringInTagState {\n constructor(mode, quoteCharacter, options) {\n this.mode = mode;\n this.quoteCharacter = quoteCharacter;\n this.options = options;\n }\n consume(character, transition) {\n if (character == this.quoteCharacter) {\n transition(new InTagState(this.mode, this.options));\n }\n if (this.mode == 1 /* TagMode.Disallowed */) {\n return \"\";\n }\n if (character == TAG_START) {\n return ENCODED_TAG_START;\n }\n else if (character == TAG_END) {\n return ENCODED_TAG_END;\n }\n else {\n return character;\n }\n }\n}\nclass InCommentState {\n constructor(options) {\n this.options = options;\n this.consecutiveHyphens = 0;\n }\n consume(character, transition) {\n if (character == \">\" && this.consecutiveHyphens >= 2) {\n transition(new InPlaintextState(this.options));\n }\n else if (character == \"-\") {\n this.consecutiveHyphens++;\n }\n else {\n this.consecutiveHyphens = 0;\n }\n return \"\";\n }\n}\n\nconst DefaultStateMachineOptions = {\n tagReplacementText: \"\",\n encodePlaintextTagDelimiters: true,\n};\nclass StateMachine {\n constructor(partialOptions = {}) {\n this.state = new InPlaintextState(Object.assign(Object.assign({}, DefaultStateMachineOptions), partialOptions));\n this.transitionFunction = ((next) => {\n this.state = next;\n }).bind(this);\n }\n consume(text) {\n let outputBuffer = \"\";\n for (const character of text) {\n outputBuffer += this.state.consume(character, this.transitionFunction);\n }\n return outputBuffer;\n }\n}\nfunction striptags(text, options = {}) {\n return new StateMachine(options).consume(text);\n}\n\n/**\n * Attempts to create a Foundry UUID from standard drop data. This may not work for all systems.\n *\n * @param {object} data - Drop transfer data.\n *\n * @param {ParseDataTransferOptions} opts - Optional parameters.\n *\n * @returns {string|undefined} Foundry UUID for drop data.\n */\nfunction getUUIDFromDataTransfer(data, { actor = true, compendium = true, world = true, types = void 0 } = {})\n{\n if (typeof data !== 'object') { return void 0; }\n if (Array.isArray(types) && !types.includes(data.type)) { return void 0; }\n\n let uuid = void 0;\n\n if (typeof data.uuid === 'string') // v10 and above provides a full UUID.\n {\n const isCompendium = data.uuid.startsWith('Compendium');\n\n if (isCompendium && compendium)\n {\n uuid = data.uuid;\n }\n else if (world)\n {\n uuid = data.uuid;\n }\n }\n else // v9 and below parsing.\n {\n if (actor && world && data.actorId && data.type)\n {\n uuid = `Actor.${data.actorId}.${data.type}.${data.data._id}`;\n }\n else if (typeof data.id === 'string') // v9 and below uses `id`\n {\n if (compendium && typeof data.pack === 'string')\n {\n uuid = `Compendium.${data.pack}.${data.id}`;\n }\n else if (world)\n {\n uuid = `${data.type}.${data.id}`;\n }\n }\n }\n\n return uuid;\n}\n\nexport { A11yHelper, ClipboardAccess, ManagedPromise, StyleManager, debounce, deepMerge, getStackingContext, getUUIDFromDataTransfer, hasAccessor, hasGetter, hasPrototype, hasSetter, hashCode, isApplicationShell, isHMRProxy, isIterable, isIterableAsync, isObject, isPlainObject, isSvelteComponent, klona, normalizeString, outroAndDestroy, parseSvelteConfig, safeAccess, safeSet, striptags, styleParsePixels, uuidv4 };\n//# sourceMappingURL=index.js.map\n","import { noop, safe_not_equal, subscribe, run_all, is_function } from '../internal/index.mjs';\nexport { get_store_value as get } from '../internal/index.mjs';\n\nconst subscriber_queue = [];\n/**\n * Creates a `Readable` store that allows reading by subscription.\n * @param value initial value\n * @param {StartStopNotifier}start start and stop notifications for subscriptions\n */\nfunction readable(value, start) {\n return {\n subscribe: writable(value, start).subscribe\n };\n}\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n * @param {*=}value initial value\n * @param {StartStopNotifier=}start start and stop notifications for subscriptions\n */\nfunction writable(value, start = noop) {\n let stop;\n const subscribers = new Set();\n function set(new_value) {\n if (safe_not_equal(value, new_value)) {\n value = new_value;\n if (stop) { // store is ready\n const run_queue = !subscriber_queue.length;\n for (const subscriber of subscribers) {\n subscriber[1]();\n subscriber_queue.push(subscriber, value);\n }\n if (run_queue) {\n for (let i = 0; i < subscriber_queue.length; i += 2) {\n subscriber_queue[i][0](subscriber_queue[i + 1]);\n }\n subscriber_queue.length = 0;\n }\n }\n }\n }\n function update(fn) {\n set(fn(value));\n }\n function subscribe(run, invalidate = noop) {\n const subscriber = [run, invalidate];\n subscribers.add(subscriber);\n if (subscribers.size === 1) {\n stop = start(set) || noop;\n }\n run(value);\n return () => {\n subscribers.delete(subscriber);\n if (subscribers.size === 0) {\n stop();\n stop = null;\n }\n };\n }\n return { set, update, subscribe };\n}\nfunction derived(stores, fn, initial_value) {\n const single = !Array.isArray(stores);\n const stores_array = single\n ? [stores]\n : stores;\n const auto = fn.length < 2;\n return readable(initial_value, (set) => {\n let inited = false;\n const values = [];\n let pending = 0;\n let cleanup = noop;\n const sync = () => {\n if (pending) {\n return;\n }\n cleanup();\n const result = fn(single ? values[0] : values, set);\n if (auto) {\n set(result);\n }\n else {\n cleanup = is_function(result) ? result : noop;\n }\n };\n const unsubscribers = stores_array.map((store, i) => subscribe(store, (value) => {\n values[i] = value;\n pending &= ~(1 << i);\n if (inited) {\n sync();\n }\n }, () => {\n pending |= (1 << i);\n }));\n inited = true;\n sync();\n return function stop() {\n run_all(unsubscribers);\n cleanup();\n };\n });\n}\n\nexport { derived, readable, writable };\n","import { isIterable, uuidv4, isPlainObject, getUUIDFromDataTransfer, isObject, hasPrototype } from '@typhonjs-fvtt/runtime/svelte/util';\nimport { writable as writable$2, derived, get } from 'svelte/store';\nimport { noop, run_all, is_function } from 'svelte/internal';\n\nclass DynReducerUtils {\n /**\n * Checks for array equality between two arrays of numbers.\n *\n * @param a - Array A\n *\n * @param b - Array B\n *\n * @returns Arrays are equal.\n */\n static arrayEquals(a, b) {\n if (a === b) {\n return true;\n }\n if (a === null || b === null) {\n return false;\n }\n /* c8 ignore next */\n if (a.length !== b.length) {\n return false;\n }\n for (let cntr = a.length; --cntr >= 0;) {\n /* c8 ignore next */\n if (a[cntr] !== b[cntr]) {\n return false;\n }\n }\n return true;\n }\n /**\n * Provides a solid string hashing algorithm.\n *\n * Sourced from: https://stackoverflow.com/a/52171480\n *\n * @param str - String to hash.\n *\n * @param seed - A seed value altering the hash.\n *\n * @returns Hash code.\n */\n static hashString(str, seed = 0) {\n let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\n for (let ch, i = 0; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n }\n /**\n * Converts an unknown value for hashing purposes in {@link AdapterIndexer.calcHashUpdate}.\n *\n * Currently objects / Map w/ object keys is not supported. Potentially can include `object-hash` to handle this\n * case, but it is not common to use objects as keys in Maps.\n *\n * @param value - An unknown value to convert to a number.\n */\n static hashUnknown(value) {\n if (value === null || value === void 0) {\n return 0;\n }\n let result = 0;\n switch (typeof value) {\n case 'boolean':\n result = value ? 1 : 0;\n break;\n case 'bigint':\n result = Number(BigInt.asIntN(64, value));\n break;\n case 'function':\n result = this.hashString(value.name);\n break;\n case 'number':\n result = Number.isFinite(value) ? value : 0;\n break;\n case 'object':\n // TODO: consider hashing an object IE `object-hash` and convert to number.\n break;\n case 'string':\n result = this.hashString(value);\n break;\n case 'symbol':\n result = this.hashString(Symbol.keyFor(value));\n break;\n }\n return result;\n }\n /**\n * @param target -\n *\n * @param Prototype -\n *\n * @returns target constructor function has Prototype.\n */\n static hasPrototype(target, Prototype) {\n /* c8 ignore next */\n if (typeof target !== 'function') {\n return false;\n }\n if (target === Prototype) {\n return true;\n }\n // Walk parent prototype chain. Check for descriptor at each prototype level.\n for (let proto = Object.getPrototypeOf(target); proto; proto = Object.getPrototypeOf(proto)) {\n if (proto === Prototype) {\n return true;\n }\n }\n return false;\n }\n /**\n * Provides a utility method to determine if the given data is iterable / implements iterator protocol.\n *\n * @param data - Data to verify as iterable.\n *\n * @returns Is data iterable.\n */\n static isIterable(data) {\n return data !== null && data !== void 0 && typeof data === 'object' &&\n typeof data[Symbol.iterator] === 'function';\n }\n}\n\n/**\n * Provides the `derived` API for all dynamic reducers.\n */\nclass AdapterDerived {\n #hostData;\n #DerivedReducerCtor;\n #parentIndex;\n #derived = new Map();\n #destroyed = false;\n /**\n * @param hostData - Hosted data structure.\n *\n * @param parentIndex - Any associated parent index API.\n *\n * @param DerivedReducerCtor - The default derived reducer constructor function.\n */\n constructor(hostData, parentIndex, DerivedReducerCtor) {\n this.#hostData = hostData;\n this.#parentIndex = parentIndex;\n this.#DerivedReducerCtor = DerivedReducerCtor;\n Object.freeze(this);\n }\n /**\n * Creates a new derived reducer.\n *\n * @param options - Options defining the new derived reducer.\n *\n * @returns Newly created derived reducer.\n */\n create(options) {\n if (this.#destroyed) {\n throw Error(`AdapterDerived.create error: this instance has been destroyed.`);\n }\n let name;\n let rest = {};\n let ctor;\n const DerivedReducerCtor = this.#DerivedReducerCtor;\n if (typeof options === 'string') {\n name = options;\n ctor = DerivedReducerCtor;\n }\n else if (typeof options === 'function' && DynReducerUtils.hasPrototype(options, DerivedReducerCtor)) {\n ctor = options;\n }\n else if (typeof options === 'object' && options !== null) {\n ({ name, ctor = DerivedReducerCtor, ...rest } = options);\n }\n else {\n throw new TypeError(`AdapterDerived.create error: 'options' does not conform to allowed parameters.`);\n }\n if (!DynReducerUtils.hasPrototype(ctor, DerivedReducerCtor)) {\n throw new TypeError(`AdapterDerived.create error: 'ctor' is not a '${DerivedReducerCtor?.name}'.`);\n }\n name = name ?? ctor?.name;\n if (typeof name !== 'string') {\n throw new TypeError(`AdapterDerived.create error: 'name' is not a string.`);\n }\n const derivedReducer = new ctor(this.#hostData, this.#parentIndex, rest);\n this.#derived.set(name, derivedReducer);\n return derivedReducer;\n }\n /**\n * Removes all derived reducers and associated subscriptions.\n */\n clear() {\n if (this.#destroyed) {\n return;\n }\n for (const reducer of this.#derived.values()) {\n reducer.destroy();\n }\n this.#derived.clear();\n }\n /**\n * Deletes and destroys a derived reducer by name.\n *\n * @param name - Name of the derived reducer.\n */\n delete(name) {\n if (this.#destroyed) {\n throw Error(`AdapterDerived.delete error: this instance has been destroyed.`);\n }\n const reducer = this.#derived.get(name);\n if (reducer) {\n reducer.destroy();\n }\n return this.#derived.delete(name);\n }\n /**\n * Removes all derived reducers, subscriptions, and cleans up all resources.\n */\n destroy() {\n if (this.#destroyed) {\n return;\n }\n this.clear();\n this.#hostData = [null];\n this.#parentIndex = null;\n this.#destroyed = true;\n }\n /**\n * Returns an existing derived reducer.\n *\n * @param name - Name of derived reducer.\n */\n get(name) {\n if (this.#destroyed) {\n throw Error(`AdapterDerived.get error: this instance has been destroyed.`);\n }\n return this.#derived.get(name);\n }\n /**\n * Updates all managed derived reducer indexes.\n *\n * @param [force] - Force an update to subscribers.\n */\n update(force = false) {\n if (this.#destroyed) {\n return;\n }\n for (const reducer of this.#derived.values()) {\n reducer.index.update(force);\n }\n }\n}\n\n/**\n * Provides the storage and sequencing of managed filters. Each filter added may be a bespoke function or a\n * {@link DataFilter} object containing an `id`, `filter`, and `weight` attributes; `filter` is the only required\n * attribute.\n *\n * The `id` attribute can be anything that creates a unique ID for the filter; recommended strings or numbers. This\n * allows filters to be removed by ID easily.\n *\n * The `weight` attribute is a number between 0 and 1 inclusive that allows filters to be added in a\n * predictable order which is especially handy if they are manipulated at runtime. A lower weighted filter always runs\n * before a higher weighted filter. For speed and efficiency always set the heavier / more inclusive filter with a\n * lower weight; an example of this is a keyword / name that will filter out many entries making any further filtering\n * faster. If no weight is specified the default of '1' is assigned and it is appended to the end of the filters list.\n *\n * This class forms the public API which is accessible from the `.filters` getter in the main reducer implementation.\n * ```\n * const dynArray = new DynArrayReducer([...]);\n * dynArray.filters.add(...);\n * dynArray.filters.clear();\n * dynArray.filters.length;\n * dynArray.filters.remove(...);\n * dynArray.filters.removeBy(...);\n * dynArray.filters.removeById(...);\n * ```\n */\nclass AdapterFilters {\n #filtersData;\n #indexUpdate;\n #mapUnsubscribe = new Map();\n /**\n * @param indexUpdate - update function for the indexer.\n *\n * @param filtersAdapter - Stores the filter function data.\n */\n constructor(indexUpdate, filtersAdapter) {\n this.#indexUpdate = indexUpdate;\n this.#filtersData = filtersAdapter;\n Object.freeze(this);\n }\n /**\n * @returns Returns the length of the filter data.\n */\n get length() { return this.#filtersData.filters.length; }\n /**\n * Provides an iterator for filters.\n *\n * @returns Generator / iterator of filters.\n * @yields {DataFilter<T>}\n */\n *[Symbol.iterator]() {\n if (this.#filtersData.filters.length === 0) {\n return;\n }\n for (const entry of this.#filtersData.filters) {\n yield { ...entry };\n }\n }\n /**\n * @param filters -\n */\n add(...filters) {\n /**\n * Tracks the number of filters added that have subscriber functionality.\n */\n let subscribeCount = 0;\n for (const filter of filters) {\n const filterType = typeof filter;\n if (filterType !== 'function' && (filterType !== 'object' || filter === null)) {\n throw new TypeError(`AdapterFilters error: 'filter' is not a function or object.`);\n }\n let data = void 0;\n let subscribeFn = void 0;\n if (filterType === 'function') {\n data = {\n id: void 0,\n filter,\n weight: 1\n };\n subscribeFn = filter.subscribe;\n }\n else if (filterType === 'object') {\n if ('filter' in filter) {\n if (typeof filter.filter !== 'function') {\n throw new TypeError(`AdapterFilters error: 'filter' attribute is not a function.`);\n }\n if (filter.weight !== void 0 && typeof filter.weight !== 'number' ||\n (filter.weight < 0 || filter.weight > 1)) {\n throw new TypeError(`AdapterFilters error: 'weight' attribute is not a number between '0 - 1' inclusive.`);\n }\n data = {\n id: filter.id !== void 0 ? filter.id : void 0,\n filter: filter.filter,\n weight: filter.weight || 1\n };\n subscribeFn = filter.filter.subscribe ?? filter.subscribe;\n }\n else {\n throw new TypeError(`AdapterFilters error: 'filter' attribute is not a function.`);\n }\n }\n // Find the index to insert where data.weight is less than existing values weight.\n const index = this.#filtersData.filters.findIndex((value) => {\n return data.weight < value.weight;\n });\n // If an index was found insert at that location.\n if (index >= 0) {\n this.#filtersData.filters.splice(index, 0, data);\n }\n else // push to end of filters.\n {\n this.#filtersData.filters.push(data);\n }\n if (typeof subscribeFn === 'function') {\n const unsubscribe = subscribeFn(this.#indexUpdate);\n // Ensure that unsubscribe is a function.\n if (typeof unsubscribe !== 'function') {\n throw new TypeError('AdapterFilters error: Filter has subscribe function, but no unsubscribe function is returned.');\n }\n // Ensure that the same filter is not subscribed to multiple times.\n if (this.#mapUnsubscribe.has(data.filter)) {\n throw new Error('AdapterFilters error: Filter added already has an unsubscribe function registered.');\n }\n this.#mapUnsubscribe.set(data.filter, unsubscribe);\n subscribeCount++;\n }\n }\n // Filters with subscriber functionality are assumed to immediately invoke the `subscribe` callback. If the\n // subscriber count is less than the amount of filters added then automatically trigger an index update manually.\n if (subscribeCount < filters.length) {\n this.#indexUpdate();\n }\n }\n /**\n * Clears and removes all filters.\n */\n clear() {\n this.#filtersData.filters.length = 0;\n // Unsubscribe from all filters with subscription support.\n for (const unsubscribe of this.#mapUnsubscribe.values()) {\n unsubscribe();\n }\n this.#mapUnsubscribe.clear();\n this.#indexUpdate();\n }\n /**\n * @param filters -\n */\n remove(...filters) {\n const length = this.#filtersData.filters.length;\n if (length === 0) {\n return;\n }\n for (const data of filters) {\n // Handle the case that the filter may either be a function or a filter entry / object.\n const actualFilter = typeof data === 'function' ? data : data !== null && typeof data === 'object' ?\n data.filter : void 0;\n if (!actualFilter) {\n continue;\n }\n for (let cntr = this.#filtersData.filters.length; --cntr >= 0;) {\n if (this.#filtersData.filters[cntr].filter === actualFilter) {\n this.#filtersData.filters.splice(cntr, 1);\n // Invoke any unsubscribe function for given filter then remove from tracking.\n let unsubscribe = void 0;\n if (typeof (unsubscribe = this.#mapUnsubscribe.get(actualFilter)) === 'function') {\n unsubscribe();\n this.#mapUnsubscribe.delete(actualFilter);\n }\n }\n }\n }\n // Update the index a filter was removed.\n if (length !== this.#filtersData.filters.length) {\n this.#indexUpdate();\n }\n }\n /**\n * Remove filters by the provided callback. The callback takes 3 parameters: `id`, `filter`, and `weight`.\n * Any truthy value returned will remove that filter.\n *\n * @param callback - Callback function to evaluate each filter entry.\n */\n removeBy(callback) {\n const length = this.#filtersData.filters.length;\n if (length === 0) {\n return;\n }\n if (typeof callback !== 'function') {\n throw new TypeError(`AdapterFilters error: 'callback' is not a function.`);\n }\n this.#filtersData.filters = this.#filtersData.filters.filter((data) => {\n const remove = callback.call(callback, { ...data });\n if (remove) {\n let unsubscribe;\n if (typeof (unsubscribe = this.#mapUnsubscribe.get(data.filter)) === 'function') {\n unsubscribe();\n this.#mapUnsubscribe.delete(data.filter);\n }\n }\n // Reverse remove boolean to properly filter / remove this filter.\n return !remove;\n });\n if (length !== this.#filtersData.filters.length) {\n this.#indexUpdate();\n }\n }\n /**\n * @param ids - Removes filters by ID.\n */\n removeById(...ids) {\n const length = this.#filtersData.filters.length;\n if (length === 0) {\n return;\n }\n this.#filtersData.filters = this.#filtersData.filters.filter((data) => {\n let remove = 0;\n for (const id of ids) {\n remove |= (data.id === id ? 1 : 0);\n }\n // If not keeping invoke any unsubscribe function for given filter then remove from tracking.\n if (!!remove) {\n let unsubscribe;\n if (typeof (unsubscribe = this.#mapUnsubscribe.get(data.filter)) === 'function') {\n unsubscribe();\n this.#mapUnsubscribe.delete(data.filter);\n }\n }\n return !remove; // Swap here to actually remove the item via array filter method.\n });\n if (length !== this.#filtersData.filters.length) {\n this.#indexUpdate();\n }\n }\n}\n\n/**\n * Provides construction and management of indexed data when there are parent indexes or filter / sort functions\n * applied.\n */\nclass AdapterIndexer {\n derivedAdapter;\n filtersData;\n hostData;\n hostUpdate;\n indexData;\n sortData;\n sortFn;\n destroyed = false;\n /**\n * @param hostData - Hosted data structure.\n *\n * @param hostUpdate - Host update function invoked on index updates.\n *\n * @param [parentIndexer] - Any associated parent index API.\n *\n * @returns Indexer adapter instance.\n */\n constructor(hostData, hostUpdate, parentIndexer) {\n this.hostData = hostData;\n this.hostUpdate = hostUpdate;\n this.indexData = { index: null, hash: null, reversed: false, parent: parentIndexer };\n }\n /**\n * @returns Returns whether the index is active.\n */\n get active() {\n return this.filtersData.filters.length > 0 || this.sortData.compareFn !== null ||\n this.indexData.parent?.active === true;\n }\n /**\n * @returns Returns length of reduced index.\n */\n get length() {\n return this.indexData.index ? this.indexData.index.length : 0;\n }\n /* c8 ignore start */\n /**\n * @returns Returns reversed state.\n */\n get reversed() { return this.indexData.reversed; }\n /* c8 ignore end */\n /**\n * @param reversed - New reversed state.\n */\n set reversed(reversed) { this.indexData.reversed = reversed; }\n // -------------------------------------------------------------------------------------------------------------------\n /**\n * Calculates a new hash value for the new index array if any. If the new index array is null then the hash value\n * is set to null. Set calculated new hash value to the index adapter hash value.\n *\n * After hash generation compare old and new hash values and perform an update if they are different. If they are\n * equal check for array equality between the old and new index array and perform an update if they are not equal.\n *\n * @param oldIndex - Old index array.\n *\n * @param oldHash - Old index hash value.\n *\n * @param [force=false] - When true forces an update to subscribers.\n */\n calcHashUpdate(oldIndex, oldHash, force = false) {\n // Use force if a boolean otherwise default to false.\n const actualForce = typeof force === 'boolean' ? force : /* c8 ignore next */ false;\n let newHash = null;\n const newIndex = this.indexData.index;\n if (newIndex) {\n for (let cntr = newIndex.length; --cntr >= 0;) {\n newHash ^= DynReducerUtils.hashUnknown(newIndex[cntr]) + 0x9e3779b9 + (newHash << 6) + (newHash >> 2);\n }\n }\n this.indexData.hash = newHash;\n if (actualForce || (oldHash === newHash ? !DynReducerUtils.arrayEquals(oldIndex, newIndex) : true)) {\n this.hostUpdate();\n }\n }\n /**\n * Destroys all resources.\n */\n destroy() {\n if (this.destroyed) {\n return;\n }\n this.indexData.index = null;\n this.indexData.hash = null;\n this.indexData.reversed = null;\n this.indexData.parent = null;\n this.destroyed = true;\n }\n /**\n * Store associated filter and sort data that are constructed after the indexer.\n *\n * @param filtersData - Associated AdapterFilters instance.\n *\n * @param sortData - Associated AdapterSort instance.\n *\n * @param derivedAdapter - Associated AdapterDerived instance.\n */\n initAdapters(filtersData, sortData, derivedAdapter) {\n this.filtersData = filtersData;\n this.sortData = sortData;\n this.derivedAdapter = derivedAdapter;\n this.sortFn = this.createSortFn();\n }\n}\n\n/**\n * Provides the storage and sequencing of a managed sort function. The sort function set may be a bespoke function or a\n * {@link DataSort} object containing an `compare`, and `subscribe` attributes; `compare` is the only required\n * attribute.\n *\n * Note: You can set a compare function that also has a subscribe function attached as the `subscribe` attribute.\n * If a subscribe function is provided the sort function can notify any updates that may change sort order and this\n * triggers an index update.\n *\n * This class forms the public API which is accessible from the `.sort` getter in the main reducer implementation.\n * ```\n * const dynArray = new DynArrayReducer([...]);\n * dynArray.sort.clear();\n * dynArray.sort.set(...);\n * ```\n */\nclass AdapterSort {\n #sortData;\n #indexUpdate;\n #unsubscribe;\n /**\n * @param indexUpdate - Function to update indexer.\n *\n * @param sortData - Storage for compare function.\n */\n constructor(indexUpdate, sortData) {\n this.#indexUpdate = indexUpdate;\n this.#sortData = sortData;\n Object.freeze(this);\n }\n /**\n * Clears & removes any assigned sort function and triggers an index update.\n */\n clear() {\n const oldCompareFn = this.#sortData.compareFn;\n this.#sortData.compareFn = null;\n if (typeof this.#unsubscribe === 'function') {\n this.#unsubscribe();\n this.#unsubscribe = void 0;\n }\n // Only update index if an old compare function is set.\n if (typeof oldCompareFn === 'function') {\n this.#indexUpdate();\n }\n }\n /**\n * @param data - A callback function that compares two values. Return > 0 to sort b before a;\n * < 0 to sort a before b; or 0 to keep original order of a & b.\n *\n * Note: You can set a compare function that also has a subscribe function attached as the `subscribe` attribute.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#parameters\n */\n set(data) {\n if (typeof this.#unsubscribe === 'function') {\n this.#unsubscribe();\n this.#unsubscribe = void 0;\n }\n let compareFn = void 0;\n let subscribeFn = void 0;\n switch (typeof data) {\n case 'function':\n compareFn = data;\n subscribeFn = data.subscribe;\n break;\n case 'object':\n // Early out if data is null / noop.\n if (data === null) {\n break;\n }\n if (typeof data.compare !== 'function') {\n throw new TypeError(`AdapterSort error: 'compare' attribute is not a function.`);\n }\n compareFn = data.compare;\n subscribeFn = data.compare.subscribe ?? data.subscribe;\n break;\n }\n if (typeof compareFn === 'function') {\n this.#sortData.compareFn = compareFn;\n }\n else {\n const oldCompareFn = this.#sortData.compareFn;\n this.#sortData.compareFn = null;\n // Update index if the old compare function exists.\n if (typeof oldCompareFn === 'function') {\n this.#indexUpdate();\n }\n return;\n }\n if (typeof subscribeFn === 'function') {\n this.#unsubscribe = subscribeFn(this.#indexUpdate);\n // Ensure that unsubscribe is a function.\n if (typeof this.#unsubscribe !== 'function') {\n throw new Error(`AdapterSort error: sort has 'subscribe' function, but no 'unsubscribe' function is returned.`);\n }\n }\n else {\n // A sort function with subscriber functionality are assumed to immediately invoke the `subscribe` callback.\n // Only manually update the index if there is no subscriber functionality.\n this.#indexUpdate();\n }\n }\n}\n\n/**\n * Provides the public API for accessing the index API.\n *\n * This class forms the public API which is accessible from the `.index` getter in the main reducer implementation.\n * ```\n * const dynArray = new DynArrayReducer([...]);\n * dynArray.index.active;\n * dynArray.index.hash;\n * dynArray.index.length;\n * dynArray.index.update(...);\n * ```\n */\nclass IndexerAPI {\n #indexData;\n /**\n * Provides a getter to determine if the index is active.\n */\n active;\n /**\n * Provides length of reduced / indexed elements.\n */\n length;\n /**\n * Manually invoke an update of the index.\n *\n * @param force - Force update to any subscribers.\n */\n update;\n constructor(adapterIndexer) {\n this.#indexData = adapterIndexer.indexData;\n this.update = adapterIndexer.update.bind(adapterIndexer);\n // Defines getters on the public API to get the index hash, active state, and index length.\n Object.defineProperties(this, {\n active: { get: () => adapterIndexer.active },\n length: { get: () => adapterIndexer.length }\n });\n Object.freeze(this);\n }\n /**\n * - Current hash value of the index.\n */\n get hash() {\n return this.#indexData.hash;\n }\n /**\n * Provides an iterator over the index array.\n *\n * @returns Iterator / generator\n * @yields {K}\n */\n *[Symbol.iterator]() {\n const indexData = this.#indexData;\n if (!indexData.index) {\n return;\n }\n const reversed = indexData.reversed;\n const length = indexData.index.length;\n if (reversed) {\n for (let cntr = length; --cntr >= 0;) {\n yield indexData.index[cntr];\n }\n }\n else {\n for (let cntr = 0; cntr < length; cntr++) {\n yield indexData.index[cntr];\n }\n }\n }\n}\n\n/**\n * Provides the public API for derived reducers. There are several ways to create a derived reducer from utilizing the\n * default implementation or passing in a constructor function / class for a custom derived reducer.\n *\n * This class forms the public API which is accessible from the `.derived` getter in the main reducer implementation.\n * ```\n * const dynArray = new DynArrayReducer([...]);\n * dynArray.derived.clear();\n * dynArray.derived.create(...);\n * dynArray.derived.delete(...);\n * dynArray.derived.destroy();\n * dynArray.derived.get(...);\n * ```\n */\nclass DerivedAPI {\n /**\n * Removes all derived reducers and associated subscriptions.\n */\n clear;\n /**\n * @param options - Options for creating a reducer.\n *\n * @returns Newly created derived reducer.\n */\n create;\n /**\n * Deletes and destroys a derived reducer.\n *\n * @param name - Name of the derived reducer\n */\n delete;\n /**\n * Removes all derived reducers, associated subscriptions, and cleans up all resources.\n */\n destroy;\n /**\n * Returns an existing derived reducer.\n *\n * @param name - Name of derived reducer.\n */\n get;\n constructor(adapterDerived) {\n this.clear = adapterDerived.clear.bind(adapterDerived);\n this.create = adapterDerived.create.bind(adapterDerived);\n this.delete = adapterDerived.delete.bind(adapterDerived);\n this.destroy = adapterDerived.destroy.bind(adapterDerived);\n this.get = adapterDerived.get.bind(adapterDerived);\n Object.freeze(this);\n }\n}\n\n/**\n */\nclass Indexer$1 extends AdapterIndexer {\n /**\n * @inheritDoc\n */\n createSortFn() {\n return (a, b) => this.sortData.compareFn(this.hostData[0][a], this.hostData[0][b]);\n }\n /**\n * Provides the custom filter / reduce step that is ~25-40% faster than implementing with `Array.reduce`.\n *\n * Note: Other loop unrolling techniques like Duff's Device gave a slight faster lower bound on large data sets,\n * but the maintenance factor is not worth the extra complication.\n *\n * @returns New filtered index array.\n */\n reduceImpl() {\n const data = [];\n const array = this.hostData[0];\n if (!array) {\n return data;\n }\n const filters = this.filtersData.filters;\n let include = true;\n const parentIndex = this.indexData.parent;\n // Source index data is coming from an active parent index.\n if (DynReducerUtils.isIterable(parentIndex) && parentIndex.active) {\n for (const adjustedIndex of parentIndex) {\n const value = array[adjustedIndex];\n include = true;\n for (let filCntr = 0, filLength = filters.length; filCntr < filLength; filCntr++) {\n if (!filters[filCntr].filter(value)) {\n include = false;\n break;\n }\n }\n if (include) {\n data.push(adjustedIndex);\n }\n }\n }\n else {\n for (let cntr = 0, length = array.length; cntr < length; cntr++) {\n include = true;\n for (let filCntr = 0, filLength = filters.length; filCntr < filLength; filCntr++) {\n if (!filters[filCntr].filter(array[cntr])) {\n include = false;\n break;\n }\n }\n if (include) {\n data.push(cntr);\n }\n }\n }\n return data;\n }\n /**\n * Update the reducer indexes. If there are changes subscribers are notified. If data order is changed externally\n * pass in true to force an update to subscribers.\n *\n * @param [force=false] - When true forces an update to subscribers.\n */\n update(force = false) {\n if (this.destroyed) {\n return;\n }\n const oldIndex = this.indexData.index;\n const oldHash = this.indexData.hash;\n const array = this.hostData[0];\n const parentIndex = this.indexData.parent;\n // Clear index if there are no filters and no sort function or the index length doesn't match the item length.\n if ((this.filtersData.filters.length === 0 && !this.sortData.compareFn) ||\n (this.indexData.index && array?.length !== this.indexData.index.length)) {\n this.indexData.index = null;\n }\n // If there are filters build new index.\n if (this.filtersData.filters.length > 0) {\n this.indexData.index = this.reduceImpl();\n }\n // If the index isn't built yet and there is an active parent index then create it from the parent.\n if (!this.indexData.index && parentIndex?.active) {\n this.indexData.index = [...parentIndex];\n }\n if (this.sortData.compareFn && Array.isArray(array)) {\n // If there is no index then create one with keys matching host item length.\n if (!this.indexData.index) {\n this.indexData.index = [...Array(array.length).keys()];\n }\n this.indexData.index.sort(this.sortFn);\n }\n this.calcHashUpdate(oldIndex, oldHash, force);\n // Update all derived reducers.\n this.derivedAdapter?.update(force);\n }\n}\n\n/**\n * Provides the base implementation derived reducer for arrays / DynArrayReducer.\n */\nclass DerivedArrayReducer {\n #array;\n #derived;\n #derivedPublicAPI;\n #filters;\n #filtersData = { filters: [] };\n #index;\n #indexPublicAPI;\n #reversed = false;\n #sort;\n #sortData = { compareFn: null };\n #subscriptions = [];\n #destroyed = false;\n /**\n * @param array - Data host array.\n *\n * @param parentIndex - Parent indexer.\n *\n * @param options - Any filters and sort functions to apply.\n */\n constructor(array, parentIndex, options) {\n this.#array = array;\n this.#index = new Indexer$1(this.#array, this.#updateSubscribers.bind(this), parentIndex);\n this.#indexPublicAPI = new IndexerAPI(this.#index);\n this.#filters = new AdapterFilters(this.#indexPublicAPI.update, this.#filtersData);\n this.#sort = new AdapterSort(this.#indexPublicAPI.update, this.#sortData);\n this.#derived = new AdapterDerived(this.#array, this.#indexPublicAPI, DerivedArrayReducer);\n this.#derivedPublicAPI = new DerivedAPI(this.#derived);\n this.#index.initAdapters(this.#filtersData, this.#sortData, this.#derived);\n let filters = void 0;\n let sort = void 0;\n if (options !== void 0 && ('filters' in options || 'sort' in options)) {\n if (options.filters !== void 0) {\n if (DynReducerUtils.isIterable(options.filters)) {\n filters = options.filters;\n }\n else {\n throw new TypeError(`DerivedArrayReducer error (DataDerivedOptions): 'filters' attribute is not iterable.`);\n }\n }\n if (options.sort !== void 0) {\n if (typeof options.sort === 'function') {\n sort = options.sort;\n }\n else if (typeof options.sort === 'object' && options.sort !== null) {\n sort = options.sort;\n }\n else {\n throw new TypeError(`DerivedArrayReducer error (DataDerivedOptions): 'sort' attribute is not a function or object.`);\n }\n }\n }\n // Add any filters and sort function defined by DataDynArray.\n if (filters) {\n this.filters.add(...filters);\n }\n if (sort) {\n this.sort.set(sort);\n }\n // Invoke an custom initialization for child classes.\n this.initialize();\n }\n /**\n * Returns the internal data of this instance. Be careful!\n *\n * Note: if an array is set as initial data then that array is used as the internal data. If any changes are\n * performed to the data externally do invoke {@link IndexerAPI.update} with `true` to recalculate the index and\n * notify all subscribers.\n *\n * @returns The internal data.\n */\n get data() { return this.#array[0]; }\n /**\n * @returns Derived public API.\n */\n get derived() { return this.#derivedPublicAPI; }\n /**\n * @returns The filters adapter.\n */\n get filters() { return this.#filters; }\n /**\n * Returns the Indexer public API.\n *\n * @returns Indexer API - is also iterable.\n */\n get index() { return this.#indexPublicAPI; }\n /**\n * Returns whether this derived reducer is destroyed.\n */\n get destroyed() { return this.#destroyed; }\n /**\n * @returns Main data / items length or indexed length.\n */\n get length() {\n const array = this.#array[0];\n return this.#index.active ? this.index.length :\n array ? array.length : 0;\n }\n /**\n * @returns Gets current reversed state.\n */\n get reversed() { return this.#reversed; }\n /**\n * @returns The sort adapter.\n */\n get sort() { return this.#sort; }\n /**\n * Sets reversed state and notifies subscribers.\n *\n * @param reversed - New reversed state.\n */\n set reversed(reversed) {\n if (typeof reversed !== 'boolean') {\n throw new TypeError(`DerivedArrayReducer.reversed error: 'reversed' is not a boolean.`);\n }\n this.#reversed = reversed;\n this.#index.reversed = reversed;\n // Recalculate index and force an update to any subscribers.\n this.index.update(true);\n }\n /**\n * Removes all derived reducers, subscriptions, and cleans up all resources.\n */\n destroy() {\n this.#destroyed = true;\n // Remove any external data reference and perform a final update.\n this.#array = [null];\n this.#index.update(true);\n // Remove all subscriptions.\n this.#subscriptions.length = 0;\n this.#derived.destroy();\n this.#index.destroy();\n this.#filters.clear();\n this.#sort.clear();\n }\n /**\n * Provides a callback for custom derived reducers to initialize any data / custom configuration. This allows\n * child classes to avoid implementing the constructor.\n *\n * @protected\n */\n initialize() { }\n /**\n * Provides an iterator for data stored in DerivedArrayReducer.\n *\n * @returns Generator / iterator of all data.\n */\n *[Symbol.iterator]() {\n const array = this.#array[0];\n if (this.#destroyed || array === null || array?.length === 0) {\n return;\n }\n if (this.#index.active) {\n for (const entry of this.index) {\n yield array[entry];\n }\n }\n else {\n if (this.reversed) {\n for (let cntr = array.length; --cntr >= 0;) {\n yield array[cntr];\n }\n }\n else {\n for (let cntr = 0; cntr < array.length; cntr++) {\n yield array[cntr];\n }\n }\n }\n }\n // -------------------------------------------------------------------------------------------------------------------\n /**\n * Subscribe to this DerivedArrayReducer.\n *\n * @param handler - Callback function that is invoked on update / changes. Receives `this` reference.\n *\n * @returns Unsubscribe function.\n */\n subscribe(handler) {\n this.#subscriptions.push(handler); // add handler to the array of subscribers\n handler(this); // call handler with current value\n // Return unsubscribe function.\n return () => {\n const index = this.#subscriptions.findIndex((sub) => sub === handler);\n if (index >= 0) {\n this.#subscriptions.splice(index, 1);\n }\n };\n }\n /**\n * Updates subscribers on changes.\n */\n #updateSubscribers() {\n for (let cntr = 0; cntr < this.#subscriptions.length; cntr++) {\n this.#subscriptions[cntr](this);\n }\n }\n}\n\n/**\n * Provides a managed array with non-destructive reducing / filtering / sorting capabilities with subscription /\n * Svelte store support.\n */\nclass DynArrayReducer {\n #array = [null];\n #derived;\n #derivedPublicAPI;\n #filters;\n #filtersData = { filters: [] };\n #index;\n #indexPublicAPI;\n #reversed = false;\n #sort;\n #sortData = { compareFn: null };\n #subscriptions = [];\n #destroyed = false;\n /**\n * Initializes DynArrayReducer. Any iterable is supported for initial data. Take note that if `data` is an array it\n * will be used as the host array and not copied. All non-array iterables otherwise create a new array / copy.\n *\n * @param [data] - Data iterable to store if array or copy otherwise.\n */\n constructor(data) {\n let dataIterable = void 0;\n let filters = void 0;\n let sort = void 0;\n if (data === null) {\n throw new TypeError(`DynArrayReducer error: 'data' is not iterable.`);\n }\n if (data !== void 0 && typeof data !== 'object' && !DynReducerUtils.isIterable(data)) {\n throw new TypeError(`DynArrayReducer error: 'data' is not iterable.`);\n }\n if (data !== void 0 && Symbol.iterator in data) {\n dataIterable = data;\n }\n else if (data !== void 0 && ('data' in data || 'filters' in data || 'sort' in data)) {\n if (data.data !== void 0 && !DynReducerUtils.isIterable(data.data)) {\n throw new TypeError(`DynArrayReducer error (DataDynArray): 'data' attribute is not iterable.`);\n }\n dataIterable = data.data;\n if (data.filters !== void 0) {\n if (DynReducerUtils.isIterable(data.filters)) {\n filters = data.filters;\n }\n else {\n throw new TypeError(`DynArrayReducer error (DataDynArray): 'filters' attribute is not iterable.`);\n }\n }\n if (data.sort !== void 0) {\n if (typeof data.sort === 'function') {\n sort = data.sort;\n }\n else if (typeof data.sort === 'object' && data.sort !== null) {\n sort = data.sort;\n }\n else {\n throw new TypeError(`DynArrayReducer error (DataDynArray): 'sort' attribute is not a function or object.`);\n }\n }\n }\n // In the case of the main data being an array directly use the array otherwise create a copy.\n if (dataIterable) {\n this.#array[0] = Array.isArray(dataIterable) ? dataIterable : [...dataIterable];\n }\n this.#index = new Indexer$1(this.#array, this.#updateSubscribers.bind(this));\n this.#indexPublicAPI = new IndexerAPI(this.#index);\n this.#filters = new AdapterFilters(this.#indexPublicAPI.update, this.#filtersData);\n this.#sort = new AdapterSort(this.#indexPublicAPI.update, this.#sortData);\n this.#derived = new AdapterDerived(this.#array, this.#indexPublicAPI, DerivedArrayReducer);\n this.#derivedPublicAPI = new DerivedAPI(this.#derived);\n this.#index.initAdapters(this.#filtersData, this.#sortData, this.#derived);\n // Add any filters and sort function defined by DataDynArray.\n if (filters) {\n this.filters.add(...filters);\n }\n if (sort) {\n this.sort.set(sort);\n }\n // Invoke an custom initialization for child classes.\n this.initialize();\n }\n /**\n * Returns the internal data of this instance. Be careful!\n *\n * Note: if an array is set as initial data then that array is used as the internal data. If any changes are\n * performed to the data externally do invoke {@link AdapterIndexer.index.update} with `true` to recalculate the\n * index and notify all subscribers.\n *\n * @returns The internal data.\n */\n get data() { return this.#array[0]; }\n /**\n * @returns Derived public API.\n */\n get derived() { return this.#derivedPublicAPI; }\n /**\n * @returns The filters adapter.\n */\n get filters() { return this.#filters; }\n /**\n * @returns Returns the Indexer public API.\n */\n get index() { return this.#indexPublicAPI; }\n /**\n * Returns whether this instance is destroyed.\n */\n get destroyed() { return this.#destroyed; }\n /**\n * Gets the main data / items length.\n *\n * @returns {number} Main data / items length.\n */\n get length() {\n const array = this.#array[0];\n return this.#index.active ? this.#indexPublicAPI.length :\n array ? array.length : 0;\n }\n /**\n * Gets current reversed state.\n *\n * @returns {boolean} Reversed state.\n */\n get reversed() { return this.#reversed; }\n /**\n * @returns The sort adapter.\n */\n get sort() { return this.#sort; }\n /**\n * Sets reversed state and notifies subscribers.\n *\n * @param reversed - New reversed state.\n */\n set reversed(reversed) {\n if (typeof reversed !== 'boolean') {\n throw new TypeError(`DynArrayReducer.reversed error: 'reversed' is not a boolean.`);\n }\n this.#reversed = reversed;\n this.#index.reversed = reversed;\n // Recalculate index and force an update to any subscribers.\n this.index.update(true);\n }\n /**\n * Removes all derived reducers, subscriptions, and cleans up all resources.\n */\n destroy() {\n if (this.#destroyed) {\n return;\n }\n this.#destroyed = true;\n this.#derived.destroy();\n // Set the backing data to null and provide a final update.\n this.#array = [null];\n this.index.update(true);\n // Remove all subscriptions.\n this.#subscriptions.length = 0;\n this.#index.destroy();\n this.#filters.clear();\n this.#sort.clear();\n }\n /**\n * Provides a callback for custom reducers to initialize any data / custom configuration. This allows\n * child classes to avoid implementing the constructor.\n *\n * @protected\n */\n initialize() { }\n /**\n * Removes internal data and pushes new data. This does not destroy any initial array set to internal data unless\n * `replace` is set to true.\n *\n * @param data - New data to set to internal data.\n *\n * @param replace=false - New data to set to internal data.\n */\n setData(data, replace = false) {\n if (data !== null && !DynReducerUtils.isIterable(data)) {\n throw new TypeError(`DynArrayReducer.setData error: 'data' is not iterable.`);\n }\n if (typeof replace !== 'boolean') {\n throw new TypeError(`DynArrayReducer.setData error: 'replace' is not a boolean.`);\n }\n const array = this.#array[0];\n // If the array isn't defined or 'replace' is true then replace internal data with new array or create an array\n // from an iterable.\n if (!Array.isArray(array) || replace) {\n if (data) {\n this.#array[0] = Array.isArray(data) ? data : [...data];\n }\n }\n else {\n if (data) {\n // Remove all entries in internal data. This will not replace any initially set array.\n array.length = 0;\n // Add all new data.\n array.push(...data);\n }\n else {\n this.#array[0] = null;\n }\n }\n // Recalculate index and force an update to any subscribers.\n this.index.update(true);\n }\n /**\n * Add a subscriber to this DynArrayReducer instance.\n *\n * @param handler - Callback function that is invoked on update / changes. Receives `this` reference.\n *\n * @returns Unsubscribe function.\n */\n subscribe(handler) {\n this.#subscriptions.push(handler); // add handler to the array of subscribers\n handler(this); // call handler with current value\n // Return unsubscribe function.\n return () => {\n const index = this.#subscriptions.findIndex((sub) => sub === handler);\n if (index >= 0) {\n this.#subscriptions.splice(index, 1);\n }\n };\n }\n /**\n * Updates subscribers on changes.\n */\n #updateSubscribers() {\n for (let cntr = 0; cntr < this.#subscriptions.length; cntr++) {\n this.#subscriptions[cntr](this);\n }\n }\n /**\n * Provides an iterator for data stored in DynArrayReducer.\n *\n * @returns Generator / iterator of all data.\n * @yields {T}\n */\n *[Symbol.iterator]() {\n const array = this.#array[0];\n if (this.#destroyed || array === null || array?.length === 0) {\n return;\n }\n if (this.#index.active) {\n for (const entry of this.index) {\n yield array[entry];\n }\n }\n else {\n if (this.reversed) {\n for (let cntr = array.length; --cntr >= 0;) {\n yield array[cntr];\n }\n }\n else {\n for (let cntr = 0; cntr < array.length; cntr++) {\n yield array[cntr];\n }\n }\n }\n }\n}\n\n/**\n */\nclass Indexer extends AdapterIndexer {\n /**\n * @inheritDoc\n */\n createSortFn() {\n return (a, b) => this.sortData.compareFn(this.hostData[0].get(a), this.hostData[0].get(b));\n }\n /**\n * Provides the custom filter / reduce step that is ~25-40% faster than implementing with `Array.reduce`.\n *\n * Note: Other loop unrolling techniques like Duff's Device gave a slight faster lower bound on large data sets,\n * but the maintenance factor is not worth the extra complication.\n *\n * @returns New filtered index array.\n */\n reduceImpl() {\n const data = [];\n const map = this.hostData[0];\n if (!map) {\n return data;\n }\n const filters = this.filtersData.filters;\n let include = true;\n const parentIndex = this.indexData.parent;\n // Source index data is coming from an active parent index.\n if (DynReducerUtils.isIterable(parentIndex) && parentIndex.active) {\n for (const key of parentIndex) {\n const value = map.get(key);\n include = true;\n for (let filCntr = 0, filLength = filters.length; filCntr < filLength; filCntr++) {\n if (!filters[filCntr].filter(value)) {\n include = false;\n break;\n }\n }\n if (include) {\n data.push(key);\n }\n }\n }\n else {\n for (const key of map.keys()) {\n include = true;\n const value = map.get(key);\n for (let filCntr = 0, filLength = filters.length; filCntr < filLength; filCntr++) {\n if (!filters[filCntr].filter(value)) {\n include = false;\n break;\n }\n }\n if (include) {\n data.push(key);\n }\n }\n }\n return data;\n }\n /**\n * Update the reducer indexes. If there are changes subscribers are notified. If data order is changed externally\n * pass in true to force an update to subscribers.\n *\n * @param [force=false] - When true forces an update to subscribers.\n */\n update(force = false) {\n if (this.destroyed) {\n return;\n }\n const oldIndex = this.indexData.index;\n const oldHash = this.indexData.hash;\n const map = this.hostData[0];\n const parentIndex = this.indexData.parent;\n // Clear index if there are no filters and no sort function or the index length doesn't match the item length.\n if ((this.filtersData.filters.length === 0 && !this.sortData.compareFn) ||\n (this.indexData.index && map?.size !== this.indexData.index.length)) {\n this.indexData.index = null;\n }\n // If there are filters build new index.\n if (this.filtersData.filters.length > 0) {\n this.indexData.index = this.reduceImpl();\n }\n // If the index isn't built yet and there is an active parent index then create it from the parent.\n if (!this.indexData.index && parentIndex?.active) {\n this.indexData.index = [...parentIndex];\n }\n if (this.sortData.compareFn && map instanceof Map) {\n // If there is no index then create one with keys matching host item length.\n if (!this.indexData.index) {\n this.indexData.index = this.indexData.index = [...map.keys()];\n }\n this.indexData.index.sort(this.sortFn);\n }\n this.calcHashUpdate(oldIndex, oldHash, force);\n // Update all derived reducers.\n this.derivedAdapter?.update(force);\n }\n}\n\n/**\n * Provides the base implementation derived reducer for arrays / DynArrayReducer.\n */\nclass DerivedMapReducer {\n #map;\n #derived;\n #derivedPublicAPI;\n #filters;\n #filtersData = { filters: [] };\n #index;\n #indexPublicAPI;\n #reversed = false;\n #sort;\n #sortData = { compareFn: null };\n #subscriptions = [];\n #destroyed = false;\n /**\n * @param map - Data host Map.\n *\n * @param parentIndex - Parent indexer.\n *\n * @param options - Any filters and sort functions to apply.\n */\n constructor(map, parentIndex, options) {\n this.#map = map;\n this.#index = new Indexer(this.#map, this.#updateSubscribers.bind(this), parentIndex);\n this.#indexPublicAPI = new IndexerAPI(this.#index);\n this.#filters = new AdapterFilters(this.#indexPublicAPI.update, this.#filtersData);\n this.#sort = new AdapterSort(this.#indexPublicAPI.update, this.#sortData);\n this.#derived = new AdapterDerived(this.#map, this.#indexPublicAPI, DerivedMapReducer);\n this.#derivedPublicAPI = new DerivedAPI(this.#derived);\n this.#index.initAdapters(this.#filtersData, this.#sortData, this.#derived);\n let filters = void 0;\n let sort = void 0;\n if (options !== void 0 && ('filters' in options || 'sort' in options)) {\n if (options.filters !== void 0) {\n if (DynReducerUtils.isIterable(options.filters)) {\n filters = options.filters;\n }\n else {\n throw new TypeError(`DerivedMapReducer error (DataDerivedOptions): 'filters' attribute is not iterable.`);\n }\n }\n if (options.sort !== void 0) {\n if (typeof options.sort === 'function') {\n sort = options.sort;\n }\n else if (typeof options.sort === 'object' && options.sort !== null) {\n sort = options.sort;\n }\n else {\n throw new TypeError(`DerivedMapReducer error (DataDerivedOptions): 'sort' attribute is not a function or object.`);\n }\n }\n }\n // Add any filters and sort function defined by DataDynArray.\n if (filters) {\n this.filters.add(...filters);\n }\n if (sort) {\n this.sort.set(sort);\n }\n // Invoke an custom initialization for child classes.\n this.initialize();\n }\n /**\n * Returns the internal data of this instance. Be careful!\n *\n * Note: The returned map is the same map set by the main reducer. If any changes are performed to the data\n * externally do invoke {@link IndexerAPI.update} with `true` to recalculate the index and notify all subscribers.\n *\n * @returns The internal data.\n */\n get data() { return this.#map[0]; }\n /**\n * @returns Derived public API.\n */\n get derived() { return this.#derivedPublicAPI; }\n /**\n * @returns The filters adapter.\n */\n get filters() { return this.#filters; }\n /**\n * Returns the Indexer public API.\n *\n * @returns Indexer API - is also iterable.\n */\n get index() { return this.#indexPublicAPI; }\n /**\n * Returns whether this derived reducer is destroyed.\n */\n get destroyed() { return this.#destroyed; }\n /**\n * @returns Main data / items length or indexed length.\n */\n get length() {\n const map = this.#map[0];\n return this.#index.active ? this.index.length :\n map ? map.size : 0;\n }\n /**\n * @returns Gets current reversed state.\n */\n get reversed() { return this.#reversed; }\n /**\n * @returns The sort adapter.\n */\n get sort() { return this.#sort; }\n /**\n * Sets reversed state and notifies subscribers.\n *\n * @param reversed - New reversed state.\n */\n set reversed(reversed) {\n if (typeof reversed !== 'boolean') {\n throw new TypeError(`DerivedMapReducer.reversed error: 'reversed' is not a boolean.`);\n }\n this.#reversed = reversed;\n this.#index.reversed = reversed;\n // Recalculate index and force an update to any subscribers.\n this.index.update(true);\n }\n /**\n * Removes all derived reducers, subscriptions, and cleans up all resources.\n */\n destroy() {\n this.#destroyed = true;\n // Remove any external data reference and perform a final update.\n this.#map = [null];\n this.#index.update(true);\n // Remove all subscriptions.\n this.#subscriptions.length = 0;\n this.#derived.destroy();\n this.#index.destroy();\n this.#filters.clear();\n this.#sort.clear();\n }\n /**\n * Provides a callback for custom derived reducers to initialize any data / custom configuration. This allows\n * child classes to avoid implementing the constructor.\n *\n * @protected\n */\n initialize() { }\n /**\n * Provides an iterator for data stored in DerivedMapReducer.\n *\n * @returns Generator / iterator of all data.\n */\n *[Symbol.iterator]() {\n const map = this.#map[0];\n if (this.#destroyed || map === null || map?.size === 0) {\n return;\n }\n if (this.#index.active) {\n for (const key of this.index) {\n yield map.get(key);\n }\n }\n else {\n if (this.reversed) {\n // TODO: Not efficient due to creating temporary values array.\n const values = [...map.values()];\n for (let cntr = values.length; --cntr >= 0;) {\n yield values[cntr];\n }\n }\n else {\n for (const value of map.values()) {\n yield value;\n }\n }\n }\n }\n // -------------------------------------------------------------------------------------------------------------------\n /**\n * Subscribe to this DerivedMapReducer.\n *\n * @param handler - Callback function that is invoked on update / changes. Receives `this` reference.\n *\n * @returns Unsubscribe function.\n */\n subscribe(handler) {\n this.#subscriptions.push(handler); // add handler to the array of subscribers\n handler(this); // call handler with current value\n // Return unsubscribe function.\n return () => {\n const index = this.#subscriptions.findIndex((sub) => sub === handler);\n if (index >= 0) {\n this.#subscriptions.splice(index, 1);\n }\n };\n }\n /**\n * Updates subscribers on changes.\n */\n #updateSubscribers() {\n for (let cntr = 0; cntr < this.#subscriptions.length; cntr++) {\n this.#subscriptions[cntr](this);\n }\n }\n}\n\n/**\n * Provides a managed Map with non-destructive reducing / filtering / sorting capabilities with subscription /\n * Svelte store support.\n */\nclass DynMapReducer {\n #map = [null];\n #derived;\n #derivedPublicAPI;\n #filters;\n #filtersData = { filters: [] };\n #index;\n #indexPublicAPI;\n #reversed = false;\n #sort;\n #sortData = { compareFn: null };\n #subscriptions = [];\n #destroyed = false;\n /**\n * Initializes DynMapReducer. Any iterable is supported for initial data. Take note that if `data` is an array it\n * will be used as the host array and not copied. All non-array iterables otherwise create a new array / copy.\n *\n * @param [data] - Data iterable to store if array or copy otherwise.\n */\n constructor(data) {\n let dataMap = void 0;\n let filters = void 0;\n let sort = void 0;\n if (data === null) {\n throw new TypeError(`DynMapReducer error: 'data' is not an object or Map.`);\n }\n if (data !== void 0 && typeof data !== 'object' && !(data instanceof Map)) {\n throw new TypeError(`DynMapReducer error: 'data' is not an object or Map.`);\n }\n if (data !== void 0 && data instanceof Map) {\n dataMap = data;\n }\n else if (data !== void 0 && ('data' in data || 'filters' in data || 'sort' in data)) {\n if (data.data !== void 0 && !(data.data instanceof Map)) {\n throw new TypeError(`DynMapReducer error (DataDynMap): 'data' attribute is not a Map.`);\n }\n dataMap = data.data;\n if (data.filters !== void 0) {\n if (DynReducerUtils.isIterable(data.filters)) {\n filters = data.filters;\n }\n else {\n throw new TypeError(`DynMapReducer error (DataDynMap): 'filters' attribute is not iterable.`);\n }\n }\n if (data.sort !== void 0) {\n if (typeof data.sort === 'function') {\n sort = data.sort;\n }\n else if (typeof data.sort === 'object' && data.sort !== null) {\n sort = data.sort;\n }\n else {\n throw new TypeError(`DynMapReducer error (DataDynMap): 'sort' attribute is not a function or object.`);\n }\n }\n }\n // In the case of the main data being an array directly use the array otherwise create a copy.\n if (dataMap) {\n this.#map[0] = dataMap;\n }\n this.#index = new Indexer(this.#map, this.#updateSubscribers.bind(this));\n this.#indexPublicAPI = new IndexerAPI(this.#index);\n this.#filters = new AdapterFilters(this.#indexPublicAPI.update, this.#filtersData);\n this.#sort = new AdapterSort(this.#indexPublicAPI.update, this.#sortData);\n this.#derived = new AdapterDerived(this.#map, this.#indexPublicAPI, DerivedMapReducer);\n this.#derivedPublicAPI = new DerivedAPI(this.#derived);\n this.#index.initAdapters(this.#filtersData, this.#sortData, this.#derived);\n // Add any filters and sort function defined by DataDynMap.\n if (filters) {\n this.filters.add(...filters);\n }\n if (sort) {\n this.sort.set(sort);\n }\n // Invoke an custom initialization for child classes.\n this.initialize();\n }\n /**\n * Returns the internal data of this instance. Be careful!\n *\n * Note: When a map is set as data then that map is used as the internal data. If any changes are\n * performed to the data externally do invoke {@link AdapterIndexer.index.update} with `true` to recalculate the\n * index and notify all subscribers.\n *\n * @returns The internal data.\n */\n get data() { return this.#map[0]; }\n /**\n * @returns Derived public API.\n */\n get derived() { return this.#derivedPublicAPI; }\n /**\n * @returns The filters adapter.\n */\n get filters() { return this.#filters; }\n /**\n * @returns Returns the Indexer public API.\n */\n get index() { return this.#indexPublicAPI; }\n /**\n * Returns whether this instance is destroyed.\n */\n get destroyed() { return this.#destroyed; }\n /**\n * Gets the main data / items length.\n *\n * @returns {number} Main data / items length.\n */\n get length() {\n const map = this.#map[0];\n return this.#index.active ? this.#indexPublicAPI.length :\n map ? map.size : 0;\n }\n /**\n * Gets current reversed state.\n *\n * @returns {boolean} Reversed state.\n */\n get reversed() { return this.#reversed; }\n /**\n * @returns The sort adapter.\n */\n get sort() { return this.#sort; }\n /**\n * Sets reversed state and notifies subscribers.\n *\n * @param reversed - New reversed state.\n */\n set reversed(reversed) {\n if (typeof reversed !== 'boolean') {\n throw new TypeError(`DynMapReducer.reversed error: 'reversed' is not a boolean.`);\n }\n this.#reversed = reversed;\n this.#index.reversed = reversed;\n // Recalculate index and force an update to any subscribers.\n this.index.update(true);\n }\n /**\n * Removes all derived reducers, subscriptions, and cleans up all resources.\n */\n destroy() {\n if (this.#destroyed) {\n return;\n }\n this.#destroyed = true;\n this.#derived.destroy();\n // Set the backing data to null and provide a final update.\n this.#map = [null];\n this.index.update(true);\n // Remove all subscriptions.\n this.#subscriptions.length = 0;\n this.#index.destroy();\n this.#filters.clear();\n this.#sort.clear();\n }\n /**\n * Provides a callback for custom reducers to initialize any data / custom configuration. This allows\n * child classes to avoid implementing the constructor.\n *\n * @protected\n */\n initialize() { }\n /**\n * Removes internal data and pushes new data. This does not destroy any initial array set to internal data unless\n * `replace` is set to true.\n *\n * @param data - New data to set to internal data.\n *\n * @param replace=false - New data to set to internal data.\n */\n setData(data, replace = false) {\n if (data !== null && !(data instanceof Map)) {\n throw new TypeError(`DynMapReducer.setData error: 'data' is not iterable.`);\n }\n if (typeof replace !== 'boolean') {\n throw new TypeError(`DynMapReducer.setData error: 'replace' is not a boolean.`);\n }\n const map = this.#map[0];\n // If the array isn't defined or 'replace' is true then replace internal data with new array or create an array\n // from an iterable.\n if (!(map instanceof Map) || replace) {\n this.#map[0] = data instanceof Map ? data : null;\n }\n else if (data instanceof Map && map instanceof Map) {\n // Create a set of all current entry IDs.\n const removeKeySet = new Set(map.keys());\n for (const key of data.keys()) {\n map.set(key, data.get(key));\n if (removeKeySet.has(key)) {\n removeKeySet.delete(key);\n }\n }\n // Remove entries that are no longer in data.\n for (const key of removeKeySet) {\n map.delete(key);\n }\n }\n else if (data === null) {\n this.#map[0] = null;\n }\n // Recalculate index and force an update to any subscribers.\n this.index.update(true);\n }\n /**\n * Add a subscriber to this DynMapReducer instance.\n *\n * @param handler - Callback function that is invoked on update / changes. Receives `this` reference.\n *\n * @returns Unsubscribe function.\n */\n subscribe(handler) {\n this.#subscriptions.push(handler); // add handler to the array of subscribers\n handler(this); // call handler with current value\n // Return unsubscribe function.\n return () => {\n const index = this.#subscriptions.findIndex((sub) => sub === handler);\n if (index >= 0) {\n this.#subscriptions.splice(index, 1);\n }\n };\n }\n /**\n * Updates subscribers on changes.\n */\n #updateSubscribers() {\n for (let cntr = 0; cntr < this.#subscriptions.length; cntr++) {\n this.#subscriptions[cntr](this);\n }\n }\n /**\n * Provides an iterator for data stored in DynMapReducer.\n *\n * @returns Generator / iterator of all data.\n * @yields {T}\n */\n *[Symbol.iterator]() {\n const map = this.#map[0];\n if (this.#destroyed || map === null || map?.size === 0) {\n return;\n }\n if (this.#index.active) {\n for (const key of this.index) {\n yield map.get(key);\n }\n }\n else {\n if (this.reversed) {\n // TODO: Not efficient due to creating temporary values array.\n const values = [...map.values()];\n for (let cntr = values.length; --cntr >= 0;) {\n yield values[cntr];\n }\n }\n else {\n for (const value of map.values()) {\n yield value;\n }\n }\n }\n }\n}\n\n/**\n * Provides a readable store to track keys actively pressed. KeyStore is designed to be used with the {@link keyforward}\n * action.\n */\nclass KeyStore\n{\n #keySet;\n\n /**\n * @type {Map<string, number>}\n */\n #keyMap = new Map();\n\n /**\n * @type {KeyStoreOptions}\n */\n #options = { preventDefault: true, useCode: true, stopPropagation: true };\n\n /**\n * Stores the subscribers.\n *\n * @type {(function(KeyStore): void)[]}\n */\n #subscriptions = [];\n\n /**\n * @param {Iterable<string>} [keyNames] -\n *\n * @param {KeyStoreOptions} [options] - Optional parameters\n */\n constructor(keyNames, options)\n {\n if (!isIterable(keyNames))\n {\n throw new TypeError(`'keyNames' is not an iterable list.`);\n }\n\n this.setOptions(options);\n\n this.#keySet = new Set(keyNames);\n }\n\n /**\n * Add given key to the tracking key set.\n *\n * @param {string} key - Key to add.\n */\n addKey(key)\n {\n if (typeof key !== 'string') { throw new TypeError(`'key' is not a string.`); }\n\n this.#keySet.add(key);\n }\n\n /**\n * @returns {boolean} True if any keys in the key set are pressed.\n */\n\n /**\n * Returns true if any of given keys are pressed. If `keys` is undefined then the result is true if any keys being\n * tracked are pressed.\n *\n * @param {string|Iterable<string>|undefined} keys - Zero or more key strings or list to verify if any pressed.\n *\n * @returns {boolean} True if any keys set are pressed.\n */\n anyPressed(keys)\n {\n // When no keys given then check if any key is pressed.\n if (keys === void 0) { return this.#keyMap.size > 0; }\n\n const isList = isIterable(keys);\n\n if (typeof keys !== 'string' && !isList)\n {\n throw new TypeError(`'keys' is not a string or iterable list of strings.`);\n }\n\n let result = false;\n\n if (isList)\n {\n for (const key of keys)\n {\n if (this.#keyMap.has(key))\n {\n result = true;\n break;\n }\n }\n }\n else\n {\n if (this.#keyMap.has(keys)) { result = true; }\n }\n\n return result;\n }\n\n /**\n * Is the given key in the tracking key set.\n *\n * @param {string} key - Key to check.\n */\n hasKey(key)\n {\n if (typeof key !== 'string') { throw new TypeError(`'key' is not a string.`); }\n\n this.#keySet.has(key);\n }\n\n /**\n * Returns true if all given keys are pressed.\n *\n * @param {string|Iterable<string>} keys - One or more key strings to verify if pressed.\n *\n * @returns {boolean} Are all keys pressed.\n */\n isPressed(keys)\n {\n const isList = isIterable(keys);\n\n if (typeof keys !== 'string' && !isList)\n {\n throw new TypeError(`'keys' is not a string or iterable list of strings.`);\n }\n\n let result = true;\n\n if (isList)\n {\n for (const key of keys)\n {\n if (!this.#keyMap.has(key))\n {\n result = false;\n break;\n }\n }\n }\n else\n {\n if (!this.#keyMap.has(keys)) { result = false; }\n }\n\n return result;\n }\n\n /**\n * Handle keydown event adding any key from the tracked key set.\n *\n * @param {KeyboardEvent} event - KeyboardEvent.\n */\n keydown(event)\n {\n const key = this.#options.useCode ? event.code : event.key;\n\n if (this.#keySet.has(key))\n {\n if (!this.#keyMap.has(key))\n {\n this.#keyMap.set(key, 1);\n this._updateSubscribers();\n }\n\n if (this.#options.preventDefault) { event.preventDefault(); }\n if (this.#options.stopPropagation) { event.stopPropagation(); }\n }\n }\n\n /**\n * @returns {IterableIterator<string>} Returns current pressed keys iterator.\n */\n keysPressed()\n {\n return this.#keyMap.keys();\n }\n\n /**\n * @returns {IterableIterator<string>} Returns currently tracked keys iterator.\n */\n keysTracked()\n {\n return this.#keySet.keys();\n }\n\n /**\n * Handle keyup event removing any key from the tracked key set.\n *\n * @param {KeyboardEvent} event - KeyboardEvent.\n */\n keyup(event)\n {\n const key = this.#options.useCode ? event.code : event.key;\n\n if (this.#keySet.has(key))\n {\n if (this.#keyMap.has(key))\n {\n this.#keyMap.delete(key);\n this._updateSubscribers();\n }\n\n if (this.#options.preventDefault) { event.preventDefault(); }\n if (this.#options.stopPropagation) { event.stopPropagation(); }\n }\n }\n\n /**\n * Remove the given key from the tracking key set.\n *\n * @param {string} key - Key to remove.\n */\n removeKey(key)\n {\n if (typeof key !== 'string') { throw new TypeError(`'key' is not a string.`); }\n\n if (this.#keySet.has(key))\n {\n this.#keySet.delete(key);\n\n if (this.#keyMap.has(key))\n {\n this.#keyMap.delete(key);\n this._updateSubscribers();\n }\n }\n }\n\n /**\n * Update options.\n *\n * @param {KeyStoreOptions} options - Options to set.\n */\n setOptions(options)\n {\n if (typeof options?.preventDefault === 'boolean') { this.#options.preventDefault = options.preventDefault; }\n if (typeof options?.useCode === 'boolean') { this.#options.useCode = options.useCode; }\n if (typeof options?.stopPropagation === 'boolean') { this.#options.stopPropagation = options.stopPropagation; }\n }\n\n /**\n * @param {string} key - key or key code to lookup.\n *\n * @returns {number} 1 if currently pressed and 0 if not pressed.\n */\n value(key)\n {\n return this.#keyMap.has(key) ? 1 : 0;\n }\n\n // Store subscriber implementation --------------------------------------------------------------------------------\n\n /**\n * @param {function(KeyStore): void} handler - Callback function that is invoked on update / changes.\n *\n * @returns {(function(): void)} Unsubscribe function.\n */\n subscribe(handler)\n {\n this.#subscriptions.push(handler); // add handler to the array of subscribers\n\n handler(this); // call handler with current value\n\n // Return unsubscribe function.\n return () =>\n {\n const index = this.#subscriptions.findIndex((sub) => sub === handler);\n if (index >= 0) { this.#subscriptions.splice(index, 1); }\n };\n }\n\n /**\n * Updates subscribers.\n *\n * @protected\n */\n _updateSubscribers()\n {\n for (let cntr = 0; cntr < this.#subscriptions.length; cntr++) { this.#subscriptions[cntr](this); }\n }\n}\n\n/**\n * @typedef {object} KeyStoreOptions\n *\n * @property {boolean} [preventDefault=true] - Invoke `preventDefault` on key events.\n *\n * @property {boolean} [useCode=true] - When true use `event.code` otherwise use `event.key` to get active key.\n *\n * @property {boolean} [stopPropagation=true] - Invoke `stopPropagation` on key events.\n */\n\n// src/generator.ts\nfunction isSimpleDeriver(deriver) {\n return deriver.length < 2;\n}\nfunction generator(storage) {\n function readable(key, value, start) {\n return {\n subscribe: writable(key, value, start).subscribe\n };\n }\n function writable(key, value, start = noop) {\n function wrap_start(ogSet) {\n return start(function wrap_set(new_value) {\n if (storage) {\n storage.setItem(key, JSON.stringify(new_value));\n }\n return ogSet(new_value);\n });\n }\n if (storage) {\n const storageValue = storage.getItem(key);\n try {\n if (storageValue) {\n value = JSON.parse(storageValue);\n }\n } catch (err) {\n }\n storage.setItem(key, JSON.stringify(value));\n }\n const ogStore = writable$2(value, start ? wrap_start : void 0);\n function set(new_value) {\n if (storage) {\n storage.setItem(key, JSON.stringify(new_value));\n }\n ogStore.set(new_value);\n }\n function update(fn) {\n set(fn(get(ogStore)));\n }\n function subscribe(run, invalidate = noop) {\n return ogStore.subscribe(run, invalidate);\n }\n return {set, update, subscribe};\n }\n function derived(key, stores, fn, initial_value) {\n const single = !Array.isArray(stores);\n const stores_array = single ? [stores] : stores;\n if (storage && storage.getItem(key)) {\n try {\n initial_value = JSON.parse(storage.getItem(key));\n } catch (err) {\n }\n }\n return readable(key, initial_value, (set) => {\n let inited = false;\n const values = [];\n let pending = 0;\n let cleanup = noop;\n const sync = () => {\n if (pending) {\n return;\n }\n cleanup();\n const input = single ? values[0] : values;\n if (isSimpleDeriver(fn)) {\n set(fn(input));\n } else {\n const result = fn(input, set);\n cleanup = is_function(result) ? result : noop;\n }\n };\n const unsubscribers = stores_array.map((store, i) => store.subscribe((value) => {\n values[i] = value;\n pending &= ~(1 << i);\n if (inited) {\n sync();\n }\n }, () => {\n pending |= 1 << i;\n }));\n inited = true;\n sync();\n return function stop() {\n run_all(unsubscribers);\n cleanup();\n };\n });\n }\n return {\n readable,\n writable,\n derived,\n get: get\n };\n}\n\n// src/local.ts\nvar storage$1 = typeof window !== \"undefined\" ? window.localStorage : void 0;\nvar g$1 = generator(storage$1);\nvar writable$1 = g$1.writable;\n\nclass TJSLocalStorage\n{\n /**\n * @type {Map<string, import('svelte/store').Writable>}\n */\n #stores = new Map();\n\n /**\n * Creates a new writable store for the given key.\n *\n * @param {string} key - Key to lookup in stores map.\n *\n * @param {boolean} [defaultValue] - A default value to set for the store.\n *\n * @returns {import('svelte/store').Writable} The new store.\n */\n static #createStore(key, defaultValue = void 0)\n {\n try\n {\n const value = localStorage.getItem(key);\n if (value !== null) { defaultValue = value === 'undefined' ? void 0 : JSON.parse(value); }\n }\n catch (err) { /**/ }\n\n return writable$1(key, defaultValue);\n }\n\n /**\n * Gets a store from the stores Map or creates a new store for the key and a given default value.\n *\n * @param {string} key - Key to lookup in stores map.\n *\n * @param {boolean} [defaultValue] - A default value to set for the store.\n *\n * @returns {import('svelte/store').Writable} The store for the given key.\n */\n #getStore(key, defaultValue = void 0)\n {\n let store = this.#stores.get(key);\n if (store === void 0)\n {\n store = TJSLocalStorage.#createStore(key, defaultValue);\n this.#stores.set(key, store);\n }\n\n return store;\n }\n\n /**\n * Get value from the localStorage.\n *\n * @param {string} key - Key to lookup in localStorage.\n *\n * @param {*} [defaultValue] - A default value to return if key not present in session storage.\n *\n * @returns {*} Value from session storage or if not defined any default value provided.\n */\n getItem(key, defaultValue)\n {\n let value = defaultValue;\n\n const storageValue = localStorage.getItem(key);\n\n if (storageValue !== null)\n {\n try\n {\n value = storageValue === 'undefined' ? void 0 : JSON.parse(storageValue);\n }\n catch (err)\n {\n value = defaultValue;\n }\n }\n else if (defaultValue !== void 0)\n {\n try\n {\n const newValue = JSON.stringify(defaultValue);\n\n // If there is no existing storage value and defaultValue is defined the storage value needs to be set.\n localStorage.setItem(key, newValue === 'undefined' ? void 0 : newValue);\n }\n catch (err) { /* */ }\n }\n\n return value;\n }\n\n /**\n * Returns the backing Svelte store for the given key; potentially sets a default value if the key\n * is not already set.\n *\n * @param {string} key - Key to lookup in localStorage.\n *\n * @param {*} [defaultValue] - A default value to return if key not present in session storage.\n *\n * @returns {import('svelte/store').Writable} The Svelte store for this key.\n */\n getStore(key, defaultValue)\n {\n return this.#getStore(key, defaultValue);\n }\n\n /**\n * Sets the value for the given key in localStorage.\n *\n * @param {string} key - Key to lookup in localStorage.\n *\n * @param {*} value - A value to set for this key.\n */\n setItem(key, value)\n {\n const store = this.#getStore(key);\n store.set(value);\n }\n\n /**\n * Convenience method to swap a boolean value stored in session storage.\n *\n * @param {string} key - Key to lookup in localStorage.\n *\n * @param {boolean} [defaultValue] - A default value to return if key not present in session storage.\n *\n * @returns {boolean} The boolean swap for the given key.\n */\n swapItemBoolean(key, defaultValue)\n {\n const store = this.#getStore(key, defaultValue);\n\n let currentValue = false;\n\n try\n {\n currentValue = !!JSON.parse(localStorage.getItem(key));\n }\n catch (err) { /**/ }\n\n const newValue = typeof currentValue === 'boolean' ? !currentValue : false;\n\n store.set(newValue);\n return newValue;\n }\n}\n\n// src/session.ts\nvar storage = typeof window !== \"undefined\" ? window.sessionStorage : void 0;\nvar g = generator(storage);\nvar writable = g.writable;\n\nclass TJSSessionStorage\n{\n /**\n * @type {Map<string, import('svelte/store').Writable>}\n */\n #stores = new Map();\n\n /**\n * Creates a new store for the given key.\n *\n * @param {string} key - Key to lookup in stores map.\n *\n * @param {boolean} [defaultValue] - A default value to set for the store.\n *\n * @returns {import('svelte/store').Writable} The new store.\n */\n static #createStore(key, defaultValue = void 0)\n {\n try\n {\n const value = sessionStorage.getItem(key);\n if (value !== null) { defaultValue = value === 'undefined' ? void 0 : JSON.parse(value); }\n }\n catch (err) { /**/ }\n\n return writable(key, defaultValue);\n }\n\n /**\n * Gets a store from the `stores` Map or creates a new store for the key and a given default value.\n *\n * @param {string} key - Key to lookup in stores map.\n *\n * @param {boolean} [defaultValue] - A default value to set for the store.\n *\n * @returns {import('svelte/store').Writable} The store for the given key.\n */\n #getStore(key, defaultValue = void 0)\n {\n let store = this.#stores.get(key);\n if (store === void 0)\n {\n store = TJSSessionStorage.#createStore(key, defaultValue);\n this.#stores.set(key, store);\n }\n\n return store;\n }\n\n /**\n * Get value from the sessionStorage.\n *\n * @param {string} key - Key to lookup in sessionStorage.\n *\n * @param {*} [defaultValue] - A default value to return if key not present in session storage.\n *\n * @returns {*} Value from session storage or if not defined any default value provided.\n */\n getItem(key, defaultValue)\n {\n let value = defaultValue;\n\n const storageValue = sessionStorage.getItem(key);\n\n if (storageValue !== null)\n {\n try\n {\n value = storageValue === 'undefined' ? void 0 : JSON.parse(storageValue);\n }\n catch (err)\n {\n value = defaultValue;\n }\n }\n else if (defaultValue !== void 0)\n {\n try\n {\n const newValue = JSON.stringify(defaultValue);\n\n // If there is no existing storage value and defaultValue is defined the storage value needs to be set.\n sessionStorage.setItem(key, newValue === 'undefined' ? void 0 : newValue);\n }\n catch (err) { /* */ }\n }\n\n return value;\n }\n\n /**\n * Returns the backing Svelte store for the given key; potentially sets a default value if the key\n * is not already set.\n *\n * @param {string} key - Key to lookup in sessionStorage.\n *\n * @param {*} [defaultValue] - A default value to return if key not present in session storage.\n *\n * @returns {import('svelte/store').Writable} The Svelte store for this key.\n */\n getStore(key, defaultValue)\n {\n return this.#getStore(key, defaultValue);\n }\n\n /**\n * Sets the value for the given key in sessionStorage.\n *\n * @param {string} key - Key to lookup in sessionStorage.\n *\n * @param {*} value - A value to set for this key.\n */\n setItem(key, value)\n {\n const store = this.#getStore(key);\n store.set(value);\n }\n\n /**\n * Convenience method to swap a boolean value stored in session storage.\n *\n * @param {string} key - Key to lookup in sessionStorage.\n *\n * @param {boolean} [defaultValue] - A default value to return if key not present in session storage.\n *\n * @returns {boolean} The boolean swap for the given key.\n */\n swapItemBoolean(key, defaultValue)\n {\n const store = this.#getStore(key, defaultValue);\n\n let currentValue = false;\n\n try\n {\n currentValue = !!JSON.parse(sessionStorage.getItem(key));\n }\n catch (err) { /**/ }\n\n const newValue = typeof currentValue === 'boolean' ? !currentValue : false;\n\n store.set(newValue);\n return newValue;\n }\n}\n\n/**\n * Provides a basic test for a given variable to test if it has the shape of a readable store by having a `subscribe`\n * function.\n *\n * Note: functions are also objects, so test that the variable might be a function w/ a `subscribe` function.\n *\n * @param {*} store - variable to test that might be a store.\n *\n * @returns {boolean} Whether the variable tested has the shape of a store.\n */\nfunction isReadableStore(store)\n{\n if (store === null || store === void 0) { return false; }\n\n switch (typeof store)\n {\n case 'function':\n case 'object':\n return typeof store.subscribe === 'function';\n }\n\n return false;\n}\n\n/**\n * Provides a basic test for a given variable to test if it has the shape of a writable store by having a `subscribe`\n * function and an `update` function.\n *\n * Note: functions are also objects, so test that the variable might be a function w/ a `subscribe` function.\n *\n * @param {*} store - variable to test that might be a store.\n *\n * @returns {boolean} Whether the variable tested has the shape of a store.\n */\nfunction isUpdatableStore(store)\n{\n if (store === null || store === void 0) { return false; }\n\n switch (typeof store)\n {\n case 'function':\n case 'object':\n return typeof store.subscribe === 'function' && typeof store.update === 'function';\n }\n\n return false;\n}\n\n/**\n * Provides a basic test for a given variable to test if it has the shape of a writable store by having a `subscribe`\n * `set`, and `update` functions.\n *\n * Note: functions are also objects, so test that the variable might be a function w/ `subscribe` & `set` functions.\n *\n * @param {*} store - variable to test that might be a store.\n *\n * @returns {boolean} Whether the variable tested has the shape of a store.\n */\nfunction isWritableStore(store)\n{\n if (store === null || store === void 0) { return false; }\n\n switch (typeof store)\n {\n case 'function':\n case 'object':\n return typeof store.subscribe === 'function' && typeof store.set === 'function';\n }\n\n return false;\n}\n\n/**\n * Subscribes to the given store with the update function provided and ignores the first automatic\n * update. All future updates are dispatched to the update function.\n *\n * @param {import('svelte/store').Readable | import('svelte/store').Writable} store -\n * Store to subscribe to...\n *\n * @param {import('svelte/store').Updater} update - function to receive future updates.\n *\n * @returns {import('svelte/store').Unsubscriber} Store unsubscribe function.\n */\nfunction subscribeIgnoreFirst(store, update)\n{\n let firedFirst = false;\n\n return store.subscribe((value) =>\n {\n if (!firedFirst)\n {\n firedFirst = true;\n }\n else\n {\n update(value);\n }\n });\n}\n\n/**\n * Subscribes to the given store with two update functions provided. The first function is invoked on the initial\n * subscription. All future updates are dispatched to the update function.\n *\n * @param {import('svelte/store').Readable | import('svelte/store').Writable} store -\n * Store to subscribe to...\n *\n * @param {import('svelte/store').Updater} first - Function to receive first update.\n *\n * @param {import('svelte/store').Updater} update - Function to receive future updates.\n *\n * @returns {import('svelte/store').Unsubscriber} Store unsubscribe function.\n */\nfunction subscribeFirstRest(store, first, update)\n{\n let firedFirst = false;\n\n return store.subscribe((value) =>\n {\n if (!firedFirst)\n {\n firedFirst = true;\n first(value);\n }\n else\n {\n update(value);\n }\n });\n}\n\n/**\n * @external Store\n * @see [Svelte stores](https://svelte.dev/docs#component-format-script-4-prefix-stores-with-$-to-access-their-values-store-contract)\n */\n\n/**\n * Create a store similar to [Svelte's `derived`](https://svelte.dev/docs#run-time-svelte-store-writable),\n * but which has its own `set` and `update` methods and can send values back to the origin stores.\n * [Read more...](https://github.com/PixievoltNo1/svelte-writable-derived#default-export-writablederived)\n * \n * @param {Store|Store[]} origins One or more stores to derive from. Same as\n * [`derived`](https://svelte.dev/docs#run-time-svelte-store-writable)'s 1st parameter.\n * @param {!Function} derive The callback to determine the derived value. Same as\n * [`derived`](https://svelte.dev/docs#run-time-svelte-store-writable)'s 2nd parameter.\n * @param {!Function} reflect Called when the derived store gets a new value via its `set` or\n * `update` methods, and determines new values for the origin stores.\n * [Read more...](https://github.com/PixievoltNo1/svelte-writable-derived#new-parameter-reflect)\n * @param [initial] The new store's initial value. Same as\n * [`derived`](https://svelte.dev/docs#run-time-svelte-store-writable)'s 3rd parameter.\n * \n * @returns {Store} A writable store.\n */\nfunction writableDerived(origins, derive, reflect, initial) {\n\tvar childDerivedSetter, originValues, blockNextDerive = false;\n\tvar reflectOldValues = reflect.length >= 2;\n\tvar wrappedDerive = (got, set) => {\n\t\tchildDerivedSetter = set;\n\t\tif (reflectOldValues) {\n\t\t\toriginValues = got;\n\t\t}\n\t\tif (!blockNextDerive) {\n\t\t\tlet returned = derive(got, set);\n\t\t\tif (derive.length < 2) {\n\t\t\t\tset(returned);\n\t\t\t} else {\n\t\t\t\treturn returned;\n\t\t\t}\n\t\t}\n\t\tblockNextDerive = false;\n\t};\n\tvar childDerived = derived(origins, wrappedDerive, initial);\n\t\n\tvar singleOrigin = !Array.isArray(origins);\n\tfunction doReflect(reflecting) {\n\t\tvar setWith = reflect(reflecting, originValues);\n\t\tif (singleOrigin) {\n\t\t\tblockNextDerive = true;\n\t\t\torigins.set(setWith);\n\t\t} else {\n\t\t\tsetWith.forEach( (value, i) => {\n\t\t\t\tblockNextDerive = true;\n\t\t\t\torigins[i].set(value);\n\t\t\t} );\n\t\t}\n\t\tblockNextDerive = false;\n\t}\n\t\n\tvar tryingSet = false;\n\tfunction update(fn) {\n\t\tvar isUpdated, mutatedBySubscriptions, oldValue, newValue;\n\t\tif (tryingSet) {\n\t\t\tnewValue = fn( get(childDerived) );\n\t\t\tchildDerivedSetter(newValue);\n\t\t\treturn;\n\t\t}\n\t\tvar unsubscribe = childDerived.subscribe( (value) => {\n\t\t\tif (!tryingSet) {\n\t\t\t\toldValue = value;\n\t\t\t} else if (!isUpdated) {\n\t\t\t\tisUpdated = true;\n\t\t\t} else {\n\t\t\t\tmutatedBySubscriptions = true;\n\t\t\t}\n\t\t} );\n\t\tnewValue = fn(oldValue);\n\t\ttryingSet = true;\n\t\tchildDerivedSetter(newValue);\n\t\tunsubscribe();\n\t\ttryingSet = false;\n\t\tif (mutatedBySubscriptions) {\n\t\t\tnewValue = get(childDerived);\n\t\t}\n\t\tif (isUpdated) {\n\t\t\tdoReflect(newValue);\n\t\t}\n\t}\n\treturn {\n\t\tsubscribe: childDerived.subscribe,\n\t\tset(value) { update( () => value ); },\n\t\tupdate,\n\t};\n}\n\n/**\n * Create a store for a property value in an object contained in another store.\n * [Read more...](https://github.com/PixievoltNo1/svelte-writable-derived#named-export-propertystore)\n * \n * @param {Store} origin The store containing the object to get/set from.\n * @param {string|number|symbol|Array<string|number|symbol>} propName The property to get/set, or a path of\n * properties in nested objects.\n *\n * @returns {Store} A writable store.\n */\nfunction propertyStore(origin, propName) {\n\tif (!Array.isArray(propName)) {\n\t\treturn writableDerived(\n\t\t\torigin,\n\t\t\t(object) => object[propName],\n\t\t\t(reflecting, object) => {\n\t\t\t\tobject[propName] = reflecting;\n\t\t\t\treturn object;\n\t\t\t},\n\t\t);\n\t} else {\n\t\tlet props = propName.concat();\n\t\treturn writableDerived(\n\t\t\torigin,\n\t\t\t(value) => {\n\t\t\t\tfor (let i = 0; i < props.length; ++i) {\n\t\t\t\t\tvalue = value[ props[i] ];\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reflecting, object) => {\n\t\t\t\tlet target = object;\n\t\t\t\tfor (let i = 0; i < props.length - 1; ++i) {\n\t\t\t\t\ttarget = target[ props[i] ];\n\t\t\t\t}\n\t\t\t\ttarget[ props[props.length - 1] ] = reflecting;\n\t\t\t\treturn object;\n\t\t\t},\n\t\t);\n\t}\n}\n\n/**\n * Provides management of reactive embedded collections.\n *\n * TODO: Consider subscribing to TJSDocument rather than exposing {@link EmbeddedStoreManager.handleDocChange} and\n * {@link EmbeddedStoreManager.handleUpdate}\n */\nclass EmbeddedStoreManager\n{\n /**\n * RegExp for detecting CRUD updates for renderContext.\n *\n * @type {RegExp}\n */\n static #renderContextRegex = /(create|delete|update)(\\w+)/;\n\n /**\n * @type {Map<string, EmbeddedCollectionData>}\n */\n #name = new Map();\n\n /**\n * @type {foundry.abstract.Document[]}\n */\n #document;\n\n /**\n * @type {Set<string>}\n */\n #embeddedNames = new Set();\n\n /**\n * @param {foundry.abstract.Document[]} document - The associated document holder.\n */\n constructor(document)\n {\n this.#document = document;\n\n this.handleDocChange();\n\n Object.seal(this);\n }\n\n /**\n * @template T\n *\n * @param {string} embeddedName -\n *\n * @param {import('@typhonjs-fvtt/svelte/store').OptionsDynMapCreate<string, T>} options -\n *\n * @returns {import('@typhonjs-fvtt/svelte/store').DynMapReducer<string, T>} DynMapReducer instance\n */\n create(embeddedName, options)\n {\n /** @type {foundry.abstract.Document} */\n const doc = this.#document[0];\n\n let collection = null;\n\n if (doc)\n {\n try\n {\n collection = doc.getEmbeddedCollection(embeddedName);\n }\n catch (err)\n {\n console.warn(`EmbeddedStoreManager.create error: No valid embedded collection for: ${embeddedName}`);\n }\n }\n\n let embeddedData;\n\n if (!this.#name.has(embeddedName))\n {\n embeddedData = {\n collection,\n stores: new Map()\n };\n\n this.#name.set(embeddedName, embeddedData);\n }\n else\n {\n embeddedData = this.#name.get(embeddedName);\n }\n\n /** @type {string} */\n let name;\n\n /** @type {import('@typhonjs-fvtt/svelte/store').DataOptions<T>} */\n let rest = {};\n\n /** @type {import('@typhonjs-fvtt/svelte/store').IDynMapReducerCtor<string, T>} */\n let ctor;\n\n if (typeof options === 'string')\n {\n name = options;\n ctor = DynMapReducer;\n }\n else if (typeof options === 'function' && hasPrototype(options, DynMapReducer))\n {\n ctor = options;\n }\n else if (isObject(options))\n {\n ({ name, ctor = DynMapReducer, ...rest } = options);\n }\n else\n {\n throw new TypeError(`EmbeddedStoreManager.create error: 'options' does not conform to allowed parameters.`);\n }\n\n if (!hasPrototype(ctor, DynMapReducer))\n {\n throw new TypeError(`EmbeddedStoreManager.create error: 'ctor' is not a 'DynMapReducer'.`);\n }\n\n name = name ?? ctor?.name;\n\n if (typeof name !== 'string') { throw new TypeError(`EmbeddedStoreManager.create error: 'name' is not a string.`); }\n\n if (embeddedData.stores.has(name))\n {\n return embeddedData.stores.get(name);\n }\n else\n {\n const storeOptions = collection ? { data: collection, ...rest } : { ...rest };\n const store = new ctor(storeOptions);\n embeddedData.stores.set(name, store);\n return store;\n }\n }\n\n /**\n * Destroys and removes embedded collection stores. Invoking this method with no parameters destroys all stores.\n * Invoking with an embedded name destroys all stores for that particular collection. If you provide an embedded and\n * store name just that particular store is destroyed and removed.\n *\n * @param {string} [embeddedName] - Specific embedded collection name.\n *\n * @param {string} [storeName] - Specific store name.\n *\n * @returns {boolean} One or more stores destroyed?\n */\n destroy(embeddedName, storeName)\n {\n let count = 0;\n\n // Destroy all embedded stores\n if (embeddedName === void 0)\n {\n for (const embeddedData of this.#name.values())\n {\n embeddedData.collection = null;\n for (const store of embeddedData.stores.values())\n {\n store.destroy();\n count++;\n }\n }\n\n this.#name.clear();\n }\n else if (typeof embeddedName === 'string' && storeName === void 0)\n {\n const embeddedData = this.#name.get(embeddedName);\n if (embeddedData)\n {\n embeddedData.collection = null;\n for (const store of embeddedData.stores.values())\n {\n store.destroy();\n count++;\n }\n }\n\n this.#name.delete(embeddedName);\n }\n else if (typeof embeddedName === 'string' && storeName === 'string')\n {\n const embeddedData = this.#name.get(embeddedName);\n if (embeddedData)\n {\n const store = embeddedData.stores.get(storeName);\n if (store)\n {\n store.destroy();\n count++;\n }\n }\n }\n\n return count > 0;\n }\n\n /**\n * @template T\n *\n * @param {string} embeddedName -\n *\n * @param {string} storeName -\n *\n * @returns {import('@typhonjs-fvtt/svelte/store').DynMapReducer<string, T>} DynMapReducer instance.\n */\n get(embeddedName, storeName)\n {\n if (!this.#name.has(embeddedName)) { return void 0; }\n\n return this.#name.get(embeddedName).stores.get(storeName);\n }\n\n /**\n * Updates all existing embedded collection stores with the associated embedded collection\n */\n handleDocChange()\n {\n const doc = this.#document[0];\n\n if (doc instanceof globalThis.foundry.abstract.Document)\n {\n const existingEmbeddedNames = new Set(this.#name.keys());\n\n /** @type {string[]} */\n const embeddedNames = Object.keys(doc.constructor?.metadata?.embedded ?? []);\n\n // Remove all previously stored embedded name CRUD keys.\n this.#embeddedNames.clear();\n\n for (const embeddedName of embeddedNames)\n {\n // Remove processed embedded name from existingEmbeddedNames set.\n existingEmbeddedNames.delete(embeddedName);\n\n // Update CRUD keys.\n this.#embeddedNames.add(`create${embeddedName}`);\n this.#embeddedNames.add(`delete${embeddedName}`);\n this.#embeddedNames.add(`update${embeddedName}`);\n\n let collection = null;\n\n try\n {\n // Update any existing stores with the actual collection.\n collection = doc.getEmbeddedCollection(embeddedName);\n }\n catch (err)\n {\n console.warn(`EmbeddedStoreManager.handleDocUpdate error: No valid embedded collection for: ${\n embeddedName}`);\n }\n\n // Update EmbeddedData for new collection.\n const embeddedData = this.#name.get(embeddedName);\n if (embeddedData)\n {\n embeddedData.collection = collection;\n\n // Update all existing stores.\n for (const store of embeddedData.stores.values()) { store.setData(collection, true); }\n }\n }\n\n // Update all existing embedded collections with null data that aren't processed above.\n for (const embeddedName of existingEmbeddedNames)\n {\n const embeddedData = this.#name.get(embeddedName);\n if (embeddedData)\n {\n embeddedData.collection = null;\n\n for (const store of embeddedData.stores.values()) { store.setData(null, true); }\n }\n }\n }\n else // Reset all embedded reducer stores to null data.\n {\n this.#embeddedNames.clear();\n\n for (const embeddedData of this.#name.values())\n {\n embeddedData.collection = null;\n\n for (const store of embeddedData.stores.values()) { store.setData(null, true); }\n }\n }\n }\n\n /**\n * Handles updates to embedded stores parsing the render context for valid embedded store types.\n *\n * On create, delete, update parse the type being modified then force index updates for the embedded type.\n *\n * @param {string} renderContext - render context update from document.\n */\n handleUpdate(renderContext)\n {\n if (!this.#embeddedNames.has(renderContext)) { return; }\n\n const match = EmbeddedStoreManager.#renderContextRegex.exec(renderContext);\n\n if (match)\n {\n const embeddedName = match[2];\n if (!this.#name.has(embeddedName)) { return; }\n\n for (const store of this.#name.get(embeddedName).stores.values())\n {\n store.index.update(true);\n }\n }\n }\n}\n\n/**\n * @typedef {object} EmbeddedCollectionData\n *\n * @property {foundry.abstract.Collection} collection -\n *\n * @property {Map<string, import('@typhonjs-fvtt/svelte/store').DynMapReducer<string, T>>} stores -\n */\n\n/**\n * Provides a wrapper implementing the Svelte store / subscriber protocol around any Document / ClientMixinDocument.\n * This makes documents reactive in a Svelte component, but otherwise provides subscriber functionality external to\n * Svelte.\n */\nclass TJSDocument\n{\n /**\n * @type {foundry.abstract.Document[]}\n */\n #document = [void 0];\n\n /**\n * @type {EmbeddedStoreManager}\n */\n #embeddedStoreManager;\n #embeddedAPI;\n\n /**\n * @type {string}\n */\n #uuidv4;\n\n /**\n * @type {TJSDocumentOptions}\n */\n #options = { delete: void 0, preDelete: void 0 };\n\n #subscriptions = [];\n #updateOptions;\n\n /**\n * @param {foundry.abstract.Document | TJSDocumentOptions} [document] - Document to wrap or TJSDocumentOptions.\n *\n * @param {TJSDocumentOptions} [options] - TJSDocument options.\n */\n constructor(document, options = {})\n {\n this.#uuidv4 = `tjs-document-${uuidv4()}`;\n\n if (isPlainObject(document)) // Handle case when only options are passed into ctor.\n {\n this.setOptions(document);\n }\n else\n {\n this.setOptions(options);\n this.set(document);\n }\n }\n\n /**\n * @returns {EmbeddedAPI} Embedded store manager.\n */\n get embedded()\n {\n if (!this.#embeddedAPI)\n {\n this.#embeddedStoreManager = new EmbeddedStoreManager(this.#document);\n this.#embeddedAPI = {\n create: (embeddedName, options) => this.#embeddedStoreManager.create(embeddedName, options),\n destroy: (embeddedName, storeName) => this.#embeddedStoreManager.destroy(embeddedName, storeName),\n get: (embeddedName, storeName) => this.#embeddedStoreManager.get(embeddedName, storeName)\n };\n }\n\n return this.#embeddedAPI;\n }\n\n /**\n * Returns the options passed on last update.\n *\n * @returns {object} Last update options.\n */\n get updateOptions() { return this.#updateOptions ?? {}; }\n\n /**\n * Returns the UUID assigned to this store.\n *\n * @returns {string} UUID\n */\n get uuidv4() { return this.#uuidv4; }\n\n /**\n * Handles cleanup when the document is deleted. Invoking any optional delete function set in the constructor.\n *\n * @returns {Promise<void>}\n */\n async #deleted()\n {\n const doc = this.#document[0];\n\n // Check to see if the document is still in the associated collection to determine if actually deleted.\n if (doc instanceof globalThis.foundry.abstract.Document && !doc?.collection?.has(doc.id))\n {\n delete doc?.apps[this.#uuidv4];\n this.#setDocument(void 0);\n\n if (typeof this.#options.preDelete === 'function')\n {\n await this.#options.preDelete(doc);\n }\n\n this.#updateSubscribers(false, { action: 'delete', data: void 0 });\n\n if (typeof this.#options.delete === 'function')\n {\n await this.#options.delete(doc);\n }\n\n this.#updateOptions = void 0;\n }\n }\n\n /**\n * Completely removes all internal subscribers, any optional delete callback, and unregisters from the\n * ClientDocumentMixin `apps` tracking object.\n */\n destroy()\n {\n const doc = this.#document[0];\n\n if (this.#embeddedStoreManager)\n {\n this.#embeddedStoreManager.destroy();\n this.#embeddedStoreManager = void 0;\n this.#embeddedAPI = void 0;\n }\n\n if (doc instanceof globalThis.foundry.abstract.Document)\n {\n delete doc?.apps[this.#uuidv4];\n this.#setDocument(void 0);\n }\n\n this.#options.delete = void 0;\n this.#subscriptions.length = 0;\n }\n\n /**\n * @param {boolean} [force] - unused - signature from Foundry render function.\n *\n * @param {object} [options] - Options from render call; will have document update context.\n */\n #updateSubscribers(force = false, options = {}) // eslint-disable-line no-unused-vars\n {\n this.#updateOptions = options;\n\n const doc = this.#document[0];\n\n for (let cntr = 0; cntr < this.#subscriptions.length; cntr++) { this.#subscriptions[cntr](doc, options); }\n\n if (this.#embeddedStoreManager)\n {\n this.#embeddedStoreManager.handleUpdate(options.renderContext);\n }\n }\n\n /**\n * @returns {foundry.abstract.Document | undefined} Current document\n */\n get() { return this.#document[0]; }\n\n /**\n * @param {foundry.abstract.Document | undefined} document - New document to set.\n *\n * @param {object} [options] - New document update options to set.\n */\n set(document, options = {})\n {\n if (this.#document[0])\n {\n delete this.#document[0].apps[this.#uuidv4];\n }\n\n if (document !== void 0 && !(document instanceof globalThis.foundry.abstract.Document))\n {\n throw new TypeError(`TJSDocument set error: 'document' is not a valid Document or undefined.`);\n }\n\n if (options === null || typeof options !== 'object')\n {\n throw new TypeError(`TJSDocument set error: 'options' is not an object.`);\n }\n\n if (document instanceof globalThis.foundry.abstract.Document)\n {\n document.apps[this.#uuidv4] = {\n close: this.#deleted.bind(this),\n render: this.#updateSubscribers.bind(this)\n };\n }\n\n this.#setDocument(document);\n this.#updateOptions = options;\n this.#updateSubscribers();\n }\n\n /**\n *\n * @param {foundry.abstract.Document | undefined} doc -\n */\n #setDocument(doc)\n {\n this.#document[0] = doc;\n\n if (this.#embeddedStoreManager) { this.#embeddedStoreManager.handleDocChange(); }\n }\n\n /**\n * Potentially sets new document from data transfer object.\n *\n * @param {object} data - Document transfer data.\n *\n * @param {ParseDataTransferOptions & TJSDocumentOptions} [options] - Optional parameters.\n *\n * @returns {Promise<boolean>} Returns true if new document set from data transfer blob.\n */\n async setFromDataTransfer(data, options)\n {\n return this.setFromUUID(getUUIDFromDataTransfer(data, options), options);\n }\n\n /**\n * Sets the document by Foundry UUID performing a lookup and setting the document if found.\n *\n * @param {string} uuid - A Foundry UUID to lookup.\n *\n * @param {TJSDocumentOptions} [options] - New document update options to set.\n *\n * @returns {Promise<boolean>} True if successfully set document from UUID.\n */\n async setFromUUID(uuid, options = {})\n {\n if (typeof uuid !== 'string' || uuid.length === 0) { return false; }\n\n try\n {\n const doc = await globalThis.fromUuid(uuid);\n\n if (doc)\n {\n this.set(doc, options);\n return true;\n }\n }\n catch (err) { /**/ }\n\n return false;\n }\n\n /**\n * Sets options for this document wrapper / store.\n *\n * @param {TJSDocumentOptions} options - Options for TJSDocument.\n */\n setOptions(options)\n {\n if (!isObject(options))\n {\n throw new TypeError(`TJSDocument error: 'options' is not a plain object.`);\n }\n\n // Verify valid values -------------\n\n if (options.delete !== void 0 && typeof options.delete !== 'function')\n {\n throw new TypeError(`TJSDocument error: 'delete' attribute in options is not a function.`);\n }\n\n if (options.preDelete !== void 0 && typeof options.preDelete !== 'function')\n {\n throw new TypeError(`TJSDocument error: 'preDelete' attribute in options is not a function.`);\n }\n\n // Set any valid values -------------\n\n if (options.delete === void 0 || typeof options.delete === 'function')\n {\n this.#options.delete = options.delete;\n }\n\n if (options.preDelete === void 0 || typeof options.preDelete === 'function')\n {\n this.#options.preDelete = options.preDelete;\n }\n }\n\n /**\n * @param {function(foundry.abstract.Document, object): void} handler - Callback function that is invoked on update / changes.\n *\n * @returns {(function(): void)} Unsubscribe function.\n */\n subscribe(handler)\n {\n this.#subscriptions.push(handler); // Add handler to the array of subscribers.\n\n const updateOptions = { action: 'subscribe', data: void 0 };\n\n handler(this.#document[0], updateOptions); // Call handler with current value and update options.\n\n // Return unsubscribe function.\n return () =>\n {\n const index = this.#subscriptions.findIndex((sub) => sub === handler);\n if (index >= 0) { this.#subscriptions.splice(index, 1); }\n };\n }\n}\n\n/**\n * @typedef {object} TJSDocumentOptions\n *\n * @property {(doc: foundry.abstract.Document) => void} [delete] - Optional post delete function to invoke when\n * document is deleted _after_ subscribers have been notified.\n *\n * @property {(doc: foundry.abstract.Document) => void} [preDelete] - Optional pre delete function to invoke when\n * document is deleted _before_ subscribers are notified.\n */\n\n/**\n * @typedef {object} EmbeddedAPI\n *\n * @property {(embeddedName: string, options: import('@typhonjs-fvtt/runtime/svelte/store').OptionsDynMapCreate<string, any>) => import('@typhonjs-fvtt/runtime/svelte/store').DynMapReducer<string, T>} create - Creates an embedded collection store.\n *\n * @property {(embeddedName?: string, storeName?: string) => boolean} destroy - Destroys one or more embedded collection stores.\n *\n * @property {(embeddedName: string, storeName: string) => import('@typhonjs-fvtt/runtime/svelte/store').DynMapReducer<string, T>} get - Returns a specific existing embedded collection store.\n */\n\n/**\n * Provides a wrapper implementing the Svelte store / subscriber protocol around any DocumentCollection. This makes\n * document collections reactive in a Svelte component, but otherwise provides subscriber functionality external to\n * Svelte.\n *\n * @template {DocumentCollection} T\n */\nclass TJSDocumentCollection\n{\n #collection;\n #collectionCallback;\n #uuid;\n\n /**\n * @type {TJSDocumentCollectionOptions}\n */\n #options = { delete: void 0, preDelete: void 0 };\n\n #subscriptions = [];\n #updateOptions;\n\n /**\n * @param {T|TJSDocumentCollectionOptions} [collection] - Collection to wrap or TJSDocumentCollectionOptions.\n *\n * @param {TJSDocumentCollectionOptions} [options] - TJSDocumentCollection options.\n */\n constructor(collection, options = {})\n {\n this.#uuid = `tjs-collection-${uuidv4()}`;\n\n if (isPlainObject(collection)) // Handle case when only options are passed into ctor.\n {\n this.setOptions(collection);\n }\n else\n {\n this.setOptions(options);\n this.set(collection);\n }\n }\n\n /**\n * Returns the options passed on last update.\n *\n * @returns {object} Last update options.\n */\n get updateOptions() { return this.#updateOptions ?? {}; }\n\n /**\n * Returns the UUID assigned to this store.\n *\n * @returns {*} UUID\n */\n get uuid() { return this.#uuid; }\n\n /**\n * Handles cleanup when the collection is deleted. Invoking any optional delete function set in the constructor.\n *\n * @returns {Promise<void>}\n */\n async #deleted()\n {\n const collection = this.#collection;\n\n if (collection instanceof DocumentCollection)\n {\n const index = collection?.apps?.findIndex((sub) => sub === this.#collectionCallback);\n if (index >= 0) { collection?.apps?.splice(index, 1); }\n\n this.#collection = void 0;\n }\n\n if (typeof this.#options.preDelete === 'function')\n {\n await this.#options.preDelete(collection);\n }\n\n this.#notify(false, { action: 'delete', documentType: collection.documentName, documents: [], data: [] });\n\n if (typeof this.#options.delete === 'function')\n {\n await this.#options.delete(collection);\n }\n\n this.#updateOptions = void 0;\n }\n\n /**\n * Completely removes all internal subscribers, any optional delete callback, and unregisters from the\n * DocumentCollection `apps` tracking array.\n */\n destroy()\n {\n const collection = this.#collection;\n\n if (collection instanceof DocumentCollection)\n {\n const index = collection?.apps?.findIndex((sub) => sub === this.#collectionCallback);\n if (index >= 0) { collection?.apps?.splice(index, 1); }\n\n this.#collection = void 0;\n }\n\n this.#options.delete = void 0;\n this.#subscriptions.length = 0;\n }\n\n /**\n * @param {boolean} [force] - unused - signature from Foundry render function.\n *\n * @param {object} [options] - Options from render call; will have collection update context.\n */\n #notify(force = false, options = {}) // eslint-disable-line no-unused-vars\n {\n this.#updateOptions = options;\n\n // Subscriptions are stored locally as on the browser Babel is still used for private class fields / Babel\n // support until 2023. IE not doing this will require several extra method calls otherwise.\n const subscriptions = this.#subscriptions;\n const collection = this.#collection;\n\n for (let cntr = 0; cntr < subscriptions.length; cntr++) { subscriptions[cntr](collection, options); }\n }\n\n /**\n * @returns {T | undefined} Current collection\n */\n get() { return this.#collection; }\n\n /**\n * @param {T | undefined} collection - New collection to set.\n *\n * @param {object} [options] - New collection update options to set.\n */\n set(collection, options = {})\n {\n if (this.#collection)\n {\n const index = this.#collection.apps.findIndex((sub) => sub === this.#collectionCallback);\n if (index >= 0) { this.#collection.apps.splice(index, 1); }\n\n this.#collectionCallback = void 0;\n }\n\n if (collection !== void 0 && !(collection instanceof DocumentCollection))\n {\n throw new TypeError(\n `TJSDocumentCollection set error: 'collection' is not a valid DocumentCollection or undefined.`);\n }\n\n if (!isObject(options))\n {\n throw new TypeError(`TJSDocument set error: 'options' is not an object.`);\n }\n\n if (collection instanceof DocumentCollection)\n {\n this.#collectionCallback = {\n close: this.#deleted.bind(this),\n render: this.#notify.bind(this)\n };\n\n collection?.apps?.push(this.#collectionCallback);\n }\n\n this.#collection = collection;\n this.#updateOptions = options;\n this.#notify();\n }\n\n /**\n * Sets options for this collection wrapper / store.\n *\n * @param {TJSDocumentCollectionOptions} options - Options for TJSDocumentCollection.\n */\n setOptions(options)\n {\n if (!isObject(options))\n {\n throw new TypeError(`TJSDocumentCollection error: 'options' is not an object.`);\n }\n\n // Verify valid values -------------\n\n if (options.delete !== void 0 && typeof options.delete !== 'function')\n {\n throw new TypeError(`TJSDocumentCollection error: 'delete' attribute in options is not a function.`);\n }\n\n if (options.preDelete !== void 0 && typeof options.preDelete !== 'function')\n {\n throw new TypeError(`TJSDocumentCollection error: 'preDelete' attribute in options is not a function.`);\n }\n\n // Set any valid values -------------\n\n if (options.delete === void 0 || typeof options.delete === 'function')\n {\n this.#options.delete = options.delete;\n }\n\n if (options.preDelete === void 0 || typeof options.preDelete === 'function')\n {\n this.#options.preDelete = options.preDelete;\n }\n }\n\n /**\n * @param {function(T, object): void} handler - Callback function that is invoked on update / changes.\n *\n * @returns {(function(): void)} Unsubscribe function.\n */\n subscribe(handler)\n {\n this.#subscriptions.push(handler); // Add handler to the array of subscribers.\n\n const collection = this.#collection;\n\n const documentType = collection?.documentName ?? void 0;\n\n const updateOptions = { action: 'subscribe', documentType, documents: [], data: [] };\n\n handler(collection, updateOptions); // Call handler with current value and update options.\n\n // Return unsubscribe function.\n return () =>\n {\n const index = this.#subscriptions.findIndex((sub) => sub === handler);\n if (index >= 0) { this.#subscriptions.splice(index, 1); }\n };\n }\n}\n\n/**\n * @typedef TJSDocumentCollectionOptions\n *\n * @property {(collection: foundry.abstract.DocumentCollection) => void} [delete] - Optional post delete function\n * to invoke when document is deleted _after_ subscribers have been notified.\n *\n * @property {(collection: foundry.abstract.DocumentCollection) => void} [preDelete] - Optional pre delete function to\n * invoke when document is deleted _before_ subscribers are notified.\n */\n\nconst storeState = writable$2(void 0);\n\n/**\n * @type {GameState} Provides a Svelte store wrapping the Foundry runtime / global game state.\n */\nconst gameState = {\n subscribe: storeState.subscribe,\n get: () => game\n};\n\nObject.freeze(gameState);\n\nHooks.once('ready', () => storeState.set(game));\n\nexport { DerivedArrayReducer, DerivedMapReducer, DynArrayReducer, DynMapReducer, KeyStore, TJSDocument, TJSDocumentCollection, TJSLocalStorage, TJSSessionStorage, gameState, isReadableStore, isUpdatableStore, isWritableStore, propertyStore, subscribeFirstRest, subscribeIgnoreFirst, writableDerived };\n//# sourceMappingURL=index.js.map\n","export { identity as linear } from '../internal/index.mjs';\n\n/*\nAdapted from https://github.com/mattdesl\nDistributed under MIT License https://github.com/mattdesl/eases/blob/master/LICENSE.md\n*/\nfunction backInOut(t) {\n const s = 1.70158 * 1.525;\n if ((t *= 2) < 1)\n return 0.5 * (t * t * ((s + 1) * t - s));\n return 0.5 * ((t -= 2) * t * ((s + 1) * t + s) + 2);\n}\nfunction backIn(t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n}\nfunction backOut(t) {\n const s = 1.70158;\n return --t * t * ((s + 1) * t + s) + 1;\n}\nfunction bounceOut(t) {\n const a = 4.0 / 11.0;\n const b = 8.0 / 11.0;\n const c = 9.0 / 10.0;\n const ca = 4356.0 / 361.0;\n const cb = 35442.0 / 1805.0;\n const cc = 16061.0 / 1805.0;\n const t2 = t * t;\n return t < a\n ? 7.5625 * t2\n : t < b\n ? 9.075 * t2 - 9.9 * t + 3.4\n : t < c\n ? ca * t2 - cb * t + cc\n : 10.8 * t * t - 20.52 * t + 10.72;\n}\nfunction bounceInOut(t) {\n return t < 0.5\n ? 0.5 * (1.0 - bounceOut(1.0 - t * 2.0))\n : 0.5 * bounceOut(t * 2.0 - 1.0) + 0.5;\n}\nfunction bounceIn(t) {\n return 1.0 - bounceOut(1.0 - t);\n}\nfunction circInOut(t) {\n if ((t *= 2) < 1)\n return -0.5 * (Math.sqrt(1 - t * t) - 1);\n return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n}\nfunction circIn(t) {\n return 1.0 - Math.sqrt(1.0 - t * t);\n}\nfunction circOut(t) {\n return Math.sqrt(1 - --t * t);\n}\nfunction cubicInOut(t) {\n return t < 0.5 ? 4.0 * t * t * t : 0.5 * Math.pow(2.0 * t - 2.0, 3.0) + 1.0;\n}\nfunction cubicIn(t) {\n return t * t * t;\n}\nfunction cubicOut(t) {\n const f = t - 1.0;\n return f * f * f + 1.0;\n}\nfunction elasticInOut(t) {\n return t < 0.5\n ? 0.5 *\n Math.sin(((+13.0 * Math.PI) / 2) * 2.0 * t) *\n Math.pow(2.0, 10.0 * (2.0 * t - 1.0))\n : 0.5 *\n Math.sin(((-13.0 * Math.PI) / 2) * (2.0 * t - 1.0 + 1.0)) *\n Math.pow(2.0, -10.0 * (2.0 * t - 1.0)) +\n 1.0;\n}\nfunction elasticIn(t) {\n return Math.sin((13.0 * t * Math.PI) / 2) * Math.pow(2.0, 10.0 * (t - 1.0));\n}\nfunction elasticOut(t) {\n return (Math.sin((-13.0 * (t + 1.0) * Math.PI) / 2) * Math.pow(2.0, -10.0 * t) + 1.0);\n}\nfunction expoInOut(t) {\n return t === 0.0 || t === 1.0\n ? t\n : t < 0.5\n ? +0.5 * Math.pow(2.0, 20.0 * t - 10.0)\n : -0.5 * Math.pow(2.0, 10.0 - t * 20.0) + 1.0;\n}\nfunction expoIn(t) {\n return t === 0.0 ? t : Math.pow(2.0, 10.0 * (t - 1.0));\n}\nfunction expoOut(t) {\n return t === 1.0 ? t : 1.0 - Math.pow(2.0, -10.0 * t);\n}\nfunction quadInOut(t) {\n t /= 0.5;\n if (t < 1)\n return 0.5 * t * t;\n t--;\n return -0.5 * (t * (t - 2) - 1);\n}\nfunction quadIn(t) {\n return t * t;\n}\nfunction quadOut(t) {\n return -t * (t - 2.0);\n}\nfunction quartInOut(t) {\n return t < 0.5\n ? +8.0 * Math.pow(t, 4.0)\n : -8.0 * Math.pow(t - 1.0, 4.0) + 1.0;\n}\nfunction quartIn(t) {\n return Math.pow(t, 4.0);\n}\nfunction quartOut(t) {\n return Math.pow(t - 1.0, 3.0) * (1.0 - t) + 1.0;\n}\nfunction quintInOut(t) {\n if ((t *= 2) < 1)\n return 0.5 * t * t * t * t * t;\n return 0.5 * ((t -= 2) * t * t * t * t + 2);\n}\nfunction quintIn(t) {\n return t * t * t * t * t;\n}\nfunction quintOut(t) {\n return --t * t * t * t * t + 1;\n}\nfunction sineInOut(t) {\n return -0.5 * (Math.cos(Math.PI * t) - 1);\n}\nfunction sineIn(t) {\n const v = Math.cos(t * Math.PI * 0.5);\n if (Math.abs(v) < 1e-14)\n return 1;\n else\n return 1 - v;\n}\nfunction sineOut(t) {\n return Math.sin((t * Math.PI) / 2);\n}\n\nexport { backIn, backInOut, backOut, bounceIn, bounceInOut, bounceOut, circIn, circInOut, circOut, cubicIn, cubicInOut, cubicOut, elasticIn, elasticInOut, elasticOut, expoIn, expoInOut, expoOut, quadIn, quadInOut, quadOut, quartIn, quartInOut, quartOut, quintIn, quintInOut, quintOut, sineIn, sineInOut, sineOut };\n","/**\n * Performs linear interpolation between a start & end value by given amount between 0 - 1 inclusive.\n *\n * @param {number} start - Start value.\n *\n * @param {number} end - End value.\n *\n * @param {number} amount - Current amount between 0 - 1 inclusive.\n *\n * @returns {number} Linear interpolated value between start & end.\n */\nfunction lerp$5(start, end, amount)\n{\n return (1 - amount) * start + amount * end;\n}\n\n/**\n * Converts the given number from degrees to radians.\n *\n * @param {number} deg - Degree number to convert\n *\n * @returns {number} Degree as radians.\n */\nfunction degToRad(deg)\n{\n return deg * (Math.PI / 180.0);\n}\n\n/**\n * Converts the given number from radians to degrees.\n *\n * @param {number} rad - Radian number to convert.\n *\n * @returns {number} Degree as radians.\n */\nfunction radToDeg(rad)\n{\n return rad * (180.0 / Math.PI);\n}\n\n/**\n * Common utilities\n * @module glMatrix\n */\n// Configuration Constants\nvar EPSILON = 0.000001;\nvar ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nvar RANDOM = Math.random;\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\n\nfunction setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\n\nfunction toRadian(a) {\n return a * degree;\n}\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\n\nfunction equals$9(a, b) {\n return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b));\n}\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};\n\nconst common = /*#__PURE__*/Object.freeze({\n __proto__: null,\n get ARRAY_TYPE () { return ARRAY_TYPE; },\n EPSILON: EPSILON,\n RANDOM: RANDOM,\n equals: equals$9,\n setMatrixArrayType: setMatrixArrayType,\n toRadian: toRadian\n});\n\n/**\n * 2x2 Matrix\n * @module mat2\n */\n\n/**\n * Creates a new identity mat2\n *\n * @returns {mat2} a new 2x2 matrix\n */\n\nfunction create$8() {\n var out = new ARRAY_TYPE(4);\n\n if (ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n }\n\n out[0] = 1;\n out[3] = 1;\n return out;\n}\n/**\n * Creates a new mat2 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat2} a matrix to clone\n * @returns {mat2} a new 2x2 matrix\n */\n\nfunction clone$8(a) {\n var out = new ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Copy the values from one mat2 to another\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\n\nfunction copy$8(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set a mat2 to the identity matrix\n *\n * @param {mat2} out the receiving matrix\n * @returns {mat2} out\n */\n\nfunction identity$5(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Create a new mat2 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out A new 2x2 matrix\n */\n\nfunction fromValues$8(m00, m01, m10, m11) {\n var out = new ARRAY_TYPE(4);\n out[0] = m00;\n out[1] = m01;\n out[2] = m10;\n out[3] = m11;\n return out;\n}\n/**\n * Set the components of a mat2 to the given values\n *\n * @param {mat2} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out\n */\n\nfunction set$8(out, m00, m01, m10, m11) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m10;\n out[3] = m11;\n return out;\n}\n/**\n * Transpose the values of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\n\nfunction transpose$2(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache\n // some values\n if (out === a) {\n var a1 = a[1];\n out[1] = a[2];\n out[2] = a1;\n } else {\n out[0] = a[0];\n out[1] = a[2];\n out[2] = a[1];\n out[3] = a[3];\n }\n\n return out;\n}\n/**\n * Inverts a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\n\nfunction invert$5(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3]; // Calculate the determinant\n\n var det = a0 * a3 - a2 * a1;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = a3 * det;\n out[1] = -a1 * det;\n out[2] = -a2 * det;\n out[3] = a0 * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the source matrix\n * @returns {mat2} out\n */\n\nfunction adjoint$2(out, a) {\n // Caching this value is nessecary if out == a\n var a0 = a[0];\n out[0] = a[3];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a0;\n return out;\n}\n/**\n * Calculates the determinant of a mat2\n *\n * @param {ReadonlyMat2} a the source matrix\n * @returns {Number} determinant of a\n */\n\nfunction determinant$3(a) {\n return a[0] * a[3] - a[2] * a[1];\n}\n/**\n * Multiplies two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @returns {mat2} out\n */\n\nfunction multiply$8(out, a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = a0 * b0 + a2 * b1;\n out[1] = a1 * b0 + a3 * b1;\n out[2] = a0 * b2 + a2 * b3;\n out[3] = a1 * b2 + a3 * b3;\n return out;\n}\n/**\n * Rotates a mat2 by the given angle\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\n\nfunction rotate$4(out, a, rad) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n out[0] = a0 * c + a2 * s;\n out[1] = a1 * c + a3 * s;\n out[2] = a0 * -s + a2 * c;\n out[3] = a1 * -s + a3 * c;\n return out;\n}\n/**\n * Scales the mat2 by the dimensions in the given vec2\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat2} out\n **/\n\nfunction scale$8(out, a, v) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var v0 = v[0],\n v1 = v[1];\n out[0] = a0 * v0;\n out[1] = a1 * v0;\n out[2] = a2 * v1;\n out[3] = a3 * v1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat2.identity(dest);\n * mat2.rotate(dest, dest, rad);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\n\nfunction fromRotation$4(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = -s;\n out[3] = c;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat2.identity(dest);\n * mat2.scale(dest, dest, vec);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat2} out\n */\n\nfunction fromScaling$3(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = v[1];\n return out;\n}\n/**\n * Returns a string representation of a mat2\n *\n * @param {ReadonlyMat2} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nfunction str$8(a) {\n return \"mat2(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat2\n *\n * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nfunction frob$3(a) {\n return Math.hypot(a[0], a[1], a[2], a[3]);\n}\n/**\n * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix\n * @param {ReadonlyMat2} L the lower triangular matrix\n * @param {ReadonlyMat2} D the diagonal matrix\n * @param {ReadonlyMat2} U the upper triangular matrix\n * @param {ReadonlyMat2} a the input matrix to factorize\n */\n\nfunction LDU(L, D, U, a) {\n L[2] = a[2] / a[0];\n U[0] = a[0];\n U[1] = a[1];\n U[3] = a[3] - L[2] * U[1];\n return [L, D, U];\n}\n/**\n * Adds two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @returns {mat2} out\n */\n\nfunction add$8(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @returns {mat2} out\n */\n\nfunction subtract$6(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat2} a The first matrix.\n * @param {ReadonlyMat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction exactEquals$8(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat2} a The first matrix.\n * @param {ReadonlyMat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction equals$8(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2} out the receiving matrix\n * @param {ReadonlyMat2} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2} out\n */\n\nfunction multiplyScalar$3(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two mat2's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2} out the receiving vector\n * @param {ReadonlyMat2} a the first operand\n * @param {ReadonlyMat2} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2} out\n */\n\nfunction multiplyScalarAndAdd$3(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Alias for {@link mat2.multiply}\n * @function\n */\n\nvar mul$8 = multiply$8;\n/**\n * Alias for {@link mat2.subtract}\n * @function\n */\n\nvar sub$6 = subtract$6;\n\nconst mat2 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n LDU: LDU,\n add: add$8,\n adjoint: adjoint$2,\n clone: clone$8,\n copy: copy$8,\n create: create$8,\n determinant: determinant$3,\n equals: equals$8,\n exactEquals: exactEquals$8,\n frob: frob$3,\n fromRotation: fromRotation$4,\n fromScaling: fromScaling$3,\n fromValues: fromValues$8,\n identity: identity$5,\n invert: invert$5,\n mul: mul$8,\n multiply: multiply$8,\n multiplyScalar: multiplyScalar$3,\n multiplyScalarAndAdd: multiplyScalarAndAdd$3,\n rotate: rotate$4,\n scale: scale$8,\n set: set$8,\n str: str$8,\n sub: sub$6,\n subtract: subtract$6,\n transpose: transpose$2\n});\n\n/**\n * 2x3 Matrix\n * @module mat2d\n * @description\n * A mat2d contains six elements defined as:\n * <pre>\n * [a, b,\n * c, d,\n * tx, ty]\n * </pre>\n * This is a short form for the 3x3 matrix:\n * <pre>\n * [a, b, 0,\n * c, d, 0,\n * tx, ty, 1]\n * </pre>\n * The last column is ignored so the array is shorter and operations are faster.\n */\n\n/**\n * Creates a new identity mat2d\n *\n * @returns {mat2d} a new 2x3 matrix\n */\n\nfunction create$7() {\n var out = new ARRAY_TYPE(6);\n\n if (ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[4] = 0;\n out[5] = 0;\n }\n\n out[0] = 1;\n out[3] = 1;\n return out;\n}\n/**\n * Creates a new mat2d initialized with values from an existing matrix\n *\n * @param {ReadonlyMat2d} a matrix to clone\n * @returns {mat2d} a new 2x3 matrix\n */\n\nfunction clone$7(a) {\n var out = new ARRAY_TYPE(6);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n return out;\n}\n/**\n * Copy the values from one mat2d to another\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the source matrix\n * @returns {mat2d} out\n */\n\nfunction copy$7(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n return out;\n}\n/**\n * Set a mat2d to the identity matrix\n *\n * @param {mat2d} out the receiving matrix\n * @returns {mat2d} out\n */\n\nfunction identity$4(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n return out;\n}\n/**\n * Create a new mat2d with the given values\n *\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} A new mat2d\n */\n\nfunction fromValues$7(a, b, c, d, tx, ty) {\n var out = new ARRAY_TYPE(6);\n out[0] = a;\n out[1] = b;\n out[2] = c;\n out[3] = d;\n out[4] = tx;\n out[5] = ty;\n return out;\n}\n/**\n * Set the components of a mat2d to the given values\n *\n * @param {mat2d} out the receiving matrix\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} out\n */\n\nfunction set$7(out, a, b, c, d, tx, ty) {\n out[0] = a;\n out[1] = b;\n out[2] = c;\n out[3] = d;\n out[4] = tx;\n out[5] = ty;\n return out;\n}\n/**\n * Inverts a mat2d\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the source matrix\n * @returns {mat2d} out\n */\n\nfunction invert$4(out, a) {\n var aa = a[0],\n ab = a[1],\n ac = a[2],\n ad = a[3];\n var atx = a[4],\n aty = a[5];\n var det = aa * ad - ab * ac;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = ad * det;\n out[1] = -ab * det;\n out[2] = -ac * det;\n out[3] = aa * det;\n out[4] = (ac * aty - ad * atx) * det;\n out[5] = (ab * atx - aa * aty) * det;\n return out;\n}\n/**\n * Calculates the determinant of a mat2d\n *\n * @param {ReadonlyMat2d} a the source matrix\n * @returns {Number} determinant of a\n */\n\nfunction determinant$2(a) {\n return a[0] * a[3] - a[1] * a[2];\n}\n/**\n * Multiplies two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the first operand\n * @param {ReadonlyMat2d} b the second operand\n * @returns {mat2d} out\n */\n\nfunction multiply$7(out, a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5];\n out[0] = a0 * b0 + a2 * b1;\n out[1] = a1 * b0 + a3 * b1;\n out[2] = a0 * b2 + a2 * b3;\n out[3] = a1 * b2 + a3 * b3;\n out[4] = a0 * b4 + a2 * b5 + a4;\n out[5] = a1 * b4 + a3 * b5 + a5;\n return out;\n}\n/**\n * Rotates a mat2d by the given angle\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\n\nfunction rotate$3(out, a, rad) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5];\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n out[0] = a0 * c + a2 * s;\n out[1] = a1 * c + a3 * s;\n out[2] = a0 * -s + a2 * c;\n out[3] = a1 * -s + a3 * c;\n out[4] = a4;\n out[5] = a5;\n return out;\n}\n/**\n * Scales the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to translate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat2d} out\n **/\n\nfunction scale$7(out, a, v) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5];\n var v0 = v[0],\n v1 = v[1];\n out[0] = a0 * v0;\n out[1] = a1 * v0;\n out[2] = a2 * v1;\n out[3] = a3 * v1;\n out[4] = a4;\n out[5] = a5;\n return out;\n}\n/**\n * Translates the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to translate\n * @param {ReadonlyVec2} v the vec2 to translate the matrix by\n * @returns {mat2d} out\n **/\n\nfunction translate$3(out, a, v) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5];\n var v0 = v[0],\n v1 = v[1];\n out[0] = a0;\n out[1] = a1;\n out[2] = a2;\n out[3] = a3;\n out[4] = a0 * v0 + a2 * v1 + a4;\n out[5] = a1 * v0 + a3 * v1 + a5;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat2d.identity(dest);\n * mat2d.rotate(dest, dest, rad);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\n\nfunction fromRotation$3(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = -s;\n out[3] = c;\n out[4] = 0;\n out[5] = 0;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat2d.identity(dest);\n * mat2d.scale(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat2d} out\n */\n\nfunction fromScaling$2(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = v[1];\n out[4] = 0;\n out[5] = 0;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat2d.identity(dest);\n * mat2d.translate(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat2d} out\n */\n\nfunction fromTranslation$3(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = v[0];\n out[5] = v[1];\n return out;\n}\n/**\n * Returns a string representation of a mat2d\n *\n * @param {ReadonlyMat2d} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nfunction str$7(a) {\n return \"mat2d(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat2d\n *\n * @param {ReadonlyMat2d} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nfunction frob$2(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1);\n}\n/**\n * Adds two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the first operand\n * @param {ReadonlyMat2d} b the second operand\n * @returns {mat2d} out\n */\n\nfunction add$7(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the first operand\n * @param {ReadonlyMat2d} b the second operand\n * @returns {mat2d} out\n */\n\nfunction subtract$5(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2d} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2d} out\n */\n\nfunction multiplyScalar$2(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n return out;\n}\n/**\n * Adds two mat2d's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2d} out the receiving vector\n * @param {ReadonlyMat2d} a the first operand\n * @param {ReadonlyMat2d} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2d} out\n */\n\nfunction multiplyScalarAndAdd$2(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat2d} a The first matrix.\n * @param {ReadonlyMat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction exactEquals$7(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat2d} a The first matrix.\n * @param {ReadonlyMat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction equals$7(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5));\n}\n/**\n * Alias for {@link mat2d.multiply}\n * @function\n */\n\nvar mul$7 = multiply$7;\n/**\n * Alias for {@link mat2d.subtract}\n * @function\n */\n\nvar sub$5 = subtract$5;\n\nconst mat2d = /*#__PURE__*/Object.freeze({\n __proto__: null,\n add: add$7,\n clone: clone$7,\n copy: copy$7,\n create: create$7,\n determinant: determinant$2,\n equals: equals$7,\n exactEquals: exactEquals$7,\n frob: frob$2,\n fromRotation: fromRotation$3,\n fromScaling: fromScaling$2,\n fromTranslation: fromTranslation$3,\n fromValues: fromValues$7,\n identity: identity$4,\n invert: invert$4,\n mul: mul$7,\n multiply: multiply$7,\n multiplyScalar: multiplyScalar$2,\n multiplyScalarAndAdd: multiplyScalarAndAdd$2,\n rotate: rotate$3,\n scale: scale$7,\n set: set$7,\n str: str$7,\n sub: sub$5,\n subtract: subtract$5,\n translate: translate$3\n});\n\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nfunction create$6() {\n var out = new ARRAY_TYPE(9);\n\n if (ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nfunction fromMat4$1(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\n\nfunction clone$6(a) {\n var out = new ARRAY_TYPE(9);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nfunction copy$6(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\n\nfunction fromValues$6(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n var out = new ARRAY_TYPE(9);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\n\nfunction set$6(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m10;\n out[4] = m11;\n out[5] = m12;\n out[6] = m20;\n out[7] = m21;\n out[8] = m22;\n return out;\n}\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\n\nfunction identity$3(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nfunction transpose$1(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nfunction invert$3(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nfunction adjoint$1(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n out[0] = a11 * a22 - a12 * a21;\n out[1] = a02 * a21 - a01 * a22;\n out[2] = a01 * a12 - a02 * a11;\n out[3] = a12 * a20 - a10 * a22;\n out[4] = a00 * a22 - a02 * a20;\n out[5] = a02 * a10 - a00 * a12;\n out[6] = a10 * a21 - a11 * a20;\n out[7] = a01 * a20 - a00 * a21;\n out[8] = a00 * a11 - a01 * a10;\n return out;\n}\n/**\n * Calculates the determinant of a mat3\n *\n * @param {ReadonlyMat3} a the source matrix\n * @returns {Number} determinant of a\n */\n\nfunction determinant$1(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nfunction multiply$6(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b00 = b[0],\n b01 = b[1],\n b02 = b[2];\n var b10 = b[3],\n b11 = b[4],\n b12 = b[5];\n var b20 = b[6],\n b21 = b[7],\n b22 = b[8];\n out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n return out;\n}\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to translate\n * @param {ReadonlyVec2} v vector to translate by\n * @returns {mat3} out\n */\n\nfunction translate$2(out, a, v) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n x = v[0],\n y = v[1];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a10;\n out[4] = a11;\n out[5] = a12;\n out[6] = x * a00 + y * a10 + a20;\n out[7] = x * a01 + y * a11 + a21;\n out[8] = x * a02 + y * a12 + a22;\n return out;\n}\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nfunction rotate$2(out, a, rad) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a10 = a[3],\n a11 = a[4],\n a12 = a[5],\n a20 = a[6],\n a21 = a[7],\n a22 = a[8],\n s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c * a00 + s * a10;\n out[1] = c * a01 + s * a11;\n out[2] = c * a02 + s * a12;\n out[3] = c * a10 - s * a00;\n out[4] = c * a11 - s * a01;\n out[5] = c * a12 - s * a02;\n out[6] = a20;\n out[7] = a21;\n out[8] = a22;\n return out;\n}\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to rotate\n * @param {ReadonlyVec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\n\nfunction scale$6(out, a, v) {\n var x = v[0],\n y = v[1];\n out[0] = x * a[0];\n out[1] = x * a[1];\n out[2] = x * a[2];\n out[3] = y * a[3];\n out[4] = y * a[4];\n out[5] = y * a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Translation vector\n * @returns {mat3} out\n */\n\nfunction fromTranslation$2(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 1;\n out[5] = 0;\n out[6] = v[0];\n out[7] = v[1];\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\n\nfunction fromRotation$2(out, rad) {\n var s = Math.sin(rad),\n c = Math.cos(rad);\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = -s;\n out[4] = c;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat3.identity(dest);\n * mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyVec2} v Scaling vector\n * @returns {mat3} out\n */\n\nfunction fromScaling$1(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = v[1];\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat2d} a the matrix to copy\n * @returns {mat3} out\n **/\n\nfunction fromMat2d(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = 0;\n out[3] = a[2];\n out[4] = a[3];\n out[5] = 0;\n out[6] = a[4];\n out[7] = a[5];\n out[8] = 1;\n return out;\n}\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\n\nfunction fromQuat$1(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[3] = yx - wz;\n out[6] = zx + wy;\n out[1] = yx + wz;\n out[4] = 1 - xx - zz;\n out[7] = zy - wx;\n out[2] = zx - wy;\n out[5] = zy + wx;\n out[8] = 1 - xx - yy;\n return out;\n}\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\n\nfunction normalFromMat4(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\n\nfunction projection(out, width, height) {\n out[0] = 2 / width;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = -2 / height;\n out[5] = 0;\n out[6] = -1;\n out[7] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat3\n *\n * @param {ReadonlyMat3} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nfunction str$6(a) {\n return \"mat3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nfunction frob$1(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]);\n}\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nfunction add$6(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @returns {mat3} out\n */\n\nfunction subtract$4(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\n\nfunction multiplyScalar$1(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n return out;\n}\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {ReadonlyMat3} a the first operand\n * @param {ReadonlyMat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\n\nfunction multiplyScalarAndAdd$1(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction exactEquals$6(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat3} a The first matrix.\n * @param {ReadonlyMat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction equals$6(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7],\n a8 = a[8];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7],\n b8 = b[8];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8));\n}\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\n\nvar mul$6 = multiply$6;\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\n\nvar sub$4 = subtract$4;\n\nconst mat3 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n add: add$6,\n adjoint: adjoint$1,\n clone: clone$6,\n copy: copy$6,\n create: create$6,\n determinant: determinant$1,\n equals: equals$6,\n exactEquals: exactEquals$6,\n frob: frob$1,\n fromMat2d: fromMat2d,\n fromMat4: fromMat4$1,\n fromQuat: fromQuat$1,\n fromRotation: fromRotation$2,\n fromScaling: fromScaling$1,\n fromTranslation: fromTranslation$2,\n fromValues: fromValues$6,\n identity: identity$3,\n invert: invert$3,\n mul: mul$6,\n multiply: multiply$6,\n multiplyScalar: multiplyScalar$1,\n multiplyScalarAndAdd: multiplyScalarAndAdd$1,\n normalFromMat4: normalFromMat4,\n projection: projection,\n rotate: rotate$2,\n scale: scale$6,\n set: set$6,\n str: str$6,\n sub: sub$4,\n subtract: subtract$4,\n translate: translate$2,\n transpose: transpose$1\n});\n\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\n\nfunction create$5() {\n var out = new ARRAY_TYPE(16);\n\n if (ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\n\nfunction clone$5(a) {\n var out = new ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nfunction copy$5(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\n\nfunction fromValues$5(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\n\nfunction set$5(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\n\nfunction identity$2(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nfunction transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nfunction invert$2(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nfunction adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22);\n out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12);\n out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22);\n out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12);\n out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21);\n out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11);\n out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21);\n out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11);\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nfunction determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nfunction multiply$5(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\n\nfunction translate$1(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n\n return out;\n}\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\n\nfunction scale$5(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nfunction rotate$1(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n\n if (len < EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11]; // Construct the elements of the rotation matrix\n\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c; // Perform rotation-specific matrix multiplication\n\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction rotateX$3(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction rotateY$3(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction rotateZ$3(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n } // Perform axis-specific matrix multiplication\n\n\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nfunction fromTranslation$1(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nfunction fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\n\nfunction fromRotation$1(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.hypot(x, y, z);\n var s, c, t;\n\n if (len < EPSILON) {\n return null;\n }\n\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c; // Perform rotation-specific matrix multiplication\n\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n\nfunction fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad); // Perform axis-specific matrix multiplication\n\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\n\nfunction fromRotationTranslation$1(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\n\nfunction fromQuat2(out, a) {\n var translation = new ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense\n\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n\n fromRotationTranslation$1(out, a, translation);\n return out;\n}\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nfunction getTranslation$1(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nfunction getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nfunction getRotation(out, mat) {\n var scaling = new ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nfunction fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * mat4.translate(dest, origin);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n * mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\n\nfunction fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\n\nfunction fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nfunction frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nfunction perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n\n return out;\n}\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\n\nvar perspective = perspectiveNO;\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\n\nfunction perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2),\n nf;\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n\n if (far != null && far !== Infinity) {\n nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n\n return out;\n}\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nfunction perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nfunction orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\n\nvar ortho = orthoNO;\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\n\nfunction orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nfunction lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n\n if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) {\n return identity$2(out);\n }\n\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.hypot(z0, z1, z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.hypot(x0, x1, x2);\n\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.hypot(y0, y1, y2);\n\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\n\nfunction targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\n\nfunction str$5(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\n\nfunction frob(a) {\n return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n}\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nfunction add$5(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nfunction subtract$3(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\n\nfunction multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\n\nfunction multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction exactEquals$5(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\n\nfunction equals$5(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\n\nvar mul$5 = multiply$5;\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\n\nvar sub$3 = subtract$3;\n\nconst mat4 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n add: add$5,\n adjoint: adjoint,\n clone: clone$5,\n copy: copy$5,\n create: create$5,\n determinant: determinant,\n equals: equals$5,\n exactEquals: exactEquals$5,\n frob: frob,\n fromQuat: fromQuat,\n fromQuat2: fromQuat2,\n fromRotation: fromRotation$1,\n fromRotationTranslation: fromRotationTranslation$1,\n fromRotationTranslationScale: fromRotationTranslationScale,\n fromRotationTranslationScaleOrigin: fromRotationTranslationScaleOrigin,\n fromScaling: fromScaling,\n fromTranslation: fromTranslation$1,\n fromValues: fromValues$5,\n fromXRotation: fromXRotation,\n fromYRotation: fromYRotation,\n fromZRotation: fromZRotation,\n frustum: frustum,\n getRotation: getRotation,\n getScaling: getScaling,\n getTranslation: getTranslation$1,\n identity: identity$2,\n invert: invert$2,\n lookAt: lookAt,\n mul: mul$5,\n multiply: multiply$5,\n multiplyScalar: multiplyScalar,\n multiplyScalarAndAdd: multiplyScalarAndAdd,\n ortho: ortho,\n orthoNO: orthoNO,\n orthoZO: orthoZO,\n perspective: perspective,\n perspectiveFromFieldOfView: perspectiveFromFieldOfView,\n perspectiveNO: perspectiveNO,\n perspectiveZO: perspectiveZO,\n rotate: rotate$1,\n rotateX: rotateX$3,\n rotateY: rotateY$3,\n rotateZ: rotateZ$3,\n scale: scale$5,\n set: set$5,\n str: str$5,\n sub: sub$3,\n subtract: subtract$3,\n targetTo: targetTo,\n translate: translate$1,\n transpose: transpose\n});\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nfunction create$4() {\n var out = new ARRAY_TYPE(3);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\n\nfunction clone$4(a) {\n var out = new ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nfunction length$4(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\n\nfunction fromValues$4(x, y, z) {\n var out = new ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\n\nfunction copy$4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\n\nfunction set$4(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction add$4(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction subtract$2(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction multiply$4(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction divide$2(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\n\nfunction ceil$2(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\n\nfunction floor$2(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction min$2(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction max$2(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\n\nfunction round$2(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nfunction scale$4(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\n\nfunction scaleAndAdd$2(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\n\nfunction distance$2(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nfunction squaredDistance$2(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nfunction squaredLength$4(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\n\nfunction negate$2(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\n\nfunction inverse$2(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nfunction normalize$4(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nfunction dot$4(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction cross$2(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nfunction lerp$4(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nfunction hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\n\nfunction bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\n\nfunction random$3(out, scale) {\n scale = scale || 1.0;\n var r = RANDOM() * 2.0 * Math.PI;\n var z = RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nfunction transformMat4$2(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nfunction transformMat3$1(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec3} out\n */\n\nfunction transformQuat$1(out, a, q) {\n // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var x = a[0],\n y = a[1],\n z = a[2]; // var qvec = [qx, qy, qz];\n // var uv = vec3.cross([], qvec, a);\n\n var uvx = qy * z - qz * y,\n uvy = qz * x - qx * z,\n uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv);\n\n var uuvx = qy * uvz - qz * uvy,\n uuvy = qz * uvx - qx * uvz,\n uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w);\n\n var w2 = qw * 2;\n uvx *= w2;\n uvy *= w2;\n uvz *= w2; // vec3.scale(uuv, uuv, 2);\n\n uuvx *= 2;\n uuvy *= 2;\n uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv));\n\n out[0] = x + uvx + uuvx;\n out[1] = y + uvy + uuvy;\n out[2] = z + uvz + uuvz;\n return out;\n}\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nfunction rotateX$2(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nfunction rotateY$2(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\n\nfunction rotateZ$2(out, a, b, rad) {\n var p = [],\n r = []; //Translate point to the origin\n\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2]; //perform rotation\n\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2]; //translate to correct position\n\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\n\nfunction angle$1(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag1 = Math.sqrt(ax * ax + ay * ay + az * az),\n mag2 = Math.sqrt(bx * bx + by * by + bz * bz),\n mag = mag1 * mag2,\n cosine = mag && dot$4(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\n\nfunction zero$2(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nfunction str$4(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction exactEquals$4(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction equals$4(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\n\nvar sub$2 = subtract$2;\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nvar mul$4 = multiply$4;\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\n\nvar div$2 = divide$2;\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\n\nvar dist$2 = distance$2;\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\n\nvar sqrDist$2 = squaredDistance$2;\n/**\n * Alias for {@link vec3.length}\n * @function\n */\n\nvar len$4 = length$4;\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\n\nvar sqrLen$4 = squaredLength$4;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nvar forEach$2 = function () {\n var vec = create$4();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n}();\n\nconst vec3 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n add: add$4,\n angle: angle$1,\n bezier: bezier,\n ceil: ceil$2,\n clone: clone$4,\n copy: copy$4,\n create: create$4,\n cross: cross$2,\n dist: dist$2,\n distance: distance$2,\n div: div$2,\n divide: divide$2,\n dot: dot$4,\n equals: equals$4,\n exactEquals: exactEquals$4,\n floor: floor$2,\n forEach: forEach$2,\n fromValues: fromValues$4,\n hermite: hermite,\n inverse: inverse$2,\n len: len$4,\n length: length$4,\n lerp: lerp$4,\n max: max$2,\n min: min$2,\n mul: mul$4,\n multiply: multiply$4,\n negate: negate$2,\n normalize: normalize$4,\n random: random$3,\n rotateX: rotateX$2,\n rotateY: rotateY$2,\n rotateZ: rotateZ$2,\n round: round$2,\n scale: scale$4,\n scaleAndAdd: scaleAndAdd$2,\n set: set$4,\n sqrDist: sqrDist$2,\n sqrLen: sqrLen$4,\n squaredDistance: squaredDistance$2,\n squaredLength: squaredLength$4,\n str: str$4,\n sub: sub$2,\n subtract: subtract$2,\n transformMat3: transformMat3$1,\n transformMat4: transformMat4$2,\n transformQuat: transformQuat$1,\n zero: zero$2\n});\n\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nfunction create$3() {\n var out = new ARRAY_TYPE(4);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {ReadonlyVec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\n\nfunction clone$3(a) {\n var out = new ARRAY_TYPE(4);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\n\nfunction fromValues$3(x, y, z, w) {\n var out = new ARRAY_TYPE(4);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the source vector\n * @returns {vec4} out\n */\n\nfunction copy$3(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\n\nfunction set$3(out, x, y, z, w) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = w;\n return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction add$3(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction subtract$1(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction multiply$3(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction divide$1(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n out[3] = a[3] / b[3];\n return out;\n}\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to ceil\n * @returns {vec4} out\n */\n\nfunction ceil$1(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n out[3] = Math.ceil(a[3]);\n return out;\n}\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to floor\n * @returns {vec4} out\n */\n\nfunction floor$1(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n out[3] = Math.floor(a[3]);\n return out;\n}\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction min$1(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n out[3] = Math.min(a[3], b[3]);\n return out;\n}\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction max$1(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n out[3] = Math.max(a[3], b[3]);\n return out;\n}\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to round\n * @returns {vec4} out\n */\n\nfunction round$1(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n out[2] = Math.round(a[2]);\n out[3] = Math.round(a[3]);\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nfunction scale$3(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\n\nfunction scaleAndAdd$1(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} distance between a and b\n */\n\nfunction distance$1(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nfunction squaredDistance$1(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n var w = b[3] - a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nfunction length$3(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Calculates the squared length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nfunction squaredLength$3(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return x * x + y * y + z * z + w * w;\n}\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to negate\n * @returns {vec4} out\n */\n\nfunction negate$1(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = -a[3];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to invert\n * @returns {vec4} out\n */\n\nfunction inverse$1(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n out[3] = 1.0 / a[3];\n return out;\n}\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a vector to normalize\n * @returns {vec4} out\n */\n\nfunction normalize$3(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n var len = x * x + y * y + z * z + w * w;\n\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = x * len;\n out[1] = y * len;\n out[2] = z * len;\n out[3] = w * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nfunction dot$3(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n/**\n * Returns the cross-product of three vectors in a 4-dimensional space\n *\n * @param {ReadonlyVec4} result the receiving vector\n * @param {ReadonlyVec4} U the first vector\n * @param {ReadonlyVec4} V the second vector\n * @param {ReadonlyVec4} W the third vector\n * @returns {vec4} result\n */\n\nfunction cross$1(out, u, v, w) {\n var A = v[0] * w[1] - v[1] * w[0],\n B = v[0] * w[2] - v[2] * w[0],\n C = v[0] * w[3] - v[3] * w[0],\n D = v[1] * w[2] - v[2] * w[1],\n E = v[1] * w[3] - v[3] * w[1],\n F = v[2] * w[3] - v[3] * w[2];\n var G = u[0];\n var H = u[1];\n var I = u[2];\n var J = u[3];\n out[0] = H * F - I * E + J * D;\n out[1] = -(G * F) + I * C - J * B;\n out[2] = G * E - H * C + J * A;\n out[3] = -(G * D) + H * B - I * A;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec4} out\n */\n\nfunction lerp$3(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n var aw = a[3];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n out[3] = aw + t * (b[3] - aw);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\n\nfunction random$2(out, scale) {\n scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a\n // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646.\n // http://projecteuclid.org/euclid.aoms/1177692644;\n\n var v1, v2, v3, v4;\n var s1, s2;\n\n do {\n v1 = RANDOM() * 2 - 1;\n v2 = RANDOM() * 2 - 1;\n s1 = v1 * v1 + v2 * v2;\n } while (s1 >= 1);\n\n do {\n v3 = RANDOM() * 2 - 1;\n v4 = RANDOM() * 2 - 1;\n s2 = v3 * v3 + v4 * v4;\n } while (s2 >= 1);\n\n var d = Math.sqrt((1 - s1) / s2);\n out[0] = scale * v1;\n out[1] = scale * v2;\n out[2] = scale * v3 * d;\n out[3] = scale * v4 * d;\n return out;\n}\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec4} out\n */\n\nfunction transformMat4$1(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n return out;\n}\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to transform\n * @param {ReadonlyQuat} q quaternion to transform with\n * @returns {vec4} out\n */\n\nfunction transformQuat(out, a, q) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3]; // calculate quat * vec\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat\n\n out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n out[3] = a[3];\n return out;\n}\n/**\n * Set the components of a vec4 to zero\n *\n * @param {vec4} out the receiving vector\n * @returns {vec4} out\n */\n\nfunction zero$1(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec4} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nfunction str$3(a) {\n return \"vec4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction exactEquals$3(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec4} a The first vector.\n * @param {ReadonlyVec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction equals$3(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3));\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nvar sub$1 = subtract$1;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nvar mul$3 = multiply$3;\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\n\nvar div$1 = divide$1;\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\n\nvar dist$1 = distance$1;\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\n\nvar sqrDist$1 = squaredDistance$1;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nvar len$3 = length$3;\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\n\nvar sqrLen$3 = squaredLength$3;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nvar forEach$1 = function () {\n var vec = create$3();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n}();\n\nconst vec4 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n add: add$3,\n ceil: ceil$1,\n clone: clone$3,\n copy: copy$3,\n create: create$3,\n cross: cross$1,\n dist: dist$1,\n distance: distance$1,\n div: div$1,\n divide: divide$1,\n dot: dot$3,\n equals: equals$3,\n exactEquals: exactEquals$3,\n floor: floor$1,\n forEach: forEach$1,\n fromValues: fromValues$3,\n inverse: inverse$1,\n len: len$3,\n length: length$3,\n lerp: lerp$3,\n max: max$1,\n min: min$1,\n mul: mul$3,\n multiply: multiply$3,\n negate: negate$1,\n normalize: normalize$3,\n random: random$2,\n round: round$1,\n scale: scale$3,\n scaleAndAdd: scaleAndAdd$1,\n set: set$3,\n sqrDist: sqrDist$1,\n sqrLen: sqrLen$3,\n squaredDistance: squaredDistance$1,\n squaredLength: squaredLength$3,\n str: str$3,\n sub: sub$1,\n subtract: subtract$1,\n transformMat4: transformMat4$1,\n transformQuat: transformQuat,\n zero: zero$1\n});\n\n/**\n * Quaternion\n * @module quat\n */\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\n\nfunction create$2() {\n var out = new ARRAY_TYPE(4);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n out[3] = 1;\n return out;\n}\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nfunction identity$1(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n}\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyVec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\n\nfunction setAxisAngle(out, axis, rad) {\n rad = rad * 0.5;\n var s = Math.sin(rad);\n out[0] = s * axis[0];\n out[1] = s * axis[1];\n out[2] = s * axis[2];\n out[3] = Math.cos(rad);\n return out;\n}\n/**\n * Gets the rotation axis and angle for a given\n * quaternion. If a quaternion is created with\n * setAxisAngle, this method will return the same\n * values as providied in the original parameter list\n * OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n * angle -90 is the same as the quaternion formed by\n * [0, 0, 1] and 270. This method favors the latter.\n * @param {vec3} out_axis Vector receiving the axis of rotation\n * @param {ReadonlyQuat} q Quaternion to be decomposed\n * @return {Number} Angle, in radians, of the rotation\n */\n\nfunction getAxisAngle(out_axis, q) {\n var rad = Math.acos(q[3]) * 2.0;\n var s = Math.sin(rad / 2.0);\n\n if (s > EPSILON) {\n out_axis[0] = q[0] / s;\n out_axis[1] = q[1] / s;\n out_axis[2] = q[2] / s;\n } else {\n // If s is zero, return any axis (no rotation - axis does not matter)\n out_axis[0] = 1;\n out_axis[1] = 0;\n out_axis[2] = 0;\n }\n\n return rad;\n}\n/**\n * Gets the angular distance between two unit quaternions\n *\n * @param {ReadonlyQuat} a Origin unit quaternion\n * @param {ReadonlyQuat} b Destination unit quaternion\n * @return {Number} Angle, in radians, between the two quaternions\n */\n\nfunction getAngle(a, b) {\n var dotproduct = dot$2(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n */\n\nfunction multiply$2(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n out[0] = ax * bw + aw * bx + ay * bz - az * by;\n out[1] = ay * bw + aw * by + az * bx - ax * bz;\n out[2] = az * bw + aw * bz + ax * by - ay * bx;\n out[3] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nfunction rotateX$1(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + aw * bx;\n out[1] = ay * bw + az * bx;\n out[2] = az * bw - ay * bx;\n out[3] = aw * bw - ax * bx;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nfunction rotateY$1(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var by = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw - az * by;\n out[1] = ay * bw + aw * by;\n out[2] = az * bw + ax * by;\n out[3] = aw * bw - ay * by;\n return out;\n}\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {ReadonlyQuat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\n\nfunction rotateZ$1(out, a, rad) {\n rad *= 0.5;\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bz = Math.sin(rad),\n bw = Math.cos(rad);\n out[0] = ax * bw + ay * bz;\n out[1] = ay * bw - ax * bz;\n out[2] = az * bw + aw * bz;\n out[3] = aw * bw - az * bz;\n return out;\n}\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate W component of\n * @returns {quat} out\n */\n\nfunction calculateW(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x;\n out[1] = y;\n out[2] = z;\n out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n return out;\n}\n/**\n * Calculate the exponential of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nfunction exp(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var et = Math.exp(w);\n var s = r > 0 ? et * Math.sin(r) / r : 0;\n out[0] = x * s;\n out[1] = y * s;\n out[2] = z * s;\n out[3] = et * Math.cos(r);\n return out;\n}\n/**\n * Calculate the natural logarithm of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @returns {quat} out\n */\n\nfunction ln(out, a) {\n var x = a[0],\n y = a[1],\n z = a[2],\n w = a[3];\n var r = Math.sqrt(x * x + y * y + z * z);\n var t = r > 0 ? Math.atan2(r, w) / r : 0;\n out[0] = x * t;\n out[1] = y * t;\n out[2] = z * t;\n out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w);\n return out;\n}\n/**\n * Calculate the scalar power of a unit quaternion.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate the exponential of\n * @param {Number} b amount to scale the quaternion by\n * @returns {quat} out\n */\n\nfunction pow(out, a, b) {\n ln(out, a);\n scale$2(out, out, b);\n exp(out, out);\n return out;\n}\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nfunction slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n var ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n var bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n var omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n/**\n * Generates a random unit quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\n\nfunction random$1(out) {\n // Implementation of http://planning.cs.uiuc.edu/node198.html\n // TODO: Calling random 3 times is probably not the fastest solution\n var u1 = RANDOM();\n var u2 = RANDOM();\n var u3 = RANDOM();\n var sqrt1MinusU1 = Math.sqrt(1 - u1);\n var sqrtU1 = Math.sqrt(u1);\n out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2);\n out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2);\n out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3);\n out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3);\n return out;\n}\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate inverse of\n * @returns {quat} out\n */\n\nfunction invert$1(out, a) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n out[0] = -a0 * invDot;\n out[1] = -a1 * invDot;\n out[2] = -a2 * invDot;\n out[3] = a3 * invDot;\n return out;\n}\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quat to calculate conjugate of\n * @returns {quat} out\n */\n\nfunction conjugate$1(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n return out;\n}\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyMat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\n\nfunction fromMat3(out, m) {\n // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n // article \"Quaternion Calculus and Fast Animation\".\n var fTrace = m[0] + m[4] + m[8];\n var fRoot;\n\n if (fTrace > 0.0) {\n // |w| > 1/2, may as well choose w > 1/2\n fRoot = Math.sqrt(fTrace + 1.0); // 2w\n\n out[3] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot; // 1/(4w)\n\n out[0] = (m[5] - m[7]) * fRoot;\n out[1] = (m[6] - m[2]) * fRoot;\n out[2] = (m[1] - m[3]) * fRoot;\n } else {\n // |w| <= 1/2\n var i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > m[i * 3 + i]) i = 2;\n var j = (i + 1) % 3;\n var k = (i + 2) % 3;\n fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n out[i] = 0.5 * fRoot;\n fRoot = 0.5 / fRoot;\n out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n }\n\n return out;\n}\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {x} Angle to rotate around X axis in degrees.\n * @param {y} Angle to rotate around Y axis in degrees.\n * @param {z} Angle to rotate around Z axis in degrees.\n * @returns {quat} out\n * @function\n */\n\nfunction fromEuler(out, x, y, z) {\n var halfToRad = 0.5 * Math.PI / 180.0;\n x *= halfToRad;\n y *= halfToRad;\n z *= halfToRad;\n var sx = Math.sin(x);\n var cx = Math.cos(x);\n var sy = Math.sin(y);\n var cy = Math.cos(y);\n var sz = Math.sin(z);\n var cz = Math.cos(z);\n out[0] = sx * cy * cz - cx * sy * sz;\n out[1] = cx * sy * cz + sx * cy * sz;\n out[2] = cx * cy * sz - sx * sy * cz;\n out[3] = cx * cy * cz + sx * sy * sz;\n return out;\n}\n/**\n * Returns a string representation of a quatenion\n *\n * @param {ReadonlyQuat} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nfunction str$2(a) {\n return \"quat(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \")\";\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\n\nvar clone$2 = clone$3;\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\n\nvar fromValues$2 = fromValues$3;\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the source quaternion\n * @returns {quat} out\n * @function\n */\n\nvar copy$2 = copy$3;\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\n\nvar set$2 = set$3;\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {quat} out\n * @function\n */\n\nvar add$2 = add$3;\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\n\nvar mul$2 = multiply$2;\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {ReadonlyQuat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\n\nvar scale$2 = scale$3;\n/**\n * Calculates the dot product of two quat's\n *\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nvar dot$2 = dot$3;\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n * @function\n */\n\nvar lerp$2 = lerp$3;\n/**\n * Calculates the length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nvar length$2 = length$3;\n/**\n * Alias for {@link quat.length}\n * @function\n */\n\nvar len$2 = length$2;\n/**\n * Calculates the squared length of a quat\n *\n * @param {ReadonlyQuat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nvar squaredLength$2 = squaredLength$3;\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\n\nvar sqrLen$2 = squaredLength$2;\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\n\nvar normalize$2 = normalize$3;\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat} a The first quaternion.\n * @param {ReadonlyQuat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nvar exactEquals$2 = exactEquals$3;\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat} a The first vector.\n * @param {ReadonlyQuat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nvar equals$2 = equals$3;\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {ReadonlyVec3} a the initial vector\n * @param {ReadonlyVec3} b the destination vector\n * @returns {quat} out\n */\n\nvar rotationTo = function () {\n var tmpvec3 = create$4();\n var xUnitVec3 = fromValues$4(1, 0, 0);\n var yUnitVec3 = fromValues$4(0, 1, 0);\n return function (out, a, b) {\n var dot = dot$4(a, b);\n\n if (dot < -0.999999) {\n cross$2(tmpvec3, xUnitVec3, a);\n if (len$4(tmpvec3) < 0.000001) cross$2(tmpvec3, yUnitVec3, a);\n normalize$4(tmpvec3, tmpvec3);\n setAxisAngle(out, tmpvec3, Math.PI);\n return out;\n } else if (dot > 0.999999) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n return out;\n } else {\n cross$2(tmpvec3, a, b);\n out[0] = tmpvec3[0];\n out[1] = tmpvec3[1];\n out[2] = tmpvec3[2];\n out[3] = 1 + dot;\n return normalize$2(out, out);\n }\n };\n}();\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {ReadonlyQuat} a the first operand\n * @param {ReadonlyQuat} b the second operand\n * @param {ReadonlyQuat} c the third operand\n * @param {ReadonlyQuat} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat} out\n */\n\nvar sqlerp = function () {\n var temp1 = create$2();\n var temp2 = create$2();\n return function (out, a, b, c, d, t) {\n slerp(temp1, a, d, t);\n slerp(temp2, b, c, t);\n slerp(out, temp1, temp2, 2 * t * (1 - t));\n return out;\n };\n}();\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {ReadonlyVec3} view the vector representing the viewing direction\n * @param {ReadonlyVec3} right the vector representing the local \"right\" direction\n * @param {ReadonlyVec3} up the vector representing the local \"up\" direction\n * @returns {quat} out\n */\n\nvar setAxes = function () {\n var matr = create$6();\n return function (out, view, right, up) {\n matr[0] = right[0];\n matr[3] = right[1];\n matr[6] = right[2];\n matr[1] = up[0];\n matr[4] = up[1];\n matr[7] = up[2];\n matr[2] = -view[0];\n matr[5] = -view[1];\n matr[8] = -view[2];\n return normalize$2(out, fromMat3(out, matr));\n };\n}();\n\nconst quat = /*#__PURE__*/Object.freeze({\n __proto__: null,\n add: add$2,\n calculateW: calculateW,\n clone: clone$2,\n conjugate: conjugate$1,\n copy: copy$2,\n create: create$2,\n dot: dot$2,\n equals: equals$2,\n exactEquals: exactEquals$2,\n exp: exp,\n fromEuler: fromEuler,\n fromMat3: fromMat3,\n fromValues: fromValues$2,\n getAngle: getAngle,\n getAxisAngle: getAxisAngle,\n identity: identity$1,\n invert: invert$1,\n len: len$2,\n length: length$2,\n lerp: lerp$2,\n ln: ln,\n mul: mul$2,\n multiply: multiply$2,\n normalize: normalize$2,\n pow: pow,\n random: random$1,\n rotateX: rotateX$1,\n rotateY: rotateY$1,\n rotateZ: rotateZ$1,\n rotationTo: rotationTo,\n scale: scale$2,\n set: set$2,\n setAxes: setAxes,\n setAxisAngle: setAxisAngle,\n slerp: slerp,\n sqlerp: sqlerp,\n sqrLen: sqrLen$2,\n squaredLength: squaredLength$2,\n str: str$2\n});\n\n/**\n * Dual Quaternion<br>\n * Format: [real, dual]<br>\n * Quaternion format: XYZW<br>\n * Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.<br>\n * @module quat2\n */\n\n/**\n * Creates a new identity dual quat\n *\n * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation]\n */\n\nfunction create$1() {\n var dq = new ARRAY_TYPE(8);\n\n if (ARRAY_TYPE != Float32Array) {\n dq[0] = 0;\n dq[1] = 0;\n dq[2] = 0;\n dq[4] = 0;\n dq[5] = 0;\n dq[6] = 0;\n dq[7] = 0;\n }\n\n dq[3] = 1;\n return dq;\n}\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {ReadonlyQuat2} a dual quaternion to clone\n * @returns {quat2} new dual quaternion\n * @function\n */\n\nfunction clone$1(a) {\n var dq = new ARRAY_TYPE(8);\n dq[0] = a[0];\n dq[1] = a[1];\n dq[2] = a[2];\n dq[3] = a[3];\n dq[4] = a[4];\n dq[5] = a[5];\n dq[6] = a[6];\n dq[7] = a[7];\n return dq;\n}\n/**\n * Creates a new dual quat initialized with the given values\n *\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component\n * @param {Number} y2 Y component\n * @param {Number} z2 Z component\n * @param {Number} w2 W component\n * @returns {quat2} new dual quaternion\n * @function\n */\n\nfunction fromValues$1(x1, y1, z1, w1, x2, y2, z2, w2) {\n var dq = new ARRAY_TYPE(8);\n dq[0] = x1;\n dq[1] = y1;\n dq[2] = z1;\n dq[3] = w1;\n dq[4] = x2;\n dq[5] = y2;\n dq[6] = z2;\n dq[7] = w2;\n return dq;\n}\n/**\n * Creates a new dual quat from the given values (quat and translation)\n *\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component (translation)\n * @param {Number} y2 Y component (translation)\n * @param {Number} z2 Z component (translation)\n * @returns {quat2} new dual quaternion\n * @function\n */\n\nfunction fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) {\n var dq = new ARRAY_TYPE(8);\n dq[0] = x1;\n dq[1] = y1;\n dq[2] = z1;\n dq[3] = w1;\n var ax = x2 * 0.5,\n ay = y2 * 0.5,\n az = z2 * 0.5;\n dq[4] = ax * w1 + ay * z1 - az * y1;\n dq[5] = ay * w1 + az * x1 - ax * z1;\n dq[6] = az * w1 + ax * y1 - ay * x1;\n dq[7] = -ax * x1 - ay * y1 - az * z1;\n return dq;\n}\n/**\n * Creates a dual quat from a quaternion and a translation\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyQuat} q a normalized quaternion\n * @param {ReadonlyVec3} t tranlation vector\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\nfunction fromRotationTranslation(out, q, t) {\n var ax = t[0] * 0.5,\n ay = t[1] * 0.5,\n az = t[2] * 0.5,\n bx = q[0],\n by = q[1],\n bz = q[2],\n bw = q[3];\n out[0] = bx;\n out[1] = by;\n out[2] = bz;\n out[3] = bw;\n out[4] = ax * bw + ay * bz - az * by;\n out[5] = ay * bw + az * bx - ax * bz;\n out[6] = az * bw + ax * by - ay * bx;\n out[7] = -ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Creates a dual quat from a translation\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyVec3} t translation vector\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\nfunction fromTranslation(out, t) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = t[0] * 0.5;\n out[5] = t[1] * 0.5;\n out[6] = t[2] * 0.5;\n out[7] = 0;\n return out;\n}\n/**\n * Creates a dual quat from a quaternion\n *\n * @param {ReadonlyQuat2} dual quaternion receiving operation result\n * @param {ReadonlyQuat} q the quaternion\n * @returns {quat2} dual quaternion receiving operation result\n * @function\n */\n\nfunction fromRotation(out, q) {\n out[0] = q[0];\n out[1] = q[1];\n out[2] = q[2];\n out[3] = q[3];\n out[4] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n return out;\n}\n/**\n * Creates a new dual quat from a matrix (4x4)\n *\n * @param {quat2} out the dual quaternion\n * @param {ReadonlyMat4} a the matrix\n * @returns {quat2} dual quat receiving operation result\n * @function\n */\n\nfunction fromMat4(out, a) {\n //TODO Optimize this\n var outer = create$2();\n getRotation(outer, a);\n var t = new ARRAY_TYPE(3);\n getTranslation$1(t, a);\n fromRotationTranslation(out, outer, t);\n return out;\n}\n/**\n * Copy the values from one dual quat to another\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the source dual quaternion\n * @returns {quat2} out\n * @function\n */\n\nfunction copy$1(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n return out;\n}\n/**\n * Set a dual quat to the identity dual quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @returns {quat2} out\n */\n\nfunction identity(out) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 1;\n out[4] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n return out;\n}\n/**\n * Set the components of a dual quat to the given values\n *\n * @param {quat2} out the receiving quaternion\n * @param {Number} x1 X component\n * @param {Number} y1 Y component\n * @param {Number} z1 Z component\n * @param {Number} w1 W component\n * @param {Number} x2 X component\n * @param {Number} y2 Y component\n * @param {Number} z2 Z component\n * @param {Number} w2 W component\n * @returns {quat2} out\n * @function\n */\n\nfunction set$1(out, x1, y1, z1, w1, x2, y2, z2, w2) {\n out[0] = x1;\n out[1] = y1;\n out[2] = z1;\n out[3] = w1;\n out[4] = x2;\n out[5] = y2;\n out[6] = z2;\n out[7] = w2;\n return out;\n}\n/**\n * Gets the real part of a dual quat\n * @param {quat} out real part\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @return {quat} real part\n */\n\nvar getReal = copy$2;\n/**\n * Gets the dual part of a dual quat\n * @param {quat} out dual part\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @return {quat} dual part\n */\n\nfunction getDual(out, a) {\n out[0] = a[4];\n out[1] = a[5];\n out[2] = a[6];\n out[3] = a[7];\n return out;\n}\n/**\n * Set the real component of a dual quat to the given quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat} q a quaternion representing the real part\n * @returns {quat2} out\n * @function\n */\n\nvar setReal = copy$2;\n/**\n * Set the dual component of a dual quat to the given quaternion\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat} q a quaternion representing the dual part\n * @returns {quat2} out\n * @function\n */\n\nfunction setDual(out, q) {\n out[4] = q[0];\n out[5] = q[1];\n out[6] = q[2];\n out[7] = q[3];\n return out;\n}\n/**\n * Gets the translation of a normalized dual quat\n * @param {vec3} out translation\n * @param {ReadonlyQuat2} a Dual Quaternion to be decomposed\n * @return {vec3} translation\n */\n\nfunction getTranslation(out, a) {\n var ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3];\n out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n return out;\n}\n/**\n * Translates a dual quat by the given vector\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {quat2} out\n */\n\nfunction translate(out, a, v) {\n var ax1 = a[0],\n ay1 = a[1],\n az1 = a[2],\n aw1 = a[3],\n bx1 = v[0] * 0.5,\n by1 = v[1] * 0.5,\n bz1 = v[2] * 0.5,\n ax2 = a[4],\n ay2 = a[5],\n az2 = a[6],\n aw2 = a[7];\n out[0] = ax1;\n out[1] = ay1;\n out[2] = az1;\n out[3] = aw1;\n out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2;\n out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2;\n out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2;\n out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2;\n return out;\n}\n/**\n * Rotates a dual quat around the X axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\nfunction rotateX(out, a, rad) {\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n ax1 = ax * bw + aw * bx + ay * bz - az * by,\n ay1 = ay * bw + aw * by + az * bx - ax * bz,\n az1 = az * bw + aw * bz + ax * by - ay * bx,\n aw1 = aw * bw - ax * bx - ay * by - az * bz;\n rotateX$1(out, a, rad);\n bx = out[0];\n by = out[1];\n bz = out[2];\n bw = out[3];\n out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n return out;\n}\n/**\n * Rotates a dual quat around the Y axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\nfunction rotateY(out, a, rad) {\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n ax1 = ax * bw + aw * bx + ay * bz - az * by,\n ay1 = ay * bw + aw * by + az * bx - ax * bz,\n az1 = az * bw + aw * bz + ax * by - ay * bx,\n aw1 = aw * bw - ax * bx - ay * by - az * bz;\n rotateY$1(out, a, rad);\n bx = out[0];\n by = out[1];\n bz = out[2];\n bw = out[3];\n out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n return out;\n}\n/**\n * Rotates a dual quat around the Z axis\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {number} rad how far should the rotation be\n * @returns {quat2} out\n */\n\nfunction rotateZ(out, a, rad) {\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7],\n ax1 = ax * bw + aw * bx + ay * bz - az * by,\n ay1 = ay * bw + aw * by + az * bx - ax * bz,\n az1 = az * bw + aw * bz + ax * by - ay * bx,\n aw1 = aw * bw - ax * bx - ay * by - az * bz;\n rotateZ$1(out, a, rad);\n bx = out[0];\n by = out[1];\n bz = out[2];\n bw = out[3];\n out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n return out;\n}\n/**\n * Rotates a dual quat by a given quaternion (a * q)\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {ReadonlyQuat} q quaternion to rotate by\n * @returns {quat2} out\n */\n\nfunction rotateByQuatAppend(out, a, q) {\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n out[0] = ax * qw + aw * qx + ay * qz - az * qy;\n out[1] = ay * qw + aw * qy + az * qx - ax * qz;\n out[2] = az * qw + aw * qz + ax * qy - ay * qx;\n out[3] = aw * qw - ax * qx - ay * qy - az * qz;\n ax = a[4];\n ay = a[5];\n az = a[6];\n aw = a[7];\n out[4] = ax * qw + aw * qx + ay * qz - az * qy;\n out[5] = ay * qw + aw * qy + az * qx - ax * qz;\n out[6] = az * qw + aw * qz + ax * qy - ay * qx;\n out[7] = aw * qw - ax * qx - ay * qy - az * qz;\n return out;\n}\n/**\n * Rotates a dual quat by a given quaternion (q * a)\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat} q quaternion to rotate by\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @returns {quat2} out\n */\n\nfunction rotateByQuatPrepend(out, q, a) {\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3],\n bx = a[0],\n by = a[1],\n bz = a[2],\n bw = a[3];\n out[0] = qx * bw + qw * bx + qy * bz - qz * by;\n out[1] = qy * bw + qw * by + qz * bx - qx * bz;\n out[2] = qz * bw + qw * bz + qx * by - qy * bx;\n out[3] = qw * bw - qx * bx - qy * by - qz * bz;\n bx = a[4];\n by = a[5];\n bz = a[6];\n bw = a[7];\n out[4] = qx * bw + qw * bx + qy * bz - qz * by;\n out[5] = qy * bw + qw * by + qz * bx - qx * bz;\n out[6] = qz * bw + qw * bz + qx * by - qy * bx;\n out[7] = qw * bw - qx * bx - qy * by - qz * bz;\n return out;\n}\n/**\n * Rotates a dual quat around a given axis. Does the normalisation automatically\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the dual quaternion to rotate\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @param {Number} rad how far the rotation should be\n * @returns {quat2} out\n */\n\nfunction rotateAroundAxis(out, a, axis, rad) {\n //Special case for rad = 0\n if (Math.abs(rad) < EPSILON) {\n return copy$1(out, a);\n }\n\n var axisLength = Math.hypot(axis[0], axis[1], axis[2]);\n rad = rad * 0.5;\n var s = Math.sin(rad);\n var bx = s * axis[0] / axisLength;\n var by = s * axis[1] / axisLength;\n var bz = s * axis[2] / axisLength;\n var bw = Math.cos(rad);\n var ax1 = a[0],\n ay1 = a[1],\n az1 = a[2],\n aw1 = a[3];\n out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by;\n out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz;\n out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx;\n out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz;\n var ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n out[4] = ax * bw + aw * bx + ay * bz - az * by;\n out[5] = ay * bw + aw * by + az * bx - ax * bz;\n out[6] = az * bw + aw * bz + ax * by - ay * bx;\n out[7] = aw * bw - ax * bx - ay * by - az * bz;\n return out;\n}\n/**\n * Adds two dual quat's\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {quat2} out\n * @function\n */\n\nfunction add$1(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n return out;\n}\n/**\n * Multiplies two dual quat's\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {quat2} out\n */\n\nfunction multiply$1(out, a, b) {\n var ax0 = a[0],\n ay0 = a[1],\n az0 = a[2],\n aw0 = a[3],\n bx1 = b[4],\n by1 = b[5],\n bz1 = b[6],\n bw1 = b[7],\n ax1 = a[4],\n ay1 = a[5],\n az1 = a[6],\n aw1 = a[7],\n bx0 = b[0],\n by0 = b[1],\n bz0 = b[2],\n bw0 = b[3];\n out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0;\n out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0;\n out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0;\n out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0;\n out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0;\n out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0;\n out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0;\n out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0;\n return out;\n}\n/**\n * Alias for {@link quat2.multiply}\n * @function\n */\n\nvar mul$1 = multiply$1;\n/**\n * Scales a dual quat by a scalar number\n *\n * @param {quat2} out the receiving dual quat\n * @param {ReadonlyQuat2} a the dual quat to scale\n * @param {Number} b amount to scale the dual quat by\n * @returns {quat2} out\n * @function\n */\n\nfunction scale$1(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n return out;\n}\n/**\n * Calculates the dot product of two dual quat's (The dot product of the real parts)\n *\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\n\nvar dot$1 = dot$2;\n/**\n * Performs a linear interpolation between two dual quats's\n * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5)\n *\n * @param {quat2} out the receiving dual quat\n * @param {ReadonlyQuat2} a the first operand\n * @param {ReadonlyQuat2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {quat2} out\n */\n\nfunction lerp$1(out, a, b, t) {\n var mt = 1 - t;\n if (dot$1(a, b) < 0) t = -t;\n out[0] = a[0] * mt + b[0] * t;\n out[1] = a[1] * mt + b[1] * t;\n out[2] = a[2] * mt + b[2] * t;\n out[3] = a[3] * mt + b[3] * t;\n out[4] = a[4] * mt + b[4] * t;\n out[5] = a[5] * mt + b[5] * t;\n out[6] = a[6] * mt + b[6] * t;\n out[7] = a[7] * mt + b[7] * t;\n return out;\n}\n/**\n * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a dual quat to calculate inverse of\n * @returns {quat2} out\n */\n\nfunction invert(out, a) {\n var sqlen = squaredLength$1(a);\n out[0] = -a[0] / sqlen;\n out[1] = -a[1] / sqlen;\n out[2] = -a[2] / sqlen;\n out[3] = a[3] / sqlen;\n out[4] = -a[4] / sqlen;\n out[5] = -a[5] / sqlen;\n out[6] = -a[6] / sqlen;\n out[7] = a[7] / sqlen;\n return out;\n}\n/**\n * Calculates the conjugate of a dual quat\n * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result.\n *\n * @param {quat2} out the receiving quaternion\n * @param {ReadonlyQuat2} a quat to calculate conjugate of\n * @returns {quat2} out\n */\n\nfunction conjugate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n out[3] = a[3];\n out[4] = -a[4];\n out[5] = -a[5];\n out[6] = -a[6];\n out[7] = a[7];\n return out;\n}\n/**\n * Calculates the length of a dual quat\n *\n * @param {ReadonlyQuat2} a dual quat to calculate length of\n * @returns {Number} length of a\n * @function\n */\n\nvar length$1 = length$2;\n/**\n * Alias for {@link quat2.length}\n * @function\n */\n\nvar len$1 = length$1;\n/**\n * Calculates the squared length of a dual quat\n *\n * @param {ReadonlyQuat2} a dual quat to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\n\nvar squaredLength$1 = squaredLength$2;\n/**\n * Alias for {@link quat2.squaredLength}\n * @function\n */\n\nvar sqrLen$1 = squaredLength$1;\n/**\n * Normalize a dual quat\n *\n * @param {quat2} out the receiving dual quaternion\n * @param {ReadonlyQuat2} a dual quaternion to normalize\n * @returns {quat2} out\n * @function\n */\n\nfunction normalize$1(out, a) {\n var magnitude = squaredLength$1(a);\n\n if (magnitude > 0) {\n magnitude = Math.sqrt(magnitude);\n var a0 = a[0] / magnitude;\n var a1 = a[1] / magnitude;\n var a2 = a[2] / magnitude;\n var a3 = a[3] / magnitude;\n var b0 = a[4];\n var b1 = a[5];\n var b2 = a[6];\n var b3 = a[7];\n var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3;\n out[0] = a0;\n out[1] = a1;\n out[2] = a2;\n out[3] = a3;\n out[4] = (b0 - a0 * a_dot_b) / magnitude;\n out[5] = (b1 - a1 * a_dot_b) / magnitude;\n out[6] = (b2 - a2 * a_dot_b) / magnitude;\n out[7] = (b3 - a3 * a_dot_b) / magnitude;\n }\n\n return out;\n}\n/**\n * Returns a string representation of a dual quatenion\n *\n * @param {ReadonlyQuat2} a dual quaternion to represent as a string\n * @returns {String} string representation of the dual quat\n */\n\nfunction str$1(a) {\n return \"quat2(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \")\";\n}\n/**\n * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyQuat2} a the first dual quaternion.\n * @param {ReadonlyQuat2} b the second dual quaternion.\n * @returns {Boolean} true if the dual quaternions are equal, false otherwise.\n */\n\nfunction exactEquals$1(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7];\n}\n/**\n * Returns whether or not the dual quaternions have approximately the same elements in the same position.\n *\n * @param {ReadonlyQuat2} a the first dual quat.\n * @param {ReadonlyQuat2} b the second dual quat.\n * @returns {Boolean} true if the dual quats are equal, false otherwise.\n */\n\nfunction equals$1(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3],\n a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3],\n b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7));\n}\n\nconst quat2 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n add: add$1,\n clone: clone$1,\n conjugate: conjugate,\n copy: copy$1,\n create: create$1,\n dot: dot$1,\n equals: equals$1,\n exactEquals: exactEquals$1,\n fromMat4: fromMat4,\n fromRotation: fromRotation,\n fromRotationTranslation: fromRotationTranslation,\n fromRotationTranslationValues: fromRotationTranslationValues,\n fromTranslation: fromTranslation,\n fromValues: fromValues$1,\n getDual: getDual,\n getReal: getReal,\n getTranslation: getTranslation,\n identity: identity,\n invert: invert,\n len: len$1,\n length: length$1,\n lerp: lerp$1,\n mul: mul$1,\n multiply: multiply$1,\n normalize: normalize$1,\n rotateAroundAxis: rotateAroundAxis,\n rotateByQuatAppend: rotateByQuatAppend,\n rotateByQuatPrepend: rotateByQuatPrepend,\n rotateX: rotateX,\n rotateY: rotateY,\n rotateZ: rotateZ,\n scale: scale$1,\n set: set$1,\n setDual: setDual,\n setReal: setReal,\n sqrLen: sqrLen$1,\n squaredLength: squaredLength$1,\n str: str$1,\n translate: translate\n});\n\n/**\n * 2 Dimensional Vector\n * @module vec2\n */\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\n\nfunction create() {\n var out = new ARRAY_TYPE(2);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n }\n\n return out;\n}\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {ReadonlyVec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\n\nfunction clone(a) {\n var out = new ARRAY_TYPE(2);\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\n\nfunction fromValues(x, y) {\n var out = new ARRAY_TYPE(2);\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the source vector\n * @returns {vec2} out\n */\n\nfunction copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n return out;\n}\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\n\nfunction set(out, x, y) {\n out[0] = x;\n out[1] = y;\n return out;\n}\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n return out;\n}\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n return out;\n}\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n return out;\n}\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to ceil\n * @returns {vec2} out\n */\n\nfunction ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n return out;\n}\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to floor\n * @returns {vec2} out\n */\n\nfunction floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n return out;\n}\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n return out;\n}\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec2} out\n */\n\nfunction max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n return out;\n}\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to round\n * @returns {vec2} out\n */\n\nfunction round(out, a) {\n out[0] = Math.round(a[0]);\n out[1] = Math.round(a[1]);\n return out;\n}\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\n\nfunction scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n return out;\n}\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\n\nfunction scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n return out;\n}\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} distance between a and b\n */\n\nfunction distance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\n\nfunction squaredDistance(a, b) {\n var x = b[0] - a[0],\n y = b[1] - a[1];\n return x * x + y * y;\n}\n/**\n * Calculates the length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nfunction length(a) {\n var x = a[0],\n y = a[1];\n return Math.hypot(x, y);\n}\n/**\n * Calculates the squared length of a vec2\n *\n * @param {ReadonlyVec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\n\nfunction squaredLength(a) {\n var x = a[0],\n y = a[1];\n return x * x + y * y;\n}\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to negate\n * @returns {vec2} out\n */\n\nfunction negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n return out;\n}\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to invert\n * @returns {vec2} out\n */\n\nfunction inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n return out;\n}\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a vector to normalize\n * @returns {vec2} out\n */\n\nfunction normalize(out, a) {\n var x = a[0],\n y = a[1];\n var len = x * x + y * y;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n return out;\n}\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {Number} dot product of a and b\n */\n\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1];\n}\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @returns {vec3} out\n */\n\nfunction cross(out, a, b) {\n var z = a[0] * b[1] - a[1] * b[0];\n out[0] = out[1] = 0;\n out[2] = z;\n return out;\n}\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the first operand\n * @param {ReadonlyVec2} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec2} out\n */\n\nfunction lerp(out, a, b, t) {\n var ax = a[0],\n ay = a[1];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n return out;\n}\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\n\nfunction random(out, scale) {\n scale = scale || 1.0;\n var r = RANDOM() * 2.0 * Math.PI;\n out[0] = Math.cos(r) * scale;\n out[1] = Math.sin(r) * scale;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2} m matrix to transform with\n * @returns {vec2} out\n */\n\nfunction transformMat2(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y;\n out[1] = m[1] * x + m[3] * y;\n return out;\n}\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat2d} m matrix to transform with\n * @returns {vec2} out\n */\n\nfunction transformMat2d(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[2] * y + m[4];\n out[1] = m[1] * x + m[3] * y + m[5];\n return out;\n}\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat3} m matrix to transform with\n * @returns {vec2} out\n */\n\nfunction transformMat3(out, a, m) {\n var x = a[0],\n y = a[1];\n out[0] = m[0] * x + m[3] * y + m[6];\n out[1] = m[1] * x + m[4] * y + m[7];\n return out;\n}\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {ReadonlyVec2} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec2} out\n */\n\nfunction transformMat4(out, a, m) {\n var x = a[0];\n var y = a[1];\n out[0] = m[0] * x + m[4] * y + m[12];\n out[1] = m[1] * x + m[5] * y + m[13];\n return out;\n}\n/**\n * Rotate a 2D vector\n * @param {vec2} out The receiving vec2\n * @param {ReadonlyVec2} a The vec2 point to rotate\n * @param {ReadonlyVec2} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec2} out\n */\n\nfunction rotate(out, a, b, rad) {\n //Translate point to the origin\n var p0 = a[0] - b[0],\n p1 = a[1] - b[1],\n sinC = Math.sin(rad),\n cosC = Math.cos(rad); //perform rotation and translate to correct position\n\n out[0] = p0 * cosC - p1 * sinC + b[0];\n out[1] = p0 * sinC + p1 * cosC + b[1];\n return out;\n}\n/**\n * Get the angle between two 2D vectors\n * @param {ReadonlyVec2} a The first operand\n * @param {ReadonlyVec2} b The second operand\n * @returns {Number} The angle in radians\n */\n\nfunction angle(a, b) {\n var x1 = a[0],\n y1 = a[1],\n x2 = b[0],\n y2 = b[1],\n // mag is the product of the magnitudes of a and b\n mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2),\n // mag &&.. short circuits if mag == 0\n cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1\n\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n/**\n * Set the components of a vec2 to zero\n *\n * @param {vec2} out the receiving vector\n * @returns {vec2} out\n */\n\nfunction zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n return out;\n}\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec2} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\n\nfunction str(a) {\n return \"vec2(\" + a[0] + \", \" + a[1] + \")\";\n}\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1];\n}\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec2} a The first vector.\n * @param {ReadonlyVec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\n\nfunction equals(a, b) {\n var a0 = a[0],\n a1 = a[1];\n var b0 = b[0],\n b1 = b[1];\n return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1));\n}\n/**\n * Alias for {@link vec2.length}\n * @function\n */\n\nvar len = length;\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\n\nvar sub = subtract;\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\n\nvar mul = multiply;\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\n\nvar div = divide;\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\n\nvar dist = distance;\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\n\nvar sqrDist = squaredDistance;\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\n\nvar sqrLen = squaredLength;\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\nvar forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 2;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n }\n\n return a;\n };\n}();\n\nconst vec2 = /*#__PURE__*/Object.freeze({\n __proto__: null,\n add: add,\n angle: angle,\n ceil: ceil,\n clone: clone,\n copy: copy,\n create: create,\n cross: cross,\n dist: dist,\n distance: distance,\n div: div,\n divide: divide,\n dot: dot,\n equals: equals,\n exactEquals: exactEquals,\n floor: floor,\n forEach: forEach,\n fromValues: fromValues,\n inverse: inverse,\n len: len,\n length: length,\n lerp: lerp,\n max: max,\n min: min,\n mul: mul,\n multiply: multiply,\n negate: negate,\n normalize: normalize,\n random: random,\n rotate: rotate,\n round: round,\n scale: scale,\n scaleAndAdd: scaleAndAdd,\n set: set,\n sqrDist: sqrDist,\n sqrLen: sqrLen,\n squaredDistance: squaredDistance,\n squaredLength: squaredLength,\n str: str,\n sub: sub,\n subtract: subtract,\n transformMat2: transformMat2,\n transformMat2d: transformMat2d,\n transformMat3: transformMat3,\n transformMat4: transformMat4,\n zero: zero\n});\n\n/**\n * Provides a way to calculate velocity via effectively creating a \"complementary filter\".\n *\n * `velQuick` and `velSmooth` separately accumulate over time. `velInstant` and `velUsed` do not accumulate and are\n * discarded each update. `velQuick` is responsive, but noisy. `velSmooth` is laggy but eventually more accurate. By\n * tracking them separately the used result can be responsive in the short term and accurate in the long term.\n *\n * TODO: This class will be moved to a final location in the @typhonjs-svelte/lib/math package.\n */\nclass TJSVelocityTrack\n{\n /** @type {number} */\n #lastSampleTime;\n\n /**\n * Tracks the last sample point.\n *\n * @type {{x: number, y: number, z: number}}\n */\n #lastSamplePoint = { x: 0, y: 0, z: 0 };\n\n /**\n * Defines the settle time in milliseconds that resets any tracked velocity state.\n *\n * @type {number}\n */\n #resetDeltaTime;\n\n /**\n * Stores the scaling conversion for used velocity calculation. By default, this is 1000 which converts the velocity\n * calculation to velocity per second. Set to `1` for instance for velocity per millisecond.\n *\n * @type {number}\n */\n #scaleTime;\n\n /**\n * Stores the instant velocity between current and last sample point.\n *\n * @type {{x: number, y: number, z: number}}\n */\n #velInstant = { x: 0, y: 0, z: 0 };\n\n /**\n * Stores the `quick` running calculated velocity.\n *\n * @type {{x: number, y: number, z: number}}\n */\n #velQuick = { x: 0, y: 0, z: 0 };\n\n /**\n * Stores the `smooth` running calculated velocity.\n *\n * @type {{x: number, y: number, z: number}}\n */\n #velSmooth = { x: 0, y: 0, z: 0 };\n\n /**\n * Stores the mix between `quick` and `smooth` running velocity.\n *\n * @type {{x: number, y: number, z: number}}\n */\n #velUsed = { x: 0, y: 0, z: 0 };\n\n /**\n * Creates a velocity tracker instance.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {number} [opts.resetDeltaTime=50] - Delta time in milliseconds that resets velocity tracking.\n *\n * @param {number} [opts.scaleTime=1000] - Scales velocity calculation to new time frame. 1000 is velocity per\n * second.\n */\n constructor({ resetDeltaTime = 50, scaleTime = 1000 } = {})\n {\n this.resetDeltaTime = resetDeltaTime;\n this.scaleTime = scaleTime;\n\n Object.seal(this.#velUsed);\n }\n\n /**\n * @returns {number} Gets `resetDeltaTime`.\n */\n get resetDeltaTime() { return this.#resetDeltaTime; }\n\n /**\n * @returns {number} Gets `scaleTime`.\n */\n get scaleTime() { return this.#scaleTime; }\n\n /**\n * Sets `resetDeltaTime`.\n *\n * @param {number} resetDeltaTime - Delta time in milliseconds that resets velocity tracking.\n */\n set resetDeltaTime(resetDeltaTime)\n {\n if (!Number.isFinite(resetDeltaTime) || resetDeltaTime < 0)\n {\n throw new TypeError(`'resetDeltaTime' is not a positive finite number.`);\n }\n\n this.#resetDeltaTime = resetDeltaTime;\n }\n\n /**\n * Sets `scaleTime`.\n *\n * @param {number} scaleTime - Scales velocity calculation to new time frame. 1000 is velocity per second.\n */\n set scaleTime(scaleTime)\n {\n if (!Number.isFinite(scaleTime) || scaleTime < 0)\n {\n throw new TypeError(`'scaleTime' is not a positive finite number.`);\n }\n\n this.#scaleTime = scaleTime;\n }\n\n /**\n * Resets velocity tracking data.\n *\n * @param {number} [x=0] - 'X' value to set to last sample point.\n *\n * @param {number} [y=0] - 'Y' value to set to last sample point.\n *\n * @param {number} [z=0] - 'Z' value to set to last sample point.\n *\n * @param {number} [sampleTime=performance.now()] - A sample time in milliseconds resolution.\n */\n reset(x = 0, y = 0, z = 0, sampleTime = performance.now())\n {\n if (!Number.isFinite(x)) { throw new TypeError(`'x' is not a finite number.`); }\n if (!Number.isFinite(y)) { throw new TypeError(`'y' is not a finite number.`); }\n if (!Number.isFinite(z)) { throw new TypeError(`'z' is not a finite number.`); }\n if (!Number.isFinite(sampleTime)) { throw new TypeError(`'sampleTime' is not a finite number.`); }\n\n // Reset velocity tracking variables.\n this.#lastSampleTime = sampleTime;\n\n this.#lastSamplePoint.x = x;\n this.#lastSamplePoint.y = y;\n this.#lastSamplePoint.z = z;\n\n this.#velInstant.x = this.#velQuick.x = this.#velSmooth.x = this.#velUsed.x = 0;\n this.#velInstant.y = this.#velQuick.y = this.#velSmooth.y = this.#velUsed.y = 0;\n this.#velInstant.z = this.#velQuick.z = this.#velSmooth.z = this.#velUsed.z = 0;\n }\n\n /**\n * Runs ongoing velocity calculation of x / y / z given a sample time.\n *\n * @param {number|undefined} x - New sample X\n *\n * @param {number|undefined} y - New sample Y\n *\n * @param {number|undefined} z - New sample Z\n *\n * @param {number} [sampleTime=performance.now()] - An optional specific time w/ millisecond resolution.\n *\n * @returns {{x: number, y: number, z: number}} current velocity.\n */\n update(x = void 0, y = void 0, z = void 0, sampleTime = performance.now())\n {\n if (!Number.isFinite(sampleTime)) { throw new TypeError(`'sampleTime' is not a finite number.`); }\n\n const deltaTime = sampleTime - this.#lastSampleTime + Number.EPSILON;\n this.#lastSampleTime = sampleTime;\n\n // Reset velocity tracking if the delta time is greater than `resetDeltaTime`.\n if (deltaTime > this.#resetDeltaTime)\n {\n this.reset(x, y, z, sampleTime);\n return this.#velUsed;\n }\n\n if (Number.isFinite(x))\n {\n this.#velInstant.x = (x - this.#lastSamplePoint.x) / deltaTime;\n\n this.#lastSamplePoint.x = x;\n\n this.#velQuick.x = lerp$5(this.#velQuick.x, this.#velInstant.x, 0.1);\n this.#velSmooth.x = lerp$5(this.#velSmooth.x, this.#velInstant.x, 0.01);\n this.#velUsed.x = lerp$5(this.#velSmooth.x, this.#velQuick.x, 0.5) * this.#scaleTime;\n }\n\n if (Number.isFinite(y))\n {\n this.#velInstant.y = (y - this.#lastSamplePoint.y) / deltaTime;\n\n this.#lastSamplePoint.y = y;\n\n this.#velQuick.y = lerp$5(this.#velQuick.y, this.#velInstant.y, 0.1);\n this.#velSmooth.y = lerp$5(this.#velSmooth.y, this.#velInstant.y, 0.01);\n\n this.#velUsed.y = lerp$5(this.#velSmooth.y, this.#velQuick.y, 0.5) * this.#scaleTime;\n }\n\n if (Number.isFinite(z))\n {\n this.#velInstant.z = (z - this.#lastSamplePoint.z) / deltaTime;\n\n this.#lastSamplePoint.z = z;\n\n this.#velQuick.z = lerp$5(this.#velQuick.z, this.#velInstant.z, 0.1);\n this.#velSmooth.z = lerp$5(this.#velSmooth.z, this.#velInstant.z, 0.01);\n this.#velUsed.z = lerp$5(this.#velSmooth.z, this.#velQuick.z, 0.5) * this.#scaleTime;\n }\n\n return this.#velUsed;\n }\n\n /**\n * Gets the current velocity tracking data.\n *\n * @returns {{x: number, y: number, z: number}} Velocity tracking data.\n */\n get()\n {\n this.#velUsed.x = lerp$5(this.#velSmooth.x, this.#velQuick.x, 0.5) * this.#scaleTime;\n this.#velUsed.y = lerp$5(this.#velSmooth.y, this.#velQuick.y, 0.5) * this.#scaleTime;\n this.#velUsed.z = lerp$5(this.#velSmooth.z, this.#velQuick.z, 0.5) * this.#scaleTime;\n\n return this.#velUsed;\n }\n}\n\nexport { TJSVelocityTrack, degToRad, common as glMatrix, lerp$5 as lerp, mat2, mat2d, mat3, mat4, quat, quat2, radToDeg, vec2, vec3, vec4 };\n//# sourceMappingURL=index.js.map\n","import { isObject } from '@typhonjs-fvtt/runtime/svelte/util';\n\n/**\n * Provides a basic {@link TJSBasicAnimation} implementation for Position animation.\n */\nexport class AnimationControl\n{\n /** @type {object} */\n #animationData;\n\n /** @type {Promise<void>} */\n #finishedPromise;\n\n #willFinish;\n\n /**\n * Defines a static empty / void animation control.\n *\n * @type {AnimationControl}\n */\n static #voidControl = new AnimationControl(null);\n\n /**\n * Provides a static void / undefined AnimationControl that is automatically resolved.\n *\n * @returns {AnimationControl} Void AnimationControl\n */\n static get voidControl() { return this.#voidControl; }\n\n /**\n * @param {object|null} [animationData] - Animation data from {@link AnimationAPI}.\n *\n * @param {boolean} [willFinish] - Promise that tracks animation finished state.\n */\n constructor(animationData, willFinish = false)\n {\n this.#animationData = animationData;\n this.#willFinish = willFinish;\n\n // Set this control to animation data.\n if (isObject(animationData)) { animationData.control = this; }\n }\n\n /**\n * Get a promise that resolves when animation is finished.\n *\n * @returns {Promise<void>}\n */\n get finished()\n {\n if (!(this.#finishedPromise instanceof Promise))\n {\n this.#finishedPromise = this.#willFinish ? new Promise((resolve) => this.#animationData.resolve = resolve) :\n Promise.resolve();\n }\n\n return this.#finishedPromise;\n }\n\n /**\n * Returns whether this animation is currently active / animating.\n *\n * Note: a delayed animation may not be started / active yet. Use {@link AnimationControl.isFinished} to determine\n * if an animation is actually finished.\n *\n * @returns {boolean} Animation active state.\n */\n get isActive() { return this.#animationData.active; }\n\n /**\n * Returns whether this animation is completely finished.\n *\n * @returns {boolean} Animation finished state.\n */\n get isFinished() { return this.#animationData.finished; }\n\n /**\n * Cancels the animation.\n */\n cancel()\n {\n const animationData = this.#animationData;\n\n if (animationData === null || animationData === void 0) { return; }\n\n // Set cancelled state to true and this animation data instance will be removed from AnimationManager on next\n // update.\n animationData.cancelled = true;\n }\n}\n","/**\n * Provides animation management and scheduling allowing all Position instances to utilize one micro-task.\n */\nexport class AnimationManager\n{\n /**\n * @type {object[]}\n */\n static activeList = [];\n\n /**\n * @type {object[]}\n */\n static newList = [];\n\n /**\n * @type {number}\n */\n static current;\n\n /**\n * Add animation data.\n *\n * @param {object} data -\n */\n static add(data)\n {\n const now = performance.now();\n\n // Offset start time by delta between last rAF time. This allows continuous tween cycles to appear naturally as\n // starting from the instant they are added to the AnimationManager. This is what makes `draggable` smooth when\n // easing is enabled.\n data.start = now + (AnimationManager.current - now);\n\n AnimationManager.newList.push(data);\n }\n\n /**\n * Manage all animation\n */\n static animate()\n {\n const current = AnimationManager.current = performance.now();\n\n // Early out of the rAF callback when there are no current animations.\n if (AnimationManager.activeList.length === 0 && AnimationManager.newList.length === 0)\n {\n globalThis.requestAnimationFrame(AnimationManager.animate);\n return;\n }\n\n if (AnimationManager.newList.length)\n {\n // Process new data\n for (let cntr = AnimationManager.newList.length; --cntr >= 0;)\n {\n const data = AnimationManager.newList[cntr];\n\n // If animation instance has been cancelled before start then remove it from new list and cleanup.\n if (data.cancelled)\n {\n AnimationManager.newList.splice(cntr, 1);\n data.cleanup(data);\n }\n\n // If data is active then process it now. Delayed animations start with `active` false.\n if (data.active)\n {\n // Remove from new list and add to active list.\n AnimationManager.newList.splice(cntr, 1);\n AnimationManager.activeList.push(data);\n }\n }\n }\n\n // Process active animations.\n for (let cntr = AnimationManager.activeList.length; --cntr >= 0;)\n {\n const data = AnimationManager.activeList[cntr];\n\n // Remove any animations that have been canceled.\n // Ensure that the element is still connected otherwise remove it from active list and continue.\n if (data.cancelled || (data.el !== void 0 && !data.el.isConnected))\n {\n AnimationManager.activeList.splice(cntr, 1);\n data.cleanup(data);\n continue;\n }\n\n data.current = current - data.start;\n\n // Remove this animation instance if current animating time exceeds duration.\n if (data.current >= data.duration)\n {\n // Prepare final update with end position data.\n for (let dataCntr = data.keys.length; --dataCntr >= 0;)\n {\n const key = data.keys[dataCntr];\n data.newData[key] = data.destination[key];\n }\n\n data.position.set(data.newData);\n\n AnimationManager.activeList.splice(cntr, 1);\n data.cleanup(data);\n\n continue;\n }\n\n // Apply easing to create an eased time.\n const easedTime = data.ease(data.current / data.duration);\n\n for (let dataCntr = data.keys.length; --dataCntr >= 0;)\n {\n const key = data.keys[dataCntr];\n data.newData[key] = data.interpolate(data.initial[key], data.destination[key], easedTime);\n }\n\n data.position.set(data.newData);\n }\n\n globalThis.requestAnimationFrame(AnimationManager.animate);\n }\n\n /**\n * Cancels all animations for given Position instance.\n *\n * @param {Position} position - Position instance.\n */\n static cancel(position)\n {\n for (let cntr = AnimationManager.activeList.length; --cntr >= 0;)\n {\n const data = AnimationManager.activeList[cntr];\n if (data.position === position)\n {\n AnimationManager.activeList.splice(cntr, 1);\n data.cancelled = true;\n data.cleanup(data);\n }\n }\n\n for (let cntr = AnimationManager.newList.length; --cntr >= 0;)\n {\n const data = AnimationManager.newList[cntr];\n if (data.position === position)\n {\n AnimationManager.newList.splice(cntr, 1);\n data.cancelled = true;\n data.cleanup(data);\n }\n }\n }\n\n /**\n * Cancels all active and delayed animations.\n */\n static cancelAll()\n {\n for (let cntr = AnimationManager.activeList.length; --cntr >= 0;)\n {\n const data = AnimationManager.activeList[cntr];\n data.cancelled = true;\n data.cleanup(data);\n }\n\n for (let cntr = AnimationManager.newList.length; --cntr >= 0;)\n {\n const data = AnimationManager.newList[cntr];\n data.cancelled = true;\n data.cleanup(data);\n }\n\n AnimationManager.activeList.length = 0;\n AnimationManager.newList.length = 0;\n }\n\n /**\n * Gets all {@link AnimationControl} instances for a given Position instance.\n *\n * @param {Position} position - Position instance.\n *\n * @returns {AnimationControl[]} All scheduled AnimationControl instances for the given Position instance.\n */\n static getScheduled(position)\n {\n const results = [];\n\n for (let cntr = AnimationManager.activeList.length; --cntr >= 0;)\n {\n const data = AnimationManager.activeList[cntr];\n if (data.position === position)\n {\n results.push(data.control);\n }\n }\n\n for (let cntr = AnimationManager.newList.length; --cntr >= 0;)\n {\n const data = AnimationManager.newList[cntr];\n if (data.position === position)\n {\n results.push(data.control);\n }\n }\n\n return results;\n }\n}\n\n// Start animation manager immediately. It constantly is running in background.\nAnimationManager.animate();\n","/**\n * Stores the PositionData properties that can be animated.\n *\n * @type {Set<string>}\n */\nconst animateKeys = new Set([\n // Main keys\n 'left', 'top', 'maxWidth', 'maxHeight', 'minWidth', 'minHeight', 'width', 'height',\n 'rotateX', 'rotateY', 'rotateZ', 'scale', 'translateX', 'translateY', 'translateZ', 'zIndex',\n\n // Aliases\n 'rotation'\n]);\n\n/**\n * Defines the keys of PositionData that are transform keys.\n *\n * @type {string[]}\n */\nconst transformKeys = ['rotateX', 'rotateY', 'rotateZ', 'scale', 'translateX', 'translateY', 'translateZ'];\n\nObject.freeze(transformKeys);\n\n/**\n * Parses a relative value string in the form of '+=', '-=', or '*=' and float / numeric value. IE '+=0.2'.\n *\n * @type {RegExp}\n */\nconst relativeRegex = /^([-+*])=(-?[\\d]*\\.?[\\d]+)$/;\n\n/**\n * Provides numeric defaults for all parameters. This is used by {@link Position.get} to optionally provide\n * numeric defaults.\n *\n * @type {{rotation: number, scale: number, minWidth: null, minHeight: null, translateZ: number, top: number, left: number, maxHeight: null, translateY: number, translateX: number, width: number, transformOrigin: null, rotateX: number, rotateY: number, height: number, maxWidth: null, zIndex: null, rotateZ: number}}\n */\nconst numericDefaults = {\n // Other keys\n height: 0,\n left: 0,\n maxHeight: null,\n maxWidth: null,\n minHeight: null,\n minWidth: null,\n top: 0,\n transformOrigin: null,\n width: 0,\n zIndex: null,\n\n rotateX: 0,\n rotateY: 0,\n rotateZ: 0,\n scale: 1,\n translateX: 0,\n translateY: 0,\n translateZ: 0,\n\n rotation: 0\n};\n\nObject.freeze(numericDefaults);\n\n/**\n * Sets numeric defaults for a {@link PositionData} like object.\n *\n * @param {object} data - A PositionData like object.\n */\nfunction setNumericDefaults(data)\n{\n // Transform keys\n if (data.rotateX === null) { data.rotateX = 0; }\n if (data.rotateY === null) { data.rotateY = 0; }\n if (data.rotateZ === null) { data.rotateZ = 0; }\n if (data.translateX === null) { data.translateX = 0; }\n if (data.translateY === null) { data.translateY = 0; }\n if (data.translateZ === null) { data.translateZ = 0; }\n if (data.scale === null) { data.scale = 1; }\n\n // Aliases\n if (data.rotation === null) { data.rotation = 0; }\n}\n\n/**\n * Defines bitwise keys for transforms used in {@link Transforms.getMat4}.\n *\n * @type {object}\n */\nconst transformKeysBitwise = {\n rotateX: 1,\n rotateY: 2,\n rotateZ: 4,\n scale: 8,\n translateX: 16,\n translateY: 32,\n translateZ: 64\n};\n\nObject.freeze(transformKeysBitwise);\n\n/**\n * Defines the default transform origin.\n *\n * @type {string}\n */\nconst transformOriginDefault = 'top left';\n\n/**\n * Defines the valid transform origins.\n *\n * @type {string[]}\n */\nconst transformOrigins = ['top left', 'top center', 'top right', 'center left', 'center', 'center right', 'bottom left',\n 'bottom center', 'bottom right'];\n\nObject.freeze(transformOrigins);\n\nexport {\n animateKeys,\n numericDefaults,\n relativeRegex,\n setNumericDefaults,\n transformKeys,\n transformKeysBitwise,\n transformOriginDefault,\n transformOrigins\n};\n","import * as constants from './constants.js';\n\n/**\n * Converts any relative string values for animatable keys to actual updates performed against current data.\n *\n * @param {PositionDataExtended} positionData - position data.\n *\n * @param {Position|PositionData} position - The source position instance.\n */\nexport function convertRelative(positionData, position)\n{\n for (const key in positionData)\n {\n // Key is animatable / numeric.\n if (constants.animateKeys.has(key))\n {\n const value = positionData[key];\n\n if (typeof value !== 'string') { continue; }\n\n // Ignore 'auto' and 'inherit' string values.\n if (value === 'auto' || value === 'inherit') { continue; }\n\n const regexResults = constants.relativeRegex.exec(value);\n\n if (!regexResults)\n {\n throw new Error(\n `convertRelative error: malformed relative key (${key}) with value (${value})`);\n }\n\n const current = position[key];\n\n switch (regexResults[1])\n {\n case '-':\n positionData[key] = current - parseFloat(regexResults[2]);\n break;\n\n case '+':\n positionData[key] = current + parseFloat(regexResults[2]);\n break;\n\n case '*':\n positionData[key] = current * parseFloat(regexResults[2]);\n break;\n }\n }\n }\n}\n","import { cubicOut } from 'svelte/easing';\n\nimport { lerp } from '@typhonjs-fvtt/runtime/svelte/math';\nimport {\n isIterable,\n isObject } from '@typhonjs-fvtt/runtime/svelte/util';\n\nimport { AnimationControl } from './AnimationControl.js';\nimport { AnimationManager } from './AnimationManager.js';\n\nimport { convertRelative } from '../convertRelative.js';\n\nimport {\n animateKeys,\n setNumericDefaults } from '../constants.js';\n\nexport class AnimationAPI\n{\n /** @type {PositionData} */\n #data;\n\n /** @type {Position} */\n #position;\n\n /**\n * Tracks the number of animation control instances that are active.\n *\n * @type {number}\n */\n #instanceCount = 0;\n\n /**\n * Provides a bound function to pass as data to AnimationManager to invoke\n *\n * @type {Function}\n * @see {AnimationAPI.#cleanupInstance}\n */\n #cleanup;\n\n constructor(position, data)\n {\n this.#position = position;\n this.#data = data;\n\n this.#cleanup = this.#cleanupInstance.bind(this);\n }\n\n /**\n * Returns whether there are scheduled animations whether active or delayed for this Position.\n *\n * @returns {boolean} Are there active animation instances.\n */\n get isScheduled()\n {\n return this.#instanceCount > 0;\n }\n\n /**\n * Adds / schedules an animation w/ the AnimationManager. This contains the final steps common to all tweens.\n *\n * @param {object} initial -\n *\n * @param {object} destination -\n *\n * @param {number} duration -\n *\n * @param {HTMLElement} el -\n *\n * @param {number} delay -\n *\n * @param {Function} ease -\n *\n * @param {Function} interpolate -\n *\n * @returns {AnimationControl} The associated animation control.\n */\n #addAnimation(initial, destination, duration, el, delay, ease, interpolate)\n {\n // Set initial data for transform values that are often null by default.\n setNumericDefaults(initial);\n setNumericDefaults(destination);\n\n // Reject all initial data that is not a number.\n for (const key in initial)\n {\n if (!Number.isFinite(initial[key])) { delete initial[key]; }\n }\n\n const keys = Object.keys(initial);\n const newData = Object.assign({ immediateElementUpdate: true }, initial);\n\n // Nothing to animate, so return now.\n if (keys.length === 0) { return AnimationControl.voidControl; }\n\n const animationData = {\n active: true,\n cleanup: this.#cleanup,\n cancelled: false,\n control: void 0,\n current: 0,\n destination,\n duration: duration * 1000, // Internally the AnimationManager works in ms.\n ease,\n el,\n finished: false,\n initial,\n interpolate,\n keys,\n newData,\n position: this.#position,\n resolve: void 0,\n start: void 0\n };\n\n if (delay > 0)\n {\n animationData.active = false;\n\n // Delay w/ setTimeout and schedule w/ AnimationManager if not already canceled\n setTimeout(() =>\n {\n if (!animationData.cancelled)\n {\n animationData.active = true;\n\n const now = performance.now();\n\n // Offset start time by delta between last rAF time. This allows a delayed tween to start from the\n // precise delayed time.\n animationData.start = now + (AnimationManager.current - now);\n }\n }, delay * 1000);\n }\n\n // Schedule immediately w/ AnimationManager\n this.#instanceCount++;\n AnimationManager.add(animationData);\n\n // Create animation control\n return new AnimationControl(animationData, true);\n }\n\n /**\n * Cancels all animation instances for this Position instance.\n */\n cancel()\n {\n AnimationManager.cancel(this.#position);\n }\n\n /**\n * Cleans up an animation instance.\n *\n * @param {object} data - Animation data for an animation instance.\n */\n #cleanupInstance(data)\n {\n this.#instanceCount--;\n\n data.active = false;\n data.finished = true;\n\n if (typeof data.resolve === 'function') { data.resolve(data.cancelled); }\n }\n\n /**\n * Returns all currently scheduled AnimationControl instances for this Position instance.\n *\n * @returns {AnimationControl[]} All currently scheduled animation controls for this Position instance.\n */\n getScheduled()\n {\n return AnimationManager.getScheduled(this.#position);\n }\n\n /**\n * Provides a tween from given position data to the current position.\n *\n * @param {PositionDataExtended} fromData - The starting position.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {number} [opts.delay=0] - Delay in seconds before animation starts.\n *\n * @param {number} [opts.duration=1] - Duration in seconds.\n *\n * @param {Function} [opts.ease=cubicOut] - Easing function.\n *\n * @param {Function} [opts.interpolate=lerp] - Interpolation function.\n *\n * @returns {AnimationControl} A control object that can cancel animation and provides a `finished` Promise.\n */\n from(fromData, { delay = 0, duration = 1, ease = cubicOut, interpolate = lerp } = {})\n {\n if (!isObject(fromData))\n {\n throw new TypeError(`AnimationAPI.from error: 'fromData' is not an object.`);\n }\n\n const position = this.#position;\n const parent = position.parent;\n\n // Early out if the application is not positionable.\n if (parent !== void 0 && typeof parent?.options?.positionable === 'boolean' && !parent?.options?.positionable)\n {\n return AnimationControl.voidControl;\n }\n\n // Cache any target element allowing AnimationManager to stop animation if it becomes disconnected from DOM.\n const targetEl = parent instanceof HTMLElement ? parent : parent?.elementTarget;\n const el = targetEl instanceof HTMLElement && targetEl.isConnected ? targetEl : void 0;\n\n if (!Number.isFinite(delay) || delay < 0)\n {\n throw new TypeError(`AnimationAPI.from error: 'delay' is not a positive number.`);\n }\n\n if (!Number.isFinite(duration) || duration < 0)\n {\n throw new TypeError(`AnimationAPI.from error: 'duration' is not a positive number.`);\n }\n\n if (typeof ease !== 'function')\n {\n throw new TypeError(`AnimationAPI.from error: 'ease' is not a function.`);\n }\n\n if (typeof interpolate !== 'function')\n {\n throw new TypeError(`AnimationAPI.from error: 'interpolate' is not a function.`);\n }\n\n const initial = {};\n const destination = {};\n\n const data = this.#data;\n\n // Set initial data if the key / data is defined and the end position is not equal to current data.\n for (const key in fromData)\n {\n if (data[key] !== void 0 && fromData[key] !== data[key])\n {\n initial[key] = fromData[key];\n destination[key] = data[key];\n }\n }\n\n convertRelative(initial, data);\n\n return this.#addAnimation(initial, destination, duration, el, delay, ease, interpolate);\n }\n\n /**\n * Provides a tween from given position data to the current position.\n *\n * @param {PositionDataExtended} fromData - The starting position.\n *\n * @param {PositionDataExtended} toData - The ending position.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {number} [opts.delay=0] - Delay in seconds before animation starts.\n *\n * @param {number} [opts.duration=1] - Duration in seconds.\n *\n * @param {Function} [opts.ease=cubicOut] - Easing function.\n *\n * @param {Function} [opts.interpolate=lerp] - Interpolation function.\n *\n * @returns {AnimationControl} A control object that can cancel animation and provides a `finished` Promise.\n */\n fromTo(fromData, toData, { delay = 0, duration = 1, ease = cubicOut, interpolate = lerp } = {})\n {\n if (!isObject(fromData))\n {\n throw new TypeError(`AnimationAPI.fromTo error: 'fromData' is not an object.`);\n }\n\n if (!isObject(toData))\n {\n throw new TypeError(`AnimationAPI.fromTo error: 'toData' is not an object.`);\n }\n\n const parent = this.#position.parent;\n\n // Early out if the application is not positionable.\n if (parent !== void 0 && typeof parent?.options?.positionable === 'boolean' && !parent?.options?.positionable)\n {\n return AnimationControl.voidControl;\n }\n\n // Cache any target element allowing AnimationManager to stop animation if it becomes disconnected from DOM.\n const targetEl = parent instanceof HTMLElement ? parent : parent?.elementTarget;\n const el = targetEl instanceof HTMLElement && targetEl.isConnected ? targetEl : void 0;\n\n if (!Number.isFinite(delay) || delay < 0)\n {\n throw new TypeError(`AnimationAPI.fromTo error: 'delay' is not a positive number.`);\n }\n\n if (!Number.isFinite(duration) || duration < 0)\n {\n throw new TypeError(`AnimationAPI.fromTo error: 'duration' is not a positive number.`);\n }\n\n if (typeof ease !== 'function')\n {\n throw new TypeError(`AnimationAPI.fromTo error: 'ease' is not a function.`);\n }\n\n if (typeof interpolate !== 'function')\n {\n throw new TypeError(`AnimationAPI.fromTo error: 'interpolate' is not a function.`);\n }\n\n const initial = {};\n const destination = {};\n\n const data = this.#data;\n\n // Set initial data if the key / data is defined and the end position is not equal to current data.\n for (const key in fromData)\n {\n if (toData[key] === void 0)\n {\n console.warn(\n `AnimationAPI.fromTo warning: key ('${key}') from 'fromData' missing in 'toData'; skipping this key.`);\n continue;\n }\n\n if (data[key] !== void 0)\n {\n initial[key] = fromData[key];\n destination[key] = toData[key];\n }\n }\n\n convertRelative(initial, data);\n convertRelative(destination, data);\n\n return this.#addAnimation(initial, destination, duration, el, delay, ease, interpolate);\n }\n\n /**\n * Provides a tween to given position data from the current position.\n *\n * @param {PositionDataExtended} toData - The destination position.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {number} [opts.delay=0] - Delay in seconds before animation starts.\n *\n * @param {number} [opts.duration=1] - Duration in seconds.\n *\n * @param {Function} [opts.ease=cubicOut] - Easing function.\n *\n * @param {Function} [opts.interpolate=lerp] - Interpolation function.\n *\n * @returns {AnimationControl} A control object that can cancel animation and provides a `finished` Promise.\n */\n to(toData, { delay = 0, duration = 1, ease = cubicOut, interpolate = lerp } = {})\n {\n if (!isObject(toData))\n {\n throw new TypeError(`AnimationAPI.to error: 'toData' is not an object.`);\n }\n\n const parent = this.#position.parent;\n\n // Early out if the application is not positionable.\n if (parent !== void 0 && typeof parent?.options?.positionable === 'boolean' && !parent?.options?.positionable)\n {\n return AnimationControl.voidControl;\n }\n\n // Cache any target element allowing AnimationManager to stop animation if it becomes disconnected from DOM.\n const targetEl = parent instanceof HTMLElement ? parent : parent?.elementTarget;\n const el = targetEl instanceof HTMLElement && targetEl.isConnected ? targetEl : void 0;\n\n if (!Number.isFinite(delay) || delay < 0)\n {\n throw new TypeError(`AnimationAPI.to error: 'delay' is not a positive number.`);\n }\n\n if (!Number.isFinite(duration) || duration < 0)\n {\n throw new TypeError(`AnimationAPI.to error: 'duration' is not a positive number.`);\n }\n\n if (typeof ease !== 'function')\n {\n throw new TypeError(`AnimationAPI.to error: 'ease' is not a function.`);\n }\n\n if (typeof interpolate !== 'function')\n {\n throw new TypeError(`AnimationAPI.to error: 'interpolate' is not a function.`);\n }\n\n const initial = {};\n const destination = {};\n\n const data = this.#data;\n\n // Set initial data if the key / data is defined and the end position is not equal to current data.\n for (const key in toData)\n {\n if (data[key] !== void 0 && toData[key] !== data[key])\n {\n destination[key] = toData[key];\n initial[key] = data[key];\n }\n }\n\n convertRelative(destination, data);\n\n return this.#addAnimation(initial, destination, duration, el, delay, ease, interpolate);\n }\n\n /**\n * Returns a function that provides an optimized way to constantly update a to-tween.\n *\n * @param {Iterable<string>} keys - The keys for quickTo.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {number} [opts.duration=1] - Duration in seconds.\n *\n * @param {Function} [opts.ease=cubicOut] - Easing function.\n *\n * @param {Function} [opts.interpolate=lerp] - Interpolation function.\n *\n * @returns {quickToCallback} quick-to tween function.\n */\n quickTo(keys, { duration = 1, ease = cubicOut, interpolate = lerp } = {})\n {\n if (!isIterable(keys))\n {\n throw new TypeError(`AnimationAPI.quickTo error: 'keys' is not an iterable list.`);\n }\n\n const parent = this.#position.parent;\n\n // Early out if the application is not positionable.\n if (parent !== void 0 && typeof parent?.options?.positionable === 'boolean' && !parent?.options?.positionable)\n {\n throw new Error(`AnimationAPI.quickTo error: 'parent' is not positionable.`);\n }\n\n if (!Number.isFinite(duration) || duration < 0)\n {\n throw new TypeError(`AnimationAPI.quickTo error: 'duration' is not a positive number.`);\n }\n\n if (typeof ease !== 'function')\n {\n throw new TypeError(`AnimationAPI.quickTo error: 'ease' is not a function.`);\n }\n\n if (typeof interpolate !== 'function')\n {\n throw new TypeError(`AnimationAPI.quickTo error: 'interpolate' is not a function.`);\n }\n\n const initial = {};\n const destination = {};\n\n const data = this.#data;\n\n // Set initial data if the key / data is defined and the end position is not equal to current data.\n for (const key of keys)\n {\n if (typeof key !== 'string')\n {\n throw new TypeError(`AnimationAPI.quickTo error: key is not a string.`);\n }\n\n if (!animateKeys.has(key))\n {\n throw new Error(`AnimationAPI.quickTo error: key ('${key}') is not animatable.`);\n }\n\n if (data[key] !== void 0)\n {\n destination[key] = data[key];\n initial[key] = data[key];\n }\n }\n\n const keysArray = [...keys];\n\n Object.freeze(keysArray);\n\n const newData = Object.assign({ immediateElementUpdate: true }, initial);\n\n const animationData = {\n active: true,\n cleanup: this.#cleanup,\n cancelled: false,\n control: void 0,\n current: 0,\n destination,\n duration: duration * 1000, // Internally the AnimationManager works in ms.\n ease,\n el: void 0,\n finished: true, // Note: start in finished state to add to AnimationManager on first callback.\n initial,\n interpolate,\n keys,\n newData,\n position: this.#position,\n resolve: void 0,\n start: void 0\n };\n\n const quickToCB = (...args) =>\n {\n const argsLength = args.length;\n\n if (argsLength === 0) { return; }\n\n for (let cntr = keysArray.length; --cntr >= 0;)\n {\n const key = keysArray[cntr];\n if (data[key] !== void 0) { initial[key] = data[key]; }\n }\n\n // Handle case where the first arg is an object. Update all quickTo keys from data contained in the object.\n if (isObject(args[0]))\n {\n const objData = args[0];\n\n for (const key in objData)\n {\n if (destination[key] !== void 0) { destination[key] = objData[key]; }\n }\n }\n else // Assign each variable argument to the key specified in the initial `keys` array above.\n {\n for (let cntr = 0; cntr < argsLength && cntr < keysArray.length; cntr++)\n {\n const key = keysArray[cntr];\n if (destination[key] !== void 0) { destination[key] = args[cntr]; }\n }\n }\n\n convertRelative(destination, data);\n\n // Set initial data for transform values that are often null by default.\n setNumericDefaults(initial);\n setNumericDefaults(destination);\n\n // Set target element to animation data to track if it is removed from the DOM hence ending the animation.\n const targetEl = parent instanceof HTMLElement ? parent : parent?.elementTarget;\n animationData.el = targetEl instanceof HTMLElement && targetEl.isConnected ? targetEl : void 0;\n\n // Reschedule the quickTo animation with AnimationManager as it is finished.\n if (animationData.finished)\n {\n animationData.finished = false;\n animationData.active = true;\n animationData.current = 0;\n\n this.#instanceCount++;\n AnimationManager.add(animationData);\n }\n else // QuickTo animation is currently scheduled w/ AnimationManager so reset start and current time.\n {\n const now = performance.now();\n\n // Offset start time by delta between last rAF time. This allows a delayed tween to start from the\n // precise delayed time.\n animationData.start = now + (AnimationManager.current - now);\n animationData.current = 0;\n }\n };\n\n quickToCB.keys = keysArray;\n\n /**\n * Sets options of quickTo tween.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {number} [opts.duration] - Duration in seconds.\n *\n * @param {Function} [opts.ease] - Easing function.\n *\n * @param {Function} [opts.interpolate] - Interpolation function.\n *\n * @returns {quickToCallback} The quickTo callback.\n */\n quickToCB.options = ({ duration, ease, interpolate } = {}) => // eslint-disable-line no-shadow\n {\n if (duration !== void 0 && (!Number.isFinite(duration) || duration < 0))\n {\n throw new TypeError(`AnimationAPI.quickTo.options error: 'duration' is not a positive number.`);\n }\n\n if (ease !== void 0 && typeof ease !== 'function')\n {\n throw new TypeError(`AnimationAPI.quickTo.options error: 'ease' is not a function.`);\n }\n\n if (interpolate !== void 0 && typeof interpolate !== 'function')\n {\n throw new TypeError(`AnimationAPI.quickTo.options error: 'interpolate' is not a function.`);\n }\n\n if (duration >= 0) { animationData.duration = duration * 1000; }\n if (ease) { animationData.ease = ease; }\n if (interpolate) { animationData.interpolate = interpolate; }\n\n return quickToCB;\n };\n\n return quickToCB;\n }\n}\n\n/**\n * @callback quickToCallback\n *\n * @param {...number|object} args - Either individual numbers corresponding to the order in which keys are specified or\n * a single object with keys specified and numerical values.\n *\n * @property {({duration?: number, ease?: Function, interpolate?: Function}) => quickToCallback} options - A function\n * to update options for quickTo function.\n */\n","/**\n * Provides a basic {@link TJSBasicAnimation} implementation for a Position animation for a group of Position instances.\n */\nexport class AnimationGroupControl\n{\n /** @type {AnimationControl[]} */\n #animationControls;\n\n /** @type {Promise<Awaited<unknown>[]>} */\n #finishedPromise;\n\n /**\n * Defines a static empty / void animation control.\n *\n * @type {AnimationGroupControl}\n */\n static #voidControl = new AnimationGroupControl(null);\n\n /**\n * Provides a static void / undefined AnimationGroupControl that is automatically resolved.\n *\n * @returns {AnimationGroupControl} Void AnimationGroupControl\n */\n static get voidControl() { return this.#voidControl; }\n\n /**\n * @param {AnimationControl[]} animationControls - An array of AnimationControl instances.\n */\n constructor(animationControls)\n {\n this.#animationControls = animationControls;\n }\n\n /**\n * Get a promise that resolves when all animations are finished.\n *\n * @returns {Promise<Awaited<unknown>[]>|Promise<void>} Finished Promise for all animations.\n */\n get finished()\n {\n const animationControls = this.#animationControls;\n\n if (animationControls === null || animationControls === void 0) { return Promise.resolve(); }\n\n if (!(this.#finishedPromise instanceof Promise))\n {\n const promises = [];\n for (let cntr = animationControls.length; --cntr >= 0;)\n {\n promises.push(animationControls[cntr].finished);\n }\n\n this.#finishedPromise = Promise.all(promises);\n }\n\n return this.#finishedPromise;\n }\n\n /**\n * Returns whether there are active animation instances for this group.\n *\n * Note: a delayed animation may not be started / active yet. Use {@link AnimationGroupControl.isFinished} to\n * determine if all animations in the group are finished.\n *\n * @returns {boolean} Are there active animation instances.\n */\n get isActive()\n {\n const animationControls = this.#animationControls;\n\n if (animationControls === null || animationControls === void 0) { return false; }\n\n for (let cntr = animationControls.length; --cntr >= 0;)\n {\n if (animationControls[cntr].isActive) { return true; }\n }\n\n return false;\n }\n\n /**\n * Returns whether all animations in the group are finished.\n *\n * @returns {boolean} Are all animation instances finished.\n */\n get isFinished()\n {\n const animationControls = this.#animationControls;\n\n if (animationControls === null || animationControls === void 0) { return true; }\n\n for (let cntr = animationControls.length; --cntr >= 0;)\n {\n if (!animationControls[cntr].isFinished) { return false; }\n }\n\n return false;\n }\n\n /**\n * Cancels the all animations.\n */\n cancel()\n {\n const animationControls = this.#animationControls;\n\n if (animationControls === null || animationControls === void 0) { return; }\n\n for (let cntr = this.#animationControls.length; --cntr >= 0;)\n {\n this.#animationControls[cntr].cancel();\n }\n }\n}\n","import {\n isIterable,\n isObject } from '@typhonjs-fvtt/runtime/svelte/util';\n\nimport { AnimationManager } from './AnimationManager.js';\nimport { AnimationAPI } from './AnimationAPI.js';\nimport { AnimationGroupControl } from './AnimationGroupControl.js';\n\n/**\n * Provides a public API for grouping multiple {@link Position} animations together with the AnimationManager.\n *\n * Note: To remove cyclic dependencies as this class provides the Position static / group Animation API `instanceof`\n * checks are not done against Position. Instead, a check for the animate property being an instanceof\n * {@link AnimationAPI} is performed in {@link AnimationGroupAPI.#isPosition}.\n *\n * @see AnimationAPI\n */\nexport class AnimationGroupAPI\n{\n /**\n * Checks of the given object is a Position instance by checking for AnimationAPI.\n *\n * @param {*} object - Any data.\n *\n * @returns {boolean} Is Position.\n */\n static #isPosition(object)\n {\n return isObject(object) && object.animate instanceof AnimationAPI;\n }\n\n /**\n * Cancels any animation for given Position data.\n *\n * @param {Position|{position: Position}|Iterable<Position>|Iterable<{position: Position}>} position -\n */\n static cancel(position)\n {\n if (isIterable(position))\n {\n let index = -1;\n\n for (const entry of position)\n {\n index++;\n\n const actualPosition = this.#isPosition(entry) ? entry : entry.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.cancel warning: No Position instance found at index: ${index}.`);\n continue;\n }\n\n AnimationManager.cancel(actualPosition);\n }\n }\n else\n {\n const actualPosition = this.#isPosition(position) ? position : position.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.cancel warning: No Position instance found.`);\n return;\n }\n\n AnimationManager.cancel(actualPosition);\n }\n }\n\n /**\n * Cancels all Position animation.\n */\n static cancelAll() { AnimationManager.cancelAll(); }\n\n /**\n * Gets all animation controls for the given position data.\n *\n * @param {Position|{position: Position}|Iterable<Position>|Iterable<{position: Position}>} position -\n *\n * @returns {{position: Position, data: object|void, controls: AnimationControl[]}[]} Results array.\n */\n static getScheduled(position)\n {\n const results = [];\n\n if (isIterable(position))\n {\n let index = -1;\n\n for (const entry of position)\n {\n index++;\n\n const isPosition = this.#isPosition(entry);\n const actualPosition = isPosition ? entry : entry.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.getScheduled warning: No Position instance found at index: ${index}.`);\n continue;\n }\n\n const controls = AnimationManager.getScheduled(actualPosition);\n\n results.push({ position: actualPosition, data: isPosition ? void 0 : entry, controls });\n }\n }\n else\n {\n const isPosition = this.#isPosition(position);\n const actualPosition = isPosition ? position : position.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.getScheduled warning: No Position instance found.`);\n return results;\n }\n\n const controls = AnimationManager.getScheduled(actualPosition);\n\n results.push({ position: actualPosition, data: isPosition ? void 0 : position, controls });\n }\n\n return results;\n }\n\n /**\n * Provides the `from` animation tween for one or more Position instances as a group.\n *\n * @param {Position|{position: Position}|Iterable<Position>|Iterable<{position: Position}>} position -\n *\n * @param {object|Function} fromData -\n *\n * @param {object|Function} options -\n *\n * @returns {TJSBasicAnimation} Basic animation control.\n */\n static from(position, fromData, options)\n {\n if (!isObject(fromData) && typeof fromData !== 'function')\n {\n throw new TypeError(`AnimationGroupAPI.from error: 'fromData' is not an object or function.`);\n }\n\n if (options !== void 0 && !isObject(options) && typeof options !== 'function')\n {\n throw new TypeError(`AnimationGroupAPI.from error: 'options' is not an object or function.`);\n }\n\n /**\n * @type {AnimationControl[]}\n */\n const animationControls = [];\n\n let index = -1;\n let callbackOptions;\n\n const hasDataCallback = typeof fromData === 'function';\n const hasOptionCallback = typeof options === 'function';\n const hasCallback = hasDataCallback || hasOptionCallback;\n\n if (hasCallback) { callbackOptions = { index, position: void 0, data: void 0 }; }\n\n let actualFromData = fromData;\n let actualOptions = options;\n\n if (isIterable(position))\n {\n for (const entry of position)\n {\n index++;\n\n const isPosition = this.#isPosition(entry);\n const actualPosition = isPosition ? entry : entry.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.from warning: No Position instance found at index: ${index}.`);\n continue;\n }\n\n if (hasCallback)\n {\n callbackOptions.index = index;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : entry;\n }\n\n if (hasDataCallback)\n {\n actualFromData = fromData(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (actualFromData === null || actualFromData === void 0) { continue; }\n\n if (typeof actualFromData !== 'object')\n {\n throw new TypeError(`AnimationGroupAPI.from error: fromData callback function iteration(${\n index}) failed to return an object.`);\n }\n }\n\n if (hasOptionCallback)\n {\n actualOptions = options(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (actualOptions === null || actualOptions === void 0) { continue; }\n\n if (typeof actualOptions !== 'object')\n {\n throw new TypeError(`AnimationGroupAPI.from error: options callback function iteration(${\n index}) failed to return an object.`);\n }\n }\n\n animationControls.push(actualPosition.animate.from(actualFromData, actualOptions));\n }\n }\n else\n {\n const isPosition = this.#isPosition(position);\n const actualPosition = isPosition ? position : position.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.from warning: No Position instance found.`);\n return AnimationGroupControl.voidControl;\n }\n\n if (hasCallback)\n {\n callbackOptions.index = 0;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : position;\n }\n\n if (hasDataCallback)\n {\n actualFromData = fromData(callbackOptions);\n\n if (typeof actualFromData !== 'object')\n {\n throw new TypeError(\n `AnimationGroupAPI.from error: fromData callback function failed to return an object.`);\n }\n }\n\n if (hasOptionCallback)\n {\n actualOptions = options(callbackOptions);\n\n if (typeof actualOptions !== 'object')\n {\n throw new TypeError(\n `AnimationGroupAPI.from error: options callback function failed to return an object.`);\n }\n }\n\n animationControls.push(actualPosition.animate.from(actualFromData, actualOptions));\n }\n\n return new AnimationGroupControl(animationControls);\n }\n\n /**\n * Provides the `fromTo` animation tween for one or more Position instances as a group.\n *\n * @param {Position|{position: Position}|Iterable<Position>|Iterable<{position: Position}>} position -\n *\n * @param {object|Function} fromData -\n *\n * @param {object|Function} toData -\n *\n * @param {object|Function} options -\n *\n * @returns {TJSBasicAnimation} Basic animation control.\n */\n static fromTo(position, fromData, toData, options)\n {\n if (!isObject(fromData) && typeof fromData !== 'function')\n {\n throw new TypeError(`AnimationGroupAPI.fromTo error: 'fromData' is not an object or function.`);\n }\n\n if (!isObject(toData) && typeof toData !== 'function')\n {\n throw new TypeError(`AnimationGroupAPI.fromTo error: 'toData' is not an object or function.`);\n }\n\n if (options !== void 0 && !isObject(options) && typeof options !== 'function')\n {\n throw new TypeError(`AnimationGroupAPI.fromTo error: 'options' is not an object or function.`);\n }\n\n /**\n * @type {AnimationControl[]}\n */\n const animationControls = [];\n\n let index = -1;\n let callbackOptions;\n\n const hasFromCallback = typeof fromData === 'function';\n const hasToCallback = typeof toData === 'function';\n const hasOptionCallback = typeof options === 'function';\n const hasCallback = hasFromCallback || hasToCallback || hasOptionCallback;\n\n if (hasCallback) { callbackOptions = { index, position: void 0, data: void 0 }; }\n\n let actualFromData = fromData;\n let actualToData = toData;\n let actualOptions = options;\n\n if (isIterable(position))\n {\n for (const entry of position)\n {\n index++;\n\n const isPosition = this.#isPosition(entry);\n const actualPosition = isPosition ? entry : entry.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.fromTo warning: No Position instance found at index: ${index}.`);\n continue;\n }\n\n if (hasCallback)\n {\n callbackOptions.index = index;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : entry;\n }\n\n if (hasFromCallback)\n {\n actualFromData = fromData(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (actualFromData === null || actualFromData === void 0) { continue; }\n\n if (typeof actualFromData !== 'object')\n {\n throw new TypeError(`AnimationGroupAPI.fromTo error: fromData callback function iteration(${\n index}) failed to return an object.`);\n }\n }\n\n if (hasToCallback)\n {\n actualToData = toData(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (actualToData === null || actualToData === void 0) { continue; }\n\n if (typeof actualToData !== 'object')\n {\n throw new TypeError(`AnimationGroupAPI.fromTo error: toData callback function iteration(${\n index}) failed to return an object.`);\n }\n }\n\n if (hasOptionCallback)\n {\n actualOptions = options(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (actualOptions === null || actualOptions === void 0) { continue; }\n\n if (typeof actualOptions !== 'object')\n {\n throw new TypeError(`AnimationGroupAPI.fromTo error: options callback function iteration(${\n index}) failed to return an object.`);\n }\n }\n\n animationControls.push(actualPosition.animate.fromTo(actualFromData, actualToData, actualOptions));\n }\n }\n else\n {\n const isPosition = this.#isPosition(position);\n const actualPosition = isPosition ? position : position.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.fromTo warning: No Position instance found.`);\n return AnimationGroupControl.voidControl;\n }\n\n if (hasCallback)\n {\n callbackOptions.index = 0;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : position;\n }\n\n if (hasFromCallback)\n {\n actualFromData = fromData(callbackOptions);\n\n if (typeof actualFromData !== 'object')\n {\n throw new TypeError(\n `AnimationGroupAPI.fromTo error: fromData callback function failed to return an object.`);\n }\n }\n\n if (hasToCallback)\n {\n actualToData = toData(callbackOptions);\n\n if (typeof actualToData !== 'object')\n {\n throw new TypeError(\n `AnimationGroupAPI.fromTo error: toData callback function failed to return an object.`);\n }\n }\n\n if (hasOptionCallback)\n {\n actualOptions = options(callbackOptions);\n\n if (typeof actualOptions !== 'object')\n {\n throw new TypeError(\n `AnimationGroupAPI.fromTo error: options callback function failed to return an object.`);\n }\n }\n\n animationControls.push(actualPosition.animate.fromTo(actualFromData, actualToData, actualOptions));\n }\n\n return new AnimationGroupControl(animationControls);\n }\n\n /**\n * Provides the `to` animation tween for one or more Position instances as a group.\n *\n * @param {Position|{position: Position}|Iterable<Position>|Iterable<{position: Position}>} position -\n *\n * @param {object|Function} toData -\n *\n * @param {object|Function} options -\n *\n * @returns {TJSBasicAnimation} Basic animation control.\n */\n static to(position, toData, options)\n {\n if (!isObject(toData) && typeof toData !== 'function')\n {\n throw new TypeError(`AnimationGroupAPI.to error: 'toData' is not an object or function.`);\n }\n\n if (options !== void 0 && !isObject(options) && typeof options !== 'function')\n {\n throw new TypeError(`AnimationGroupAPI.to error: 'options' is not an object or function.`);\n }\n\n /**\n * @type {AnimationControl[]}\n */\n const animationControls = [];\n\n let index = -1;\n let callbackOptions;\n\n const hasDataCallback = typeof toData === 'function';\n const hasOptionCallback = typeof options === 'function';\n const hasCallback = hasDataCallback || hasOptionCallback;\n\n if (hasCallback) { callbackOptions = { index, position: void 0, data: void 0 }; }\n\n let actualToData = toData;\n let actualOptions = options;\n\n if (isIterable(position))\n {\n for (const entry of position)\n {\n index++;\n\n const isPosition = this.#isPosition(entry);\n const actualPosition = isPosition ? entry : entry.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.to warning: No Position instance found at index: ${index}.`);\n continue;\n }\n\n if (hasCallback)\n {\n callbackOptions.index = index;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : entry;\n }\n\n if (hasDataCallback)\n {\n actualToData = toData(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (actualToData === null || actualToData === void 0) { continue; }\n\n if (typeof actualToData !== 'object')\n {\n throw new TypeError(`AnimationGroupAPI.to error: toData callback function iteration(${\n index}) failed to return an object.`);\n }\n }\n\n if (hasOptionCallback)\n {\n actualOptions = options(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (actualOptions === null || actualOptions === void 0) { continue; }\n\n if (typeof actualOptions !== 'object')\n {\n throw new TypeError(`AnimationGroupAPI.to error: options callback function iteration(${\n index}) failed to return an object.`);\n }\n }\n\n animationControls.push(actualPosition.animate.to(actualToData, actualOptions));\n }\n }\n else\n {\n const isPosition = this.#isPosition(position);\n const actualPosition = isPosition ? position : position.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.to warning: No Position instance found.`);\n return AnimationGroupControl.voidControl;\n }\n\n if (hasCallback)\n {\n callbackOptions.index = 0;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : position;\n }\n\n if (hasDataCallback)\n {\n actualToData = toData(callbackOptions);\n\n if (typeof actualToData !== 'object')\n {\n throw new TypeError(\n `AnimationGroupAPI.to error: toData callback function failed to return an object.`);\n }\n }\n\n if (hasOptionCallback)\n {\n actualOptions = options(callbackOptions);\n\n if (typeof actualOptions !== 'object')\n {\n throw new TypeError(\n `AnimationGroupAPI.to error: options callback function failed to return an object.`);\n }\n }\n\n animationControls.push(actualPosition.animate.to(actualToData, actualOptions));\n }\n\n return new AnimationGroupControl(animationControls);\n }\n\n /**\n * Provides the `to` animation tween for one or more Position instances as a group.\n *\n * @param {Position|{position: Position}|Iterable<Position>|Iterable<{position: Position}>} position -\n *\n * @param {Iterable<string>} keys -\n *\n * @param {object|Function} options -\n *\n * @returns {quickToCallback} Basic animation control.\n */\n static quickTo(position, keys, options)\n {\n if (!isIterable(keys))\n {\n throw new TypeError(`AnimationGroupAPI.quickTo error: 'keys' is not an iterable list.`);\n }\n\n if (options !== void 0 && !isObject(options) && typeof options !== 'function')\n {\n throw new TypeError(`AnimationGroupAPI.quickTo error: 'options' is not an object or function.`);\n }\n\n /**\n * @type {quickToCallback[]}\n */\n const quickToCallbacks = [];\n\n let index = -1;\n\n const hasOptionCallback = typeof options === 'function';\n\n const callbackOptions = { index, position: void 0, data: void 0 };\n\n let actualOptions = options;\n\n if (isIterable(position))\n {\n for (const entry of position)\n {\n index++;\n\n const isPosition = this.#isPosition(entry);\n const actualPosition = isPosition ? entry : entry.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.quickTo warning: No Position instance found at index: ${index}.`);\n continue;\n }\n\n callbackOptions.index = index;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : entry;\n\n if (hasOptionCallback)\n {\n actualOptions = options(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (actualOptions === null || actualOptions === void 0) { continue; }\n\n if (typeof actualOptions !== 'object')\n {\n throw new TypeError(`AnimationGroupAPI.quickTo error: options callback function iteration(${\n index}) failed to return an object.`);\n }\n }\n\n quickToCallbacks.push(actualPosition.animate.quickTo(keys, actualOptions));\n }\n }\n else\n {\n const isPosition = this.#isPosition(position);\n const actualPosition = isPosition ? position : position.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.quickTo warning: No Position instance found.`);\n return () => null;\n }\n\n callbackOptions.index = 0;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : position;\n\n if (hasOptionCallback)\n {\n actualOptions = options(callbackOptions);\n\n if (typeof actualOptions !== 'object')\n {\n throw new TypeError(\n `AnimationGroupAPI.quickTo error: options callback function failed to return an object.`);\n }\n }\n\n quickToCallbacks.push(actualPosition.animate.quickTo(keys, actualOptions));\n }\n\n const keysArray = [...keys];\n\n Object.freeze(keysArray);\n\n const quickToCB = (...args) =>\n {\n const argsLength = args.length;\n\n if (argsLength === 0) { return; }\n\n if (typeof args[0] === 'function')\n {\n const dataCallback = args[0];\n\n index = -1;\n let cntr = 0;\n\n if (isIterable(position))\n {\n for (const entry of position)\n {\n index++;\n\n const isPosition = this.#isPosition(entry);\n const actualPosition = isPosition ? entry : entry.position;\n\n if (!this.#isPosition(actualPosition)) { continue; }\n\n callbackOptions.index = index;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : entry;\n\n const toData = dataCallback(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (toData === null || toData === void 0) { continue; }\n\n /**\n * @type {boolean}\n */\n const toDataIterable = isIterable(toData);\n\n if (!Number.isFinite(toData) && !toDataIterable && typeof toData !== 'object')\n {\n throw new TypeError(`AnimationGroupAPI.quickTo error: toData callback function iteration(${\n index}) failed to return a finite number, iterable list, or object.`);\n }\n\n if (toDataIterable)\n {\n quickToCallbacks[cntr++](...toData);\n }\n else\n {\n quickToCallbacks[cntr++](toData);\n }\n }\n }\n else\n {\n const isPosition = this.#isPosition(position);\n const actualPosition = isPosition ? position : position.position;\n\n if (!this.#isPosition(actualPosition)) { return; }\n\n callbackOptions.index = 0;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : position;\n\n const toData = dataCallback(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (toData === null || toData === void 0) { return; }\n\n const toDataIterable = isIterable(toData);\n\n if (!Number.isFinite(toData) && !toDataIterable && typeof toData !== 'object')\n {\n throw new TypeError(`AnimationGroupAPI.quickTo error: toData callback function iteration(${\n index}) failed to return a finite number, iterable list, or object.`);\n }\n\n if (toDataIterable)\n {\n quickToCallbacks[cntr++](...toData);\n }\n else\n {\n quickToCallbacks[cntr++](toData);\n }\n }\n }\n else\n {\n for (let cntr = quickToCallbacks.length; --cntr >= 0;)\n {\n quickToCallbacks[cntr](...args);\n }\n }\n };\n\n quickToCB.keys = keysArray;\n\n /**\n * Sets options of quickTo tween.\n *\n * @param {object|Function} [options] - Optional parameters.\n *\n * @param {number} [options.duration] - Duration in seconds.\n *\n * @param {Function} [options.ease] - Easing function.\n *\n * @param {Function} [options.interpolate] - Interpolation function.\n *\n * @returns {quickToCallback} The quickTo callback.\n */\n quickToCB.options = (options) => // eslint-disable-line no-shadow\n {\n if (options !== void 0 && !isObject(options) && typeof options !== 'function')\n {\n throw new TypeError(`AnimationGroupAPI.quickTo error: 'options' is not an object or function.`);\n }\n\n // Set options object for each quickTo callback.\n if (isObject(options))\n {\n for (let cntr = quickToCallbacks.length; --cntr >= 0;) { quickToCallbacks[cntr].options(options); }\n }\n else if (typeof options === 'function')\n {\n if (isIterable(position))\n {\n index = -1;\n let cntr = 0;\n\n for (const entry of position)\n {\n index++;\n\n const isPosition = this.#isPosition(entry);\n const actualPosition = isPosition ? entry : entry.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(\n `AnimationGroupAPI.quickTo.options warning: No Position instance found at index: ${index}.`);\n continue;\n }\n\n callbackOptions.index = index;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : entry;\n\n actualOptions = options(callbackOptions);\n\n // Returned data from callback is null / undefined, so skip this position instance.\n if (actualOptions === null || actualOptions === void 0) { continue; }\n\n if (typeof actualOptions !== 'object')\n {\n throw new TypeError(\n `AnimationGroupAPI.quickTo.options error: options callback function iteration(${\n index}) failed to return an object.`);\n }\n\n quickToCallbacks[cntr++].options(actualOptions);\n }\n }\n else\n {\n const isPosition = this.#isPosition(position);\n const actualPosition = isPosition ? position : position.position;\n\n if (!this.#isPosition(actualPosition))\n {\n console.warn(`AnimationGroupAPI.quickTo.options warning: No Position instance found.`);\n return quickToCB;\n }\n\n callbackOptions.index = 0;\n callbackOptions.position = position;\n callbackOptions.data = isPosition ? void 0 : position;\n\n actualOptions = options(callbackOptions);\n\n if (typeof actualOptions !== 'object')\n {\n throw new TypeError(\n `AnimationGroupAPI.quickTo error: options callback function failed to return an object.`);\n }\n\n quickToCallbacks[0].options(actualOptions);\n }\n }\n\n return quickToCB;\n };\n\n return quickToCB;\n }\n}\n","export class Centered\n{\n /**\n * @type {HTMLElement}\n */\n #element;\n\n /**\n * Provides a manual setting of the element height. As things go `offsetHeight` causes a browser layout and is not\n * performance oriented. If manually set this height is used instead of `offsetHeight`.\n *\n * @type {number}\n */\n #height;\n\n /**\n * Set from an optional value in the constructor to lock accessors preventing modification.\n */\n #lock;\n\n /**\n * Provides a manual setting of the element width. As things go `offsetWidth` causes a browser layout and is not\n * performance oriented. If manually set this width is used instead of `offsetWidth`.\n *\n * @type {number}\n */\n #width;\n\n constructor({ element, lock = false, width, height } = {})\n {\n this.element = element;\n this.width = width;\n this.height = height;\n\n this.#lock = typeof lock === 'boolean' ? lock : false;\n }\n\n get element() { return this.#element; }\n\n get height() { return this.#height; }\n\n get width() { return this.#width; }\n\n set element(element)\n {\n if (this.#lock) { return; }\n\n if (element === void 0 || element === null || element instanceof HTMLElement)\n {\n this.#element = element;\n }\n else\n {\n throw new TypeError(`'element' is not a HTMLElement, undefined, or null.`);\n }\n }\n\n set height(height)\n {\n if (this.#lock) { return; }\n\n if (height === void 0 || Number.isFinite(height))\n {\n this.#height = height;\n }\n else\n {\n throw new TypeError(`'height' is not a finite number or undefined.`);\n }\n }\n\n set width(width)\n {\n if (this.#lock) { return; }\n\n if (width === void 0 || Number.isFinite(width))\n {\n this.#width = width;\n }\n else\n {\n throw new TypeError(`'width' is not a finite number or undefined.`);\n }\n }\n\n setDimension(width, height)\n {\n if (this.#lock) { return; }\n\n if (width === void 0 || Number.isFinite(width))\n {\n this.#width = width;\n }\n else\n {\n throw new TypeError(`'width' is not a finite number or undefined.`);\n }\n\n if (height === void 0 || Number.isFinite(height))\n {\n this.#height = height;\n }\n else\n {\n throw new TypeError(`'height' is not a finite number or undefined.`);\n }\n }\n\n getLeft(width)\n {\n // Determine containing bounds from manual values; or any element; lastly the browser width / height.\n const boundsWidth = this.#width ?? this.#element?.offsetWidth ?? globalThis.innerWidth;\n\n return (boundsWidth - width) / 2;\n }\n\n getTop(height)\n {\n const boundsHeight = this.#height ?? this.#element?.offsetHeight ?? globalThis.innerHeight;\n\n return (boundsHeight - height) / 2;\n }\n}\n","import { Centered } from './Centered.js';\n\nconst browserCentered = new Centered();\n\nexport { browserCentered, Centered };\n\n","export class PositionChangeSet\n{\n constructor()\n {\n this.left = false;\n this.top = false;\n this.width = false;\n this.height = false;\n this.maxHeight = false;\n this.maxWidth = false;\n this.minHeight = false;\n this.minWidth = false;\n this.zIndex = false;\n this.transform = false;\n this.transformOrigin = false;\n }\n\n hasChange()\n {\n return this.left || this.top || this.width || this.height || this.maxHeight || this.maxWidth || this.minHeight ||\n this.minWidth || this.zIndex || this.transform || this.transformOrigin;\n }\n\n set(value)\n {\n this.left = value;\n this.top = value;\n this.width = value;\n this.height = value;\n this.maxHeight = value;\n this.maxWidth = value;\n this.minHeight = value;\n this.minWidth = value;\n this.zIndex = value;\n this.transform = value;\n this.transformOrigin = value;\n }\n}\n","/**\n * Defines stored positional data.\n */\nexport class PositionData\n{\n constructor({ height = null, left = null, maxHeight = null, maxWidth = null, minHeight = null, minWidth = null,\n rotateX = null, rotateY = null, rotateZ = null, scale = null, translateX = null, translateY = null,\n translateZ = null, top = null, transformOrigin = null, width = null, zIndex = null } = {})\n {\n /**\n * @type {number|'auto'|'inherit'|null}\n */\n this.height = height;\n\n /**\n * @type {number|null}\n */\n this.left = left;\n\n /**\n * @type {number|null}\n */\n this.maxHeight = maxHeight;\n\n /**\n * @type {number|null}\n */\n this.maxWidth = maxWidth;\n\n /**\n * @type {number|null}\n */\n this.minHeight = minHeight;\n\n /**\n * @type {number|null}\n */\n this.minWidth = minWidth;\n\n /**\n * @type {number|null}\n */\n this.rotateX = rotateX;\n\n /**\n * @type {number|null}\n */\n this.rotateY = rotateY;\n\n /**\n * @type {number|null}\n */\n this.rotateZ = rotateZ;\n\n /**\n * @type {number|null}\n */\n this.scale = scale;\n\n /**\n * @type {number|null}\n */\n this.top = top;\n\n /**\n * @type {string|null}\n */\n this.transformOrigin = transformOrigin;\n\n /**\n * @type {number|null}\n */\n this.translateX = translateX;\n\n /**\n * @type {number|null}\n */\n this.translateY = translateY;\n\n /**\n * @type {number|null}\n */\n this.translateZ = translateZ;\n\n /**\n * @type {number|'auto'|'inherit'|null}\n */\n this.width = width;\n\n /**\n * @type {number|null}\n */\n this.zIndex = zIndex;\n\n Object.seal(this);\n }\n\n /**\n * Copies given data to this instance.\n *\n * @param {PositionData} data - Copy from this instance.\n *\n * @returns {PositionData} This instance.\n */\n copy(data)\n {\n this.height = data.height;\n this.left = data.left;\n this.maxHeight = data.maxHeight;\n this.maxWidth = data.maxWidth;\n this.minHeight = data.minHeight;\n this.minWidth = data.minWidth;\n this.rotateX = data.rotateX;\n this.rotateY = data.rotateY;\n this.rotateZ = data.rotateZ;\n this.scale = data.scale;\n this.top = data.top;\n this.transformOrigin = data.transformOrigin;\n this.translateX = data.translateX;\n this.translateY = data.translateY;\n this.translateZ = data.translateZ;\n this.width = data.width;\n this.zIndex = data.zIndex;\n\n return this;\n }\n}\n","import { linear } from 'svelte/easing';\n\nimport { lerp } from '@typhonjs-fvtt/runtime/svelte/math';\nimport { isIterable } from '@typhonjs-fvtt/runtime/svelte/util';\n\nexport class PositionStateAPI\n{\n /** @type {PositionData} */\n #data;\n\n /**\n * @type {Map<string, PositionDataExtended>}\n */\n #dataSaved = new Map();\n\n /** @type {Position} */\n #position;\n\n /** @type {Transforms} */\n #transforms;\n\n constructor(position, data, transforms)\n {\n this.#position = position;\n this.#data = data;\n this.#transforms = transforms;\n }\n\n /**\n * Returns any stored save state by name.\n *\n * @param {string} name - Saved data set name.\n *\n * @returns {PositionDataExtended} The saved data set.\n */\n get({ name })\n {\n if (typeof name !== 'string') { throw new TypeError(`Position - getSave error: 'name' is not a string.`); }\n\n return this.#dataSaved.get(name);\n }\n\n /**\n * Returns any associated default data.\n *\n * @returns {PositionDataExtended} Associated default data.\n */\n getDefault()\n {\n return this.#dataSaved.get('#defaultData');\n }\n\n /**\n * Removes and returns any position state by name.\n *\n * @param {object} options - Options.\n *\n * @param {string} options.name - Name to remove and retrieve.\n *\n * @returns {PositionDataExtended} Saved position data.\n */\n remove({ name })\n {\n if (typeof name !== 'string') { throw new TypeError(`Position - remove: 'name' is not a string.`); }\n\n const data = this.#dataSaved.get(name);\n this.#dataSaved.delete(name);\n\n return data;\n }\n\n /**\n * Resets data to default values and invokes set.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {boolean} [opts.keepZIndex=false] - When true keeps current z-index.\n *\n * @param {boolean} [opts.invokeSet=true] - When true invokes set method.\n *\n * @returns {boolean} Operation successful.\n */\n reset({ keepZIndex = false, invokeSet = true } = {})\n {\n const defaultData = this.#dataSaved.get('#defaultData');\n\n // Quit early if there is no saved default data.\n if (typeof defaultData !== 'object') { return false; }\n\n // Cancel all animations for Position if there are currently any scheduled.\n if (this.#position.animate.isScheduled)\n {\n this.#position.animate.cancel();\n }\n\n const zIndex = this.#position.zIndex;\n\n const data = Object.assign({}, defaultData);\n\n if (keepZIndex) { data.zIndex = zIndex; }\n\n // Reset the transform data.\n this.#transforms.reset(data);\n\n // If current minimized invoke `maximize`.\n if (this.#position.parent?.reactive?.minimized)\n {\n this.#position.parent?.maximize?.({ animate: false, duration: 0 });\n }\n\n // Note next clock tick scheduling.\n if (invokeSet) { setTimeout(() => this.#position.set(data), 0); }\n\n return true;\n }\n\n /**\n * Restores a saved positional state returning the data. Several optional parameters are available\n * to control whether the restore action occurs silently (no store / inline styles updates), animates\n * to the stored data, or simply sets the stored data. Restoring via {@link AnimationAPI.to} allows\n * specification of the duration, easing, and interpolate functions along with configuring a Promise to be\n * returned if awaiting the end of the animation.\n *\n * @param {object} params - Parameters\n *\n * @param {string} params.name - Saved data set name.\n *\n * @param {boolean} [params.remove=false] - Remove data set.\n *\n * @param {Iterable<string>} [params.properties] - Specific properties to set / animate.\n *\n * @param {boolean} [params.silent] - Set position data directly; no store or style updates.\n *\n * @param {boolean} [params.async=false] - If animating return a Promise that resolves with any saved data.\n *\n * @param {boolean} [params.animateTo=false] - Animate to restore data.\n *\n * @param {number} [params.duration=0.1] - Duration in seconds.\n *\n * @param {Function} [params.ease=linear] - Easing function.\n *\n * @param {Function} [params.interpolate=lerp] - Interpolation function.\n *\n * @returns {PositionDataExtended|Promise<PositionDataExtended>} Saved position data.\n */\n restore({ name, remove = false, properties, silent = false, async = false, animateTo = false, duration = 0.1,\n ease = linear, interpolate = lerp })\n {\n if (typeof name !== 'string') { throw new TypeError(`Position - restore error: 'name' is not a string.`); }\n\n const dataSaved = this.#dataSaved.get(name);\n\n if (dataSaved)\n {\n if (remove) { this.#dataSaved.delete(name); }\n\n let data = dataSaved;\n\n if (isIterable(properties))\n {\n data = {};\n for (const property of properties) { data[property] = dataSaved[property]; }\n }\n\n // Update data directly with no store or inline style updates.\n if (silent)\n {\n for (const property in data) { this.#data[property] = data[property]; }\n return dataSaved;\n }\n else if (animateTo) // Animate to saved data.\n {\n // Provide special handling to potentially change transform origin as this parameter is not animated.\n if (data.transformOrigin !== this.#position.transformOrigin)\n {\n this.#position.transformOrigin = data.transformOrigin;\n }\n\n // Return a Promise with saved data that resolves after animation ends.\n if (async)\n {\n return this.#position.animate.to(data, { duration, ease, interpolate }).finished.then(() => dataSaved);\n }\n else // Animate synchronously.\n {\n this.#position.animate.to(data, { duration, ease, interpolate });\n }\n }\n else\n {\n // Default options is to set data for an immediate update.\n this.#position.set(data);\n }\n }\n\n return dataSaved;\n }\n\n /**\n * Saves current position state with the opportunity to add extra data to the saved state.\n *\n * @param {object} opts - Options.\n *\n * @param {string} opts.name - name to index this saved data.\n *\n * @param {...*} [opts.extra] - Extra data to add to saved data.\n *\n * @returns {PositionData} Current position data\n */\n save({ name, ...extra })\n {\n if (typeof name !== 'string') { throw new TypeError(`Position - save error: 'name' is not a string.`); }\n\n const data = this.#position.get(extra);\n\n this.#dataSaved.set(name, data);\n\n return data;\n }\n\n /**\n * Directly sets a position state.\n *\n * @param {object} opts - Options.\n *\n * @param {string} opts.name - name to index this saved data.\n *\n * @param {...*} [opts.data] - Position data to set.\n */\n set({ name, ...data })\n {\n if (typeof name !== 'string') { throw new TypeError(`Position - set error: 'name' is not a string.`); }\n\n this.#dataSaved.set(name, data);\n }\n}\n","import { writable } from 'svelte/store';\n\nimport { propertyStore } from '@typhonjs-fvtt/runtime/svelte/store';\nimport { styleParsePixels } from '@typhonjs-fvtt/runtime/svelte/util';\n\nexport class StyleCache\n{\n constructor()\n {\n /** @type {HTMLElement|undefined} */\n this.el = void 0;\n\n /** @type {CSSStyleDeclaration} */\n this.computed = void 0;\n\n /** @type {number|undefined} */\n this.marginLeft = void 0;\n\n /** @type {number|undefined} */\n this.marginTop = void 0;\n\n /** @type {number|undefined} */\n this.maxHeight = void 0;\n\n /** @type {number|undefined} */\n this.maxWidth = void 0;\n\n /** @type {number|undefined} */\n this.minHeight = void 0;\n\n /** @type {number|undefined} */\n this.minWidth = void 0;\n\n /** @type {boolean} */\n this.hasWillChange = false;\n\n /**\n * @type {ResizeObserverData}\n */\n this.resizeObserved = {\n contentHeight: void 0,\n contentWidth: void 0,\n offsetHeight: void 0,\n offsetWidth: void 0\n };\n\n /**\n * Provides a writable store to track offset & content width / height from an associated `resizeObserver` action.\n *\n * @type {Writable<ResizeObserverData>}\n */\n const storeResizeObserved = writable(this.resizeObserved);\n\n this.stores = {\n element: writable(this.el),\n resizeContentHeight: propertyStore(storeResizeObserved, 'contentHeight'),\n resizeContentWidth: propertyStore(storeResizeObserved, 'contentWidth'),\n resizeObserved: storeResizeObserved,\n resizeOffsetHeight: propertyStore(storeResizeObserved, 'offsetHeight'),\n resizeOffsetWidth: propertyStore(storeResizeObserved, 'offsetWidth')\n };\n }\n\n /**\n * Returns the cached offsetHeight from any attached `resizeObserver` action otherwise gets the offsetHeight from\n * the element directly. The more optimized path is using `resizeObserver` as getting it from the element\n * directly is more expensive and alters the execution order of an animation frame.\n *\n * @returns {number} The element offsetHeight.\n */\n get offsetHeight()\n {\n if (this.el instanceof HTMLElement)\n {\n return this.resizeObserved.offsetHeight !== void 0 ? this.resizeObserved.offsetHeight : this.el.offsetHeight;\n }\n\n throw new Error(`StyleCache - get offsetHeight error: no element assigned.`);\n }\n\n /**\n * Returns the cached offsetWidth from any attached `resizeObserver` action otherwise gets the offsetWidth from\n * the element directly. The more optimized path is using `resizeObserver` as getting it from the element\n * directly is more expensive and alters the execution order of an animation frame.\n *\n * @returns {number} The element offsetHeight.\n */\n get offsetWidth()\n {\n if (this.el instanceof HTMLElement)\n {\n return this.resizeObserved.offsetWidth !== void 0 ? this.resizeObserved.offsetWidth : this.el.offsetWidth;\n }\n\n throw new Error(`StyleCache - get offsetWidth error: no element assigned.`);\n }\n\n /**\n * @param {HTMLElement} el -\n *\n * @returns {boolean} Does element match cached element.\n */\n hasData(el) { return this.el === el; }\n\n /**\n * Resets the style cache.\n */\n reset()\n {\n // Remove will-change inline style from previous element if it is still connected.\n if (this.el instanceof HTMLElement && this.el.isConnected && !this.hasWillChange)\n {\n this.el.style.willChange = null;\n }\n\n this.el = void 0;\n this.computed = void 0;\n this.marginLeft = void 0;\n this.marginTop = void 0;\n this.maxHeight = void 0;\n this.maxWidth = void 0;\n this.minHeight = void 0;\n this.minWidth = void 0;\n\n this.hasWillChange = false;\n\n // Silently reset `resizedObserved`; With proper usage the `resizeObserver` action issues an update on removal.\n this.resizeObserved.contentHeight = void 0;\n this.resizeObserved.contentWidth = void 0;\n this.resizeObserved.offsetHeight = void 0;\n this.resizeObserved.offsetWidth = void 0;\n\n // Reset the tracked element this Position instance is modifying.\n this.stores.element.set(void 0);\n }\n\n /**\n * Updates the style cache with new data from the given element.\n *\n * @param {HTMLElement} el - An HTML element.\n */\n update(el)\n {\n this.el = el;\n\n this.computed = globalThis.getComputedStyle(el);\n\n this.marginLeft = styleParsePixels(el.style.marginLeft) ?? styleParsePixels(this.computed.marginLeft);\n this.marginTop = styleParsePixels(el.style.marginTop) ?? styleParsePixels(this.computed.marginTop);\n this.maxHeight = styleParsePixels(el.style.maxHeight) ?? styleParsePixels(this.computed.maxHeight);\n this.maxWidth = styleParsePixels(el.style.maxWidth) ?? styleParsePixels(this.computed.maxWidth);\n\n // Note that the computed styles for below will always be 0px / 0 when no style is active.\n this.minHeight = styleParsePixels(el.style.minHeight) ?? styleParsePixels(this.computed.minHeight);\n this.minWidth = styleParsePixels(el.style.minWidth) ?? styleParsePixels(this.computed.minWidth);\n\n // Tracks if there already is a will-change property on the inline or computed styles.\n const willChange = el.style.willChange !== '' ? el.style.willChange : void 0 ?? this.computed.willChange;\n\n this.hasWillChange = willChange !== '' && willChange !== 'auto';\n\n // Update the tracked element this Position instance is modifying.\n this.stores.element.set(el);\n }\n}\n","import { mat4, vec3 } from '@typhonjs-fvtt/runtime/svelte/math';\n\n/**\n * Provides the output data for {@link Transforms.getData}.\n */\nexport class TransformData\n{\n constructor()\n {\n Object.seal(this);\n }\n\n /**\n * Stores the calculated bounding rectangle.\n *\n * @type {DOMRect}\n */\n #boundingRect = new DOMRect();\n\n /**\n * Stores the individual transformed corner points of the window in screenspace clockwise from:\n * top left -> top right -> bottom right -> bottom left.\n *\n * @type {Vector3[]}\n */\n #corners = [vec3.create(), vec3.create(), vec3.create(), vec3.create()];\n\n /**\n * Stores the current gl-matrix mat4 data.\n *\n * @type {Matrix4}\n */\n #mat4 = mat4.create();\n\n /**\n * Stores the pre & post origin translations to apply to matrix transforms.\n *\n * @type {Matrix4[]}\n */\n #originTranslations = [mat4.create(), mat4.create()];\n\n /**\n * @returns {DOMRect} The bounding rectangle.\n */\n get boundingRect() { return this.#boundingRect; }\n\n /**\n * @returns {Vector3[]} The transformed corner points as vec3 in screen space.\n */\n get corners() { return this.#corners; }\n\n /**\n * @returns {string} Returns the CSS style string for the transform matrix.\n */\n get css() { return `matrix3d(${this.mat4.join(',')})`; }\n\n /**\n * @returns {Matrix4} The transform matrix.\n */\n get mat4() { return this.#mat4; }\n\n /**\n * @returns {Matrix4[]} The pre / post translation matrices for origin translation.\n */\n get originTranslations() { return this.#originTranslations; }\n}\n\n/**\n * @typedef {Float32Array} Vector3 - 3 Dimensional Vector.\n *\n * @see https://glmatrix.net/docs/module-vec3.html\n */\n\n/**\n * @typedef {Float32Array} Matrix4 - 4x4 Matrix; Format: column-major, when typed out it looks like row-major.\n *\n * @see https://glmatrix.net/docs/module-mat4.html\n */\n","import { isObject } from '@typhonjs-fvtt/runtime/svelte/util';\n\n/**\n * Provides the storage and sequencing of managed position validators. Each validator added may be a bespoke function or\n * a {@link ValidatorData} object containing an `id`, `validator`, and `weight` attributes; `validator` is the only\n * required attribute.\n *\n * The `id` attribute can be anything that creates a unique ID for the validator; recommended strings or numbers. This\n * allows validators to be removed by ID easily.\n *\n * The `weight` attribute is a number between 0 and 1 inclusive that allows validators to be added in a\n * predictable order which is especially handy if they are manipulated at runtime. A lower weighted validator always\n * runs before a higher weighted validator. If no weight is specified the default of '1' is assigned and it is appended\n * to the end of the validators list.\n *\n * This class forms the public API which is accessible from the `.validators` getter in the main Position instance.\n * ```\n * const position = new Position(<PositionData>);\n * position.validators.add(...);\n * position.validators.clear();\n * position.validators.length;\n * position.validators.remove(...);\n * position.validators.removeBy(...);\n * position.validators.removeById(...);\n * ```\n */\nexport class AdapterValidators\n{\n /** @type {boolean} */\n #enabled = true;\n\n /**\n * @type {ValidatorData[]}\n */\n #validatorData;\n\n #mapUnsubscribe = new Map();\n\n /**\n * @returns {[AdapterValidators, ValidatorData[]]} Returns this and internal storage for validator adapter.\n */\n constructor()\n {\n this.#validatorData = [];\n\n Object.seal(this);\n\n return [this, this.#validatorData];\n }\n\n /**\n * @returns {boolean} Returns the enabled state.s\n */\n get enabled() { return this.#enabled; }\n\n /**\n * @returns {number} Returns the length of the validators array.\n */\n get length() { return this.#validatorData.length; }\n\n /**\n * @param {boolean} enabled - Sets enabled state.\n */\n set enabled(enabled)\n {\n if (typeof enabled !== 'boolean') { throw new TypeError(`'enabled' is not a boolean.`); }\n\n this.#enabled = enabled;\n }\n\n /**\n * Provides an iterator for validators.\n *\n * @returns {Generator<ValidatorData|undefined>} Generator / iterator of validators.\n * @yields {ValidatorData}\n */\n *[Symbol.iterator]()\n {\n if (this.#validatorData.length === 0) { return; }\n\n for (const entry of this.#validatorData)\n {\n yield { ...entry };\n }\n }\n\n /**\n * @param {...(ValidatorFn|ValidatorData)} validators -\n */\n add(...validators)\n {\n /**\n * Tracks the number of validators added that have subscriber functionality.\n *\n * @type {number}\n */\n // let subscribeCount = 0; // TODO: Currently unused\n\n for (const validator of validators)\n {\n const validatorType = typeof validator;\n\n if (validatorType !== 'function' && validatorType !== 'object' || validator === null)\n {\n throw new TypeError(`AdapterValidator error: 'validator' is not a function or object.`);\n }\n\n let data = void 0;\n let subscribeFn = void 0;\n\n switch (validatorType)\n {\n case 'function':\n data = {\n id: void 0,\n validator,\n weight: 1\n };\n\n subscribeFn = validator.subscribe;\n break;\n\n case 'object':\n if (typeof validator.validator !== 'function')\n {\n throw new TypeError(`AdapterValidator error: 'validator' attribute is not a function.`);\n }\n\n if (validator.weight !== void 0 && typeof validator.weight !== 'number' ||\n (validator.weight < 0 || validator.weight > 1))\n {\n throw new TypeError(\n `AdapterValidator error: 'weight' attribute is not a number between '0 - 1' inclusive.`);\n }\n\n data = {\n id: validator.id !== void 0 ? validator.id : void 0,\n validator: validator.validator.bind(validator),\n weight: validator.weight || 1,\n instance: validator\n };\n\n subscribeFn = validator.validator.subscribe ?? validator.subscribe;\n break;\n }\n\n // Find the index to insert where data.weight is less than existing values weight.\n const index = this.#validatorData.findIndex((value) =>\n {\n return data.weight < value.weight;\n });\n\n // If an index was found insert at that location.\n if (index >= 0)\n {\n this.#validatorData.splice(index, 0, data);\n }\n else // push to end of validators.\n {\n this.#validatorData.push(data);\n }\n\n if (typeof subscribeFn === 'function')\n {\n // TODO: consider how to handle validator updates.\n const unsubscribe = subscribeFn();\n\n // Ensure that unsubscribe is a function.\n if (typeof unsubscribe !== 'function')\n {\n throw new TypeError(\n 'AdapterValidator error: Filter has subscribe function, but no unsubscribe function is returned.');\n }\n\n // Ensure that the same validator is not subscribed to multiple times.\n if (this.#mapUnsubscribe.has(data.validator))\n {\n throw new Error(\n 'AdapterValidator error: Filter added already has an unsubscribe function registered.');\n }\n\n this.#mapUnsubscribe.set(data.validator, unsubscribe);\n // subscribeCount++; // TODO: Currently unused\n }\n }\n\n // Filters with subscriber functionality are assumed to immediately invoke the `subscribe` callback. If the\n // subscriber count is less than the amount of validators added then automatically trigger an index update\n // manually.\n // TODO: handle validator updates.\n // if (subscribeCount < validators.length) { this.#indexUpdate(); }\n }\n\n clear()\n {\n this.#validatorData.length = 0;\n\n // Unsubscribe from all validators with subscription support.\n for (const unsubscribe of this.#mapUnsubscribe.values())\n {\n unsubscribe();\n }\n\n this.#mapUnsubscribe.clear();\n\n // TODO: handle validator updates.\n // this.#indexUpdate();\n }\n\n /**\n * @param {...(ValidatorFn|ValidatorData)} validators -\n */\n remove(...validators)\n {\n const length = this.#validatorData.length;\n\n if (length === 0) { return; }\n\n for (const data of validators)\n {\n // Handle the case that the validator may either be a function or a validator entry / object.\n const actualValidator = typeof data === 'function' ? data : isObject(data) ? data.validator : void 0;\n\n if (!actualValidator) { continue; }\n\n for (let cntr = this.#validatorData.length; --cntr >= 0;)\n {\n if (this.#validatorData[cntr].validator === actualValidator)\n {\n this.#validatorData.splice(cntr, 1);\n\n // Invoke any unsubscribe function for given validator then remove from tracking.\n let unsubscribe = void 0;\n if (typeof (unsubscribe = this.#mapUnsubscribe.get(actualValidator)) === 'function')\n {\n unsubscribe();\n this.#mapUnsubscribe.delete(actualValidator);\n }\n }\n }\n }\n\n // Update the index a validator was removed.\n // TODO: handle validator updates.\n // if (length !== this.#validatorData.length) { this.#indexUpdate(); }\n }\n\n /**\n * Remove validators by the provided callback. The callback takes 3 parameters: `id`, `validator`, and `weight`.\n * Any truthy value returned will remove that validator.\n *\n * @param {function(*, ValidatorFn, number): boolean} callback - Callback function to evaluate each validator\n * entry.\n */\n removeBy(callback)\n {\n const length = this.#validatorData.length;\n\n if (length === 0) { return; }\n\n if (typeof callback !== 'function')\n {\n throw new TypeError(`AdapterValidator error: 'callback' is not a function.`);\n }\n\n this.#validatorData = this.#validatorData.filter((data) =>\n {\n const remove = callback.call(callback, { ...data });\n\n if (remove)\n {\n let unsubscribe;\n if (typeof (unsubscribe = this.#mapUnsubscribe.get(data.validator)) === 'function')\n {\n unsubscribe();\n this.#mapUnsubscribe.delete(data.validator);\n }\n }\n\n // Reverse remove boolean to properly validator / remove this validator.\n return !remove;\n });\n\n // TODO: handle validator updates.\n // if (length !== this.#validatorData.length) { this.#indexUpdate(); }\n }\n\n removeById(...ids)\n {\n const length = this.#validatorData.length;\n\n if (length === 0) { return; }\n\n this.#validatorData = this.#validatorData.filter((data) =>\n {\n let remove = false;\n\n for (const id of ids) { remove |= data.id === id; }\n\n // If not keeping invoke any unsubscribe function for given validator then remove from tracking.\n if (remove)\n {\n let unsubscribe;\n if (typeof (unsubscribe = this.#mapUnsubscribe.get(data.validator)) === 'function')\n {\n unsubscribe();\n this.#mapUnsubscribe.delete(data.validator);\n }\n }\n\n return !remove; // Swap here to actually remove the item via array validator method.\n });\n\n // TODO: handle validator updates.\n // if (length !== this.#validatorData.length) { this.#indexUpdate(); }\n }\n}\n\n/**\n * @callback ValidatorFn - Position validator function that takes a {@link PositionData} instance potentially\n * modifying it or returning null if invalid.\n *\n * @param {ValidationData} valData - Validation data.\n *\n * @returns {PositionData|null} The validated position data or null to cancel position update.\n *\n */\n\n/**\n * @typedef {object} ValidatorData\n *\n * @property {*} [id=undefined] - An ID associated with this validator. Can be used to remove the validator.\n *\n * @property {ValidatorFn} validator - Position validator function that takes a {@link PositionData} instance\n * potentially modifying it or returning null if invalid.\n *\n * @property {number} [weight=1] - A number between 0 and 1 inclusive to position this validator against others.\n *\n * @property {Function} [subscribe] - Optional subscribe function following the Svelte store / subscribe pattern.\n */\n\n/**\n * @typedef {ValidatorFn|ValidatorData|Iterable<ValidatorFn|ValidatorData>} PositionValidatorOptions Defines the\n * position validator options.\n */\n","export class BasicBounds\n{\n /**\n * When true constrains the min / max width or height to element.\n *\n * @type {boolean}\n */\n #constrain;\n\n /**\n * @type {HTMLElement}\n */\n #element;\n\n /**\n * When true the validator is active.\n *\n * @type {boolean}\n */\n #enabled;\n\n /**\n * Provides a manual setting of the element height. As things go `offsetHeight` causes a browser layout and is not\n * performance oriented. If manually set this height is used instead of `offsetHeight`.\n *\n * @type {number}\n */\n #height;\n\n /**\n * Set from an optional value in the constructor to lock accessors preventing modification.\n */\n #lock;\n\n /**\n * Provides a manual setting of the element width. As things go `offsetWidth` causes a browser layout and is not\n * performance oriented. If manually set this width is used instead of `offsetWidth`.\n *\n * @type {number}\n */\n #width;\n\n constructor({ constrain = true, element, enabled = true, lock = false, width, height } = {})\n {\n this.element = element;\n this.constrain = constrain;\n this.enabled = enabled;\n this.width = width;\n this.height = height;\n\n this.#lock = typeof lock === 'boolean' ? lock : false;\n }\n\n get constrain() { return this.#constrain; }\n\n get element() { return this.#element; }\n\n get enabled() { return this.#enabled; }\n\n get height() { return this.#height; }\n\n get width() { return this.#width; }\n\n set constrain(constrain)\n {\n if (this.#lock) { return; }\n\n if (typeof constrain !== 'boolean') { throw new TypeError(`'constrain' is not a boolean.`); }\n\n this.#constrain = constrain;\n }\n\n set element(element)\n {\n if (this.#lock) { return; }\n\n if (element === void 0 || element === null || element instanceof HTMLElement)\n {\n this.#element = element;\n }\n else\n {\n throw new TypeError(`'element' is not a HTMLElement, undefined, or null.`);\n }\n }\n\n set enabled(enabled)\n {\n if (this.#lock) { return; }\n\n if (typeof enabled !== 'boolean') { throw new TypeError(`'enabled' is not a boolean.`); }\n\n this.#enabled = enabled;\n }\n\n set height(height)\n {\n if (this.#lock) { return; }\n\n if (height === void 0 || Number.isFinite(height))\n {\n this.#height = height;\n }\n else\n {\n throw new TypeError(`'height' is not a finite number or undefined.`);\n }\n }\n\n set width(width)\n {\n if (this.#lock) { return; }\n\n if (width === void 0 || Number.isFinite(width))\n {\n this.#width = width;\n }\n else\n {\n throw new TypeError(`'width' is not a finite number or undefined.`);\n }\n }\n\n setDimension(width, height)\n {\n if (this.#lock) { return; }\n\n if (width === void 0 || Number.isFinite(width))\n {\n this.#width = width;\n }\n else\n {\n throw new TypeError(`'width' is not a finite number or undefined.`);\n }\n\n if (height === void 0 || Number.isFinite(height))\n {\n this.#height = height;\n }\n else\n {\n throw new TypeError(`'height' is not a finite number or undefined.`);\n }\n }\n\n /**\n * Provides a validator that respects transforms in positional data constraining the position to within the target\n * elements bounds.\n *\n * @param {ValidationData} valData - The associated validation data for position updates.\n *\n * @returns {PositionData} Potentially adjusted position data.\n */\n validator(valData)\n {\n // Early out if element is undefined or local enabled state is false.\n if (!this.#enabled) { return valData.position; }\n\n // Determine containing bounds from manual values; or any element; lastly the browser width / height.\n const boundsWidth = this.#width ?? this.#element?.offsetWidth ?? globalThis.innerWidth;\n const boundsHeight = this.#height ?? this.#element?.offsetHeight ?? globalThis.innerHeight;\n\n if (typeof valData.position.width === 'number')\n {\n const maxW = valData.maxWidth ?? (this.#constrain ? boundsWidth : Number.MAX_SAFE_INTEGER);\n valData.position.width = valData.width = Math.clamped(valData.position.width, valData.minWidth, maxW);\n\n if ((valData.width + valData.position.left + valData.marginLeft) > boundsWidth)\n {\n valData.position.left = boundsWidth - valData.width - valData.marginLeft;\n }\n }\n\n if (typeof valData.position.height === 'number')\n {\n const maxH = valData.maxHeight ?? (this.#constrain ? boundsHeight : Number.MAX_SAFE_INTEGER);\n valData.position.height = valData.height = Math.clamped(valData.position.height, valData.minHeight, maxH);\n\n if ((valData.height + valData.position.top + valData.marginTop) > boundsHeight)\n {\n valData.position.top = boundsHeight - valData.height - valData.marginTop;\n }\n }\n\n const maxL = Math.max(boundsWidth - valData.width - valData.marginLeft, 0);\n valData.position.left = Math.round(Math.clamped(valData.position.left, 0, maxL));\n\n const maxT = Math.max(boundsHeight - valData.height - valData.marginTop, 0);\n valData.position.top = Math.round(Math.clamped(valData.position.top, 0, maxT));\n\n return valData.position;\n }\n}\n","import { TransformData } from '../transform/TransformData.js';\n\nconst s_TRANSFORM_DATA = new TransformData();\n\nexport class TransformBounds\n{\n /**\n * When true constrains the min / max width or height to element.\n *\n * @type {boolean}\n */\n #constrain;\n\n /**\n * @type {HTMLElement}\n */\n #element;\n\n /**\n * When true the validator is active.\n *\n * @type {boolean}\n */\n #enabled;\n\n /**\n * Provides a manual setting of the element height. As things go `offsetHeight` causes a browser layout and is not\n * performance oriented. If manually set this height is used instead of `offsetHeight`.\n *\n * @type {number}\n */\n #height;\n\n /**\n * Set from an optional value in the constructor to lock accessors preventing modification.\n */\n #lock;\n\n /**\n * Provides a manual setting of the element width. As things go `offsetWidth` causes a browser layout and is not\n * performance oriented. If manually set this width is used instead of `offsetWidth`.\n *\n * @type {number}\n */\n #width;\n\n constructor({ constrain = true, element, enabled = true, lock = false, width, height } = {})\n {\n this.element = element;\n this.constrain = constrain;\n this.enabled = enabled;\n this.width = width;\n this.height = height;\n\n this.#lock = typeof lock === 'boolean' ? lock : false;\n }\n\n get constrain() { return this.#constrain; }\n\n get element() { return this.#element; }\n\n get enabled() { return this.#enabled; }\n\n get height() { return this.#height; }\n\n get width() { return this.#width; }\n\n set constrain(constrain)\n {\n if (this.#lock) { return; }\n\n if (typeof constrain !== 'boolean') { throw new TypeError(`'constrain' is not a boolean.`); }\n\n this.#constrain = constrain;\n }\n\n set element(element)\n {\n if (this.#lock) { return; }\n\n if (element === void 0 || element === null || element instanceof HTMLElement)\n {\n this.#element = element;\n }\n else\n {\n throw new TypeError(`'element' is not a HTMLElement, undefined, or null.`);\n }\n }\n\n set enabled(enabled)\n {\n if (this.#lock) { return; }\n\n if (typeof enabled !== 'boolean') { throw new TypeError(`'enabled' is not a boolean.`); }\n\n this.#enabled = enabled;\n }\n\n set height(height)\n {\n if (this.#lock) { return; }\n\n if (height === void 0 || Number.isFinite(height))\n {\n this.#height = height;\n }\n else\n {\n throw new TypeError(`'height' is not a finite number or undefined.`);\n }\n }\n\n set width(width)\n {\n if (this.#lock) { return; }\n\n if (width === void 0 || Number.isFinite(width))\n {\n this.#width = width;\n }\n else\n {\n throw new TypeError(`'width' is not a finite number or undefined.`);\n }\n }\n\n setDimension(width, height)\n {\n if (this.#lock) { return; }\n\n if (width === void 0 || Number.isFinite(width))\n {\n this.#width = width;\n }\n else\n {\n throw new TypeError(`'width' is not a finite number or undefined.`);\n }\n\n if (height === void 0 || Number.isFinite(height))\n {\n this.#height = height;\n }\n else\n {\n throw new TypeError(`'height' is not a finite number or undefined.`);\n }\n }\n\n /**\n * Provides a validator that respects transforms in positional data constraining the position to within the target\n * elements bounds.\n *\n * @param {ValidationData} valData - The associated validation data for position updates.\n *\n * @returns {PositionData} Potentially adjusted position data.\n */\n validator(valData)\n {\n // Early out if element is undefined or local enabled state is false.\n if (!this.#enabled) { return valData.position; }\n\n // Determine containing bounds from manual values; or any element; lastly the browser width / height.\n const boundsWidth = this.#width ?? this.#element?.offsetWidth ?? globalThis.innerWidth;\n const boundsHeight = this.#height ?? this.#element?.offsetHeight ?? globalThis.innerHeight;\n\n // Ensure min / max width constraints when position width is a number; not 'auto' or 'inherit'. If constrain is\n // true cap width bounds.\n if (typeof valData.position.width === 'number')\n {\n const maxW = valData.maxWidth ?? (this.#constrain ? boundsWidth : Number.MAX_SAFE_INTEGER);\n valData.position.width = Math.clamped(valData.width, valData.minWidth, maxW);\n }\n\n // Ensure min / max height constraints when position height is a number; not 'auto' or 'inherit'. If constrain\n // is true cap height bounds.\n if (typeof valData.position.height === 'number')\n {\n const maxH = valData.maxHeight ?? (this.#constrain ? boundsHeight : Number.MAX_SAFE_INTEGER);\n valData.position.height = Math.clamped(valData.height, valData.minHeight, maxH);\n }\n\n // Get transform data. First set constraints including any margin top / left as offsets and width / height. Used\n // when position width / height is 'auto'.\n const data = valData.transforms.getData(valData.position, s_TRANSFORM_DATA, valData);\n\n // Check the bounding rectangle against browser height / width. Adjust position based on how far the overlap of\n // the bounding rect is outside the bounds height / width. The order below matters as the constraints are top /\n // left oriented, so perform those checks last.\n\n const initialX = data.boundingRect.x;\n const initialY = data.boundingRect.y;\n\n if (data.boundingRect.bottom + valData.marginTop > boundsHeight)\n {\n data.boundingRect.y += boundsHeight - data.boundingRect.bottom - valData.marginTop;\n }\n\n if (data.boundingRect.right + valData.marginLeft > boundsWidth)\n {\n data.boundingRect.x += boundsWidth - data.boundingRect.right - valData.marginLeft;\n }\n\n if (data.boundingRect.top - valData.marginTop < 0)\n {\n data.boundingRect.y += Math.abs(data.boundingRect.top - valData.marginTop);\n }\n\n if (data.boundingRect.left - valData.marginLeft < 0)\n {\n data.boundingRect.x += Math.abs(data.boundingRect.left - valData.marginLeft);\n }\n\n valData.position.left -= initialX - data.boundingRect.x;\n valData.position.top -= initialY - data.boundingRect.y;\n\n return valData.position;\n }\n}\n","import { BasicBounds } from './BasicBounds.js';\nimport { TransformBounds } from './TransformBounds.js';\n\nconst basicWindow = new BasicBounds({ lock: true });\nconst transformWindow = new TransformBounds({ lock: true });\n\nexport { basicWindow, BasicBounds, transformWindow, TransformBounds };\n","import { degToRad, mat4, vec3 } from '@typhonjs-fvtt/runtime/svelte/math';\n\nimport * as constants from '../constants.js';\n\nimport { TransformData } from './TransformData.js';\n\n/** @type {number[]} */\nconst s_SCALE_VECTOR = [1, 1, 1];\n\n/** @type {number[]} */\nconst s_TRANSLATE_VECTOR = [0, 0, 0];\n\n/** @type {Matrix4} */\nconst s_MAT4_RESULT = mat4.create();\n\n/** @type {Matrix4} */\nconst s_MAT4_TEMP = mat4.create();\n\n/** @type {Vector3} */\nconst s_VEC3_TEMP = vec3.create();\n\nexport class Transforms\n{\n /**\n * Stores the transform keys in the order added.\n *\n * @type {string[]}\n */\n #orderList = [];\n\n constructor()\n {\n this._data = {};\n }\n\n /**\n * @returns {boolean} Whether there are active transforms in local data.\n */\n get isActive() { return this.#orderList.length > 0; }\n\n /**\n * @returns {number|undefined} Any local rotateX data.\n */\n get rotateX() { return this._data.rotateX; }\n\n /**\n * @returns {number|undefined} Any local rotateY data.\n */\n get rotateY() { return this._data.rotateY; }\n\n /**\n * @returns {number|undefined} Any local rotateZ data.\n */\n get rotateZ() { return this._data.rotateZ; }\n\n /**\n * @returns {number|undefined} Any local rotateZ scale.\n */\n get scale() { return this._data.scale; }\n\n /**\n * @returns {number|undefined} Any local translateZ data.\n */\n get translateX() { return this._data.translateX; }\n\n /**\n * @returns {number|undefined} Any local translateZ data.\n */\n get translateY() { return this._data.translateY; }\n\n /**\n * @returns {number|undefined} Any local translateZ data.\n */\n get translateZ() { return this._data.translateZ; }\n\n /**\n * Sets the local rotateX data if the value is a finite number otherwise removes the local data.\n *\n * @param {number|null|undefined} value - A value to set.\n */\n set rotateX(value)\n {\n if (Number.isFinite(value))\n {\n if (this._data.rotateX === void 0) { this.#orderList.push('rotateX'); }\n\n this._data.rotateX = value;\n }\n else\n {\n if (this._data.rotateX !== void 0)\n {\n const index = this.#orderList.findIndex((entry) => entry === 'rotateX');\n if (index >= 0) { this.#orderList.splice(index, 1); }\n }\n\n delete this._data.rotateX;\n }\n }\n\n /**\n * Sets the local rotateY data if the value is a finite number otherwise removes the local data.\n *\n * @param {number|null|undefined} value - A value to set.\n */\n set rotateY(value)\n {\n if (Number.isFinite(value))\n {\n if (this._data.rotateY === void 0) { this.#orderList.push('rotateY'); }\n\n this._data.rotateY = value;\n }\n else\n {\n if (this._data.rotateY !== void 0)\n {\n const index = this.#orderList.findIndex((entry) => entry === 'rotateY');\n if (index >= 0) { this.#orderList.splice(index, 1); }\n }\n\n delete this._data.rotateY;\n }\n }\n\n /**\n * Sets the local rotateZ data if the value is a finite number otherwise removes the local data.\n *\n * @param {number|null|undefined} value - A value to set.\n */\n set rotateZ(value)\n {\n if (Number.isFinite(value))\n {\n if (this._data.rotateZ === void 0) { this.#orderList.push('rotateZ'); }\n\n this._data.rotateZ = value;\n }\n\n else\n {\n if (this._data.rotateZ !== void 0)\n {\n const index = this.#orderList.findIndex((entry) => entry === 'rotateZ');\n if (index >= 0) { this.#orderList.splice(index, 1); }\n }\n\n delete this._data.rotateZ;\n }\n }\n\n /**\n * Sets the local scale data if the value is a finite number otherwise removes the local data.\n *\n * @param {number|null|undefined} value - A value to set.\n */\n set scale(value)\n {\n if (Number.isFinite(value))\n {\n if (this._data.scale === void 0) { this.#orderList.push('scale'); }\n\n this._data.scale = value;\n }\n else\n {\n if (this._data.scale !== void 0)\n {\n const index = this.#orderList.findIndex((entry) => entry === 'scale');\n if (index >= 0) { this.#orderList.splice(index, 1); }\n }\n\n delete this._data.scale;\n }\n }\n\n /**\n * Sets the local translateX data if the value is a finite number otherwise removes the local data.\n *\n * @param {number|null|undefined} value - A value to set.\n */\n set translateX(value)\n {\n if (Number.isFinite(value))\n {\n if (this._data.translateX === void 0) { this.#orderList.push('translateX'); }\n\n this._data.translateX = value;\n }\n\n else\n {\n if (this._data.translateX !== void 0)\n {\n const index = this.#orderList.findIndex((entry) => entry === 'translateX');\n if (index >= 0) { this.#orderList.splice(index, 1); }\n }\n\n delete this._data.translateX;\n }\n }\n\n /**\n * Sets the local translateY data if the value is a finite number otherwise removes the local data.\n *\n * @param {number|null|undefined} value - A value to set.\n */\n set translateY(value)\n {\n if (Number.isFinite(value))\n {\n if (this._data.translateY === void 0) { this.#orderList.push('translateY'); }\n\n this._data.translateY = value;\n }\n\n else\n {\n if (this._data.translateY !== void 0)\n {\n const index = this.#orderList.findIndex((entry) => entry === 'translateY');\n if (index >= 0) { this.#orderList.splice(index, 1); }\n }\n\n delete this._data.translateY;\n }\n }\n\n /**\n * Sets the local translateZ data if the value is a finite number otherwise removes the local data.\n *\n * @param {number|null|undefined} value - A value to set.\n */\n set translateZ(value)\n {\n if (Number.isFinite(value))\n {\n if (this._data.translateZ === void 0) { this.#orderList.push('translateZ'); }\n\n this._data.translateZ = value;\n }\n\n else\n {\n if (this._data.translateZ !== void 0)\n {\n const index = this.#orderList.findIndex((entry) => entry === 'translateZ');\n if (index >= 0) { this.#orderList.splice(index, 1); }\n }\n\n delete this._data.translateZ;\n }\n }\n\n /**\n * Returns the matrix3d CSS transform for the given position / transform data.\n *\n * @param {object} [data] - Optional position data otherwise use local stored transform data.\n *\n * @returns {string} The CSS matrix3d string.\n */\n getCSS(data = this._data)\n {\n return `matrix3d(${this.getMat4(data, s_MAT4_RESULT).join(',')})`;\n }\n\n /**\n * Returns the matrix3d CSS transform for the given position / transform data.\n *\n * @param {object} [data] - Optional position data otherwise use local stored transform data.\n *\n * @returns {string} The CSS matrix3d string.\n */\n getCSSOrtho(data = this._data)\n {\n return `matrix3d(${this.getMat4Ortho(data, s_MAT4_RESULT).join(',')})`;\n }\n\n /**\n * Collects all data including a bounding rect, transform matrix, and points array of the given {@link PositionData}\n * instance with the applied local transform data.\n *\n * @param {PositionData} position - The position data to process.\n *\n * @param {TransformData} [output] - Optional TransformData output instance.\n *\n * @param {object} [validationData] - Optional validation data for adjustment parameters.\n *\n * @returns {TransformData} The output TransformData instance.\n */\n getData(position, output = new TransformData(), validationData = {})\n {\n const valWidth = validationData.width ?? 0;\n const valHeight = validationData.height ?? 0;\n const valOffsetTop = validationData.offsetTop ?? validationData.marginTop ?? 0;\n const valOffsetLeft = validationData.offsetLeft ?? validationData.offsetLeft ?? 0;\n\n position.top += valOffsetTop;\n position.left += valOffsetLeft;\n\n const width = Number.isFinite(position.width) ? position.width : valWidth;\n const height = Number.isFinite(position.height) ? position.height : valHeight;\n\n const rect = output.corners;\n\n if (this.hasTransform(position))\n {\n rect[0][0] = rect[0][1] = rect[0][2] = 0;\n rect[1][0] = width;\n rect[1][1] = rect[1][2] = 0;\n rect[2][0] = width;\n rect[2][1] = height;\n rect[2][2] = 0;\n rect[3][0] = 0;\n rect[3][1] = height;\n rect[3][2] = 0;\n\n const matrix = this.getMat4(position, output.mat4);\n\n const translate = s_GET_ORIGIN_TRANSLATION(position.transformOrigin, width, height, output.originTranslations);\n\n if (constants.transformOriginDefault === position.transformOrigin)\n {\n vec3.transformMat4(rect[0], rect[0], matrix);\n vec3.transformMat4(rect[1], rect[1], matrix);\n vec3.transformMat4(rect[2], rect[2], matrix);\n vec3.transformMat4(rect[3], rect[3], matrix);\n }\n else\n {\n vec3.transformMat4(rect[0], rect[0], translate[0]);\n vec3.transformMat4(rect[0], rect[0], matrix);\n vec3.transformMat4(rect[0], rect[0], translate[1]);\n\n vec3.transformMat4(rect[1], rect[1], translate[0]);\n vec3.transformMat4(rect[1], rect[1], matrix);\n vec3.transformMat4(rect[1], rect[1], translate[1]);\n\n vec3.transformMat4(rect[2], rect[2], translate[0]);\n vec3.transformMat4(rect[2], rect[2], matrix);\n vec3.transformMat4(rect[2], rect[2], translate[1]);\n\n vec3.transformMat4(rect[3], rect[3], translate[0]);\n vec3.transformMat4(rect[3], rect[3], matrix);\n vec3.transformMat4(rect[3], rect[3], translate[1]);\n }\n\n rect[0][0] = position.left + rect[0][0];\n rect[0][1] = position.top + rect[0][1];\n rect[1][0] = position.left + rect[1][0];\n rect[1][1] = position.top + rect[1][1];\n rect[2][0] = position.left + rect[2][0];\n rect[2][1] = position.top + rect[2][1];\n rect[3][0] = position.left + rect[3][0];\n rect[3][1] = position.top + rect[3][1];\n }\n else\n {\n rect[0][0] = position.left;\n rect[0][1] = position.top;\n rect[1][0] = position.left + width;\n rect[1][1] = position.top;\n rect[2][0] = position.left + width;\n rect[2][1] = position.top + height;\n rect[3][0] = position.left;\n rect[3][1] = position.top + height;\n\n mat4.identity(output.mat4);\n }\n\n let maxX = Number.MIN_SAFE_INTEGER;\n let maxY = Number.MIN_SAFE_INTEGER;\n let minX = Number.MAX_SAFE_INTEGER;\n let minY = Number.MAX_SAFE_INTEGER;\n\n for (let cntr = 4; --cntr >= 0;)\n {\n if (rect[cntr][0] > maxX) { maxX = rect[cntr][0]; }\n if (rect[cntr][0] < minX) { minX = rect[cntr][0]; }\n if (rect[cntr][1] > maxY) { maxY = rect[cntr][1]; }\n if (rect[cntr][1] < minY) { minY = rect[cntr][1]; }\n }\n\n const boundingRect = output.boundingRect;\n boundingRect.x = minX;\n boundingRect.y = minY;\n boundingRect.width = maxX - minX;\n boundingRect.height = maxY - minY;\n\n position.top -= valOffsetTop;\n position.left -= valOffsetLeft;\n\n return output;\n }\n\n /**\n * Creates a transform matrix based on local data applied in order it was added.\n *\n * If no data object is provided then the source is the local transform data. If another data object is supplied\n * then the stored local transform order is applied then all remaining transform keys are applied. This allows the\n * construction of a transform matrix in advance of setting local data and is useful in collision detection.\n *\n * @param {object} [data] - PositionData instance or local transform data.\n *\n * @param {Matrix4} [output] - The output mat4 instance.\n *\n * @returns {Matrix4} Transform matrix.\n */\n getMat4(data = this._data, output = mat4.create())\n {\n const matrix = mat4.identity(output);\n\n // Bitwise tracks applied transform keys from local transform data.\n let seenKeys = 0;\n\n const orderList = this.#orderList;\n\n // First apply ordered transforms from local transform data.\n for (let cntr = 0; cntr < orderList.length; cntr++)\n {\n const key = orderList[cntr];\n\n switch (key)\n {\n case 'rotateX':\n seenKeys |= constants.transformKeysBitwise.rotateX;\n mat4.multiply(matrix, matrix, mat4.fromXRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n\n case 'rotateY':\n seenKeys |= constants.transformKeysBitwise.rotateY;\n mat4.multiply(matrix, matrix, mat4.fromYRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n\n case 'rotateZ':\n seenKeys |= constants.transformKeysBitwise.rotateZ;\n mat4.multiply(matrix, matrix, mat4.fromZRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n\n case 'scale':\n seenKeys |= constants.transformKeysBitwise.scale;\n s_SCALE_VECTOR[0] = s_SCALE_VECTOR[1] = data[key];\n mat4.multiply(matrix, matrix, mat4.fromScaling(s_MAT4_TEMP, s_SCALE_VECTOR));\n break;\n\n case 'translateX':\n seenKeys |= constants.transformKeysBitwise.translateX;\n s_TRANSLATE_VECTOR[0] = data.translateX;\n s_TRANSLATE_VECTOR[1] = 0;\n s_TRANSLATE_VECTOR[2] = 0;\n mat4.multiply(matrix, matrix, mat4.fromTranslation(s_MAT4_TEMP, s_TRANSLATE_VECTOR));\n break;\n\n case 'translateY':\n seenKeys |= constants.transformKeysBitwise.translateY;\n s_TRANSLATE_VECTOR[0] = 0;\n s_TRANSLATE_VECTOR[1] = data.translateY;\n s_TRANSLATE_VECTOR[2] = 0;\n mat4.multiply(matrix, matrix, mat4.fromTranslation(s_MAT4_TEMP, s_TRANSLATE_VECTOR));\n break;\n\n case 'translateZ':\n seenKeys |= constants.transformKeysBitwise.translateZ;\n s_TRANSLATE_VECTOR[0] = 0;\n s_TRANSLATE_VECTOR[1] = 0;\n s_TRANSLATE_VECTOR[2] = data.translateZ;\n mat4.multiply(matrix, matrix, mat4.fromTranslation(s_MAT4_TEMP, s_TRANSLATE_VECTOR));\n break;\n }\n }\n\n // Now apply any new keys not set in local transform data that have not been applied yet.\n if (data !== this._data)\n {\n for (let cntr = 0; cntr < constants.transformKeys.length; cntr++)\n {\n const key = constants.transformKeys[cntr];\n\n // Reject bad / no data or if the key has already been applied.\n if (data[key] === null || (seenKeys & constants.transformKeysBitwise[key]) > 0) { continue; }\n\n switch (key)\n {\n case 'rotateX':\n mat4.multiply(matrix, matrix, mat4.fromXRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n\n case 'rotateY':\n mat4.multiply(matrix, matrix, mat4.fromYRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n\n case 'rotateZ':\n mat4.multiply(matrix, matrix, mat4.fromZRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n\n case 'scale':\n s_SCALE_VECTOR[0] = s_SCALE_VECTOR[1] = data[key];\n mat4.multiply(matrix, matrix, mat4.fromScaling(s_MAT4_TEMP, s_SCALE_VECTOR));\n break;\n\n case 'translateX':\n s_TRANSLATE_VECTOR[0] = data[key];\n s_TRANSLATE_VECTOR[1] = 0;\n s_TRANSLATE_VECTOR[2] = 0;\n mat4.multiply(matrix, matrix, mat4.fromTranslation(s_MAT4_TEMP, s_TRANSLATE_VECTOR));\n break;\n\n case 'translateY':\n s_TRANSLATE_VECTOR[0] = 0;\n s_TRANSLATE_VECTOR[1] = data[key];\n s_TRANSLATE_VECTOR[2] = 0;\n mat4.multiply(matrix, matrix, mat4.fromTranslation(s_MAT4_TEMP, s_TRANSLATE_VECTOR));\n break;\n\n case 'translateZ':\n s_TRANSLATE_VECTOR[0] = 0;\n s_TRANSLATE_VECTOR[1] = 0;\n s_TRANSLATE_VECTOR[2] = data[key];\n mat4.multiply(matrix, matrix, mat4.fromTranslation(s_MAT4_TEMP, s_TRANSLATE_VECTOR));\n break;\n }\n }\n }\n\n return matrix;\n }\n\n /**\n * Provides an orthographic enhancement to convert left / top positional data to a translate operation.\n *\n * This transform matrix takes into account that the remaining operations are , but adds any left / top attributes from passed in data to\n * translate X / Y.\n *\n * If no data object is provided then the source is the local transform data. If another data object is supplied\n * then the stored local transform order is applied then all remaining transform keys are applied. This allows the\n * construction of a transform matrix in advance of setting local data and is useful in collision detection.\n *\n * @param {object} [data] - PositionData instance or local transform data.\n *\n * @param {Matrix4} [output] - The output mat4 instance.\n *\n * @returns {Matrix4} Transform matrix.\n */\n getMat4Ortho(data = this._data, output = mat4.create())\n {\n const matrix = mat4.identity(output);\n\n // Attempt to retrieve values from passed in data otherwise default to 0.\n // Always perform the translation last regardless of order added to local transform data.\n // Add data.left to translateX and data.top to translateY.\n s_TRANSLATE_VECTOR[0] = (data.left ?? 0) + (data.translateX ?? 0);\n s_TRANSLATE_VECTOR[1] = (data.top ?? 0) + (data.translateY ?? 0);\n s_TRANSLATE_VECTOR[2] = data.translateZ ?? 0;\n mat4.multiply(matrix, matrix, mat4.fromTranslation(s_MAT4_TEMP, s_TRANSLATE_VECTOR));\n\n // Scale can also be applied out of order.\n if (data.scale !== null)\n {\n s_SCALE_VECTOR[0] = s_SCALE_VECTOR[1] = data.scale;\n mat4.multiply(matrix, matrix, mat4.fromScaling(s_MAT4_TEMP, s_SCALE_VECTOR));\n }\n\n // Early out if there is not rotation data.\n if (data.rotateX === null && data.rotateY === null && data.rotateZ === null) { return matrix; }\n\n // Rotation transforms must be applied in the order they are added.\n\n // Bitwise tracks applied transform keys from local transform data.\n let seenKeys = 0;\n\n const orderList = this.#orderList;\n\n // First apply ordered transforms from local transform data.\n for (let cntr = 0; cntr < orderList.length; cntr++)\n {\n const key = orderList[cntr];\n\n switch (key)\n {\n case 'rotateX':\n seenKeys |= constants.transformKeysBitwise.rotateX;\n mat4.multiply(matrix, matrix, mat4.fromXRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n\n case 'rotateY':\n seenKeys |= constants.transformKeysBitwise.rotateY;\n mat4.multiply(matrix, matrix, mat4.fromYRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n\n case 'rotateZ':\n seenKeys |= constants.transformKeysBitwise.rotateZ;\n mat4.multiply(matrix, matrix, mat4.fromZRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n }\n }\n\n // Now apply any new keys not set in local transform data that have not been applied yet.\n if (data !== this._data)\n {\n for (let cntr = 0; cntr < constants.transformKeys.length; cntr++)\n {\n const key = constants.transformKeys[cntr];\n\n // Reject bad / no data or if the key has already been applied.\n if (data[key] === null || (seenKeys & constants.transformKeysBitwise[key]) > 0) { continue; }\n\n switch (key)\n {\n case 'rotateX':\n mat4.multiply(matrix, matrix, mat4.fromXRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n\n case 'rotateY':\n mat4.multiply(matrix, matrix, mat4.fromYRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n\n case 'rotateZ':\n mat4.multiply(matrix, matrix, mat4.fromZRotation(s_MAT4_TEMP, degToRad(data[key])));\n break;\n }\n }\n }\n\n return matrix;\n }\n\n /**\n * Tests an object if it contains transform keys and the values are finite numbers.\n *\n * @param {object} data - An object to test for transform data.\n *\n * @returns {boolean} Whether the given PositionData has transforms.\n */\n hasTransform(data)\n {\n for (const key of constants.transformKeys)\n {\n if (Number.isFinite(data[key])) { return true; }\n }\n\n return false;\n }\n\n /**\n * Resets internal data from the given object containing valid transform keys.\n *\n * @param {object} data - An object with transform data.\n */\n reset(data)\n {\n for (const key in data)\n {\n if (constants.transformKeys.includes(key))\n {\n if (Number.isFinite(data[key]))\n {\n this._data[key] = data[key];\n }\n else\n {\n const index = this.#orderList.findIndex((entry) => entry === key);\n if (index >= 0) { this.#orderList.splice(index, 1); }\n\n delete this._data[key];\n }\n }\n }\n }\n}\n\n/**\n * Returns the translations necessary to translate a matrix operation based on the `transformOrigin` parameter of the\n * given position instance. The first entry / index 0 is the pre-translation and last entry / index 1 is the post-\n * translation.\n *\n * This method is used internally, but may be useful if you need the origin translation matrices to transform\n * bespoke points based on any `transformOrigin` set in {@link PositionData}.\n *\n * @param {string} transformOrigin - The transform origin attribute from PositionData.\n *\n * @param {number} width - The PositionData width or validation data width when 'auto'.\n *\n * @param {number} height - The PositionData height or validation data height when 'auto'.\n *\n * @param {Matrix4[]} output - Output Mat4 array.\n *\n * @returns {Matrix4[]} Output Mat4 array.\n */\nfunction s_GET_ORIGIN_TRANSLATION(transformOrigin, width, height, output)\n{\n const vector = s_VEC3_TEMP;\n\n switch (transformOrigin)\n {\n case 'top left':\n vector[0] = vector[1] = 0;\n mat4.fromTranslation(output[0], vector);\n mat4.fromTranslation(output[1], vector);\n break;\n\n case 'top center':\n vector[0] = -width * 0.5;\n vector[1] = 0;\n mat4.fromTranslation(output[0], vector);\n vector[0] = width * 0.5;\n mat4.fromTranslation(output[1], vector);\n break;\n\n case 'top right':\n vector[0] = -width;\n vector[1] = 0;\n mat4.fromTranslation(output[0], vector);\n vector[0] = width;\n mat4.fromTranslation(output[1], vector);\n break;\n\n case 'center left':\n vector[0] = 0;\n vector[1] = -height * 0.5;\n mat4.fromTranslation(output[0], vector);\n vector[1] = height * 0.5;\n mat4.fromTranslation(output[1], vector);\n break;\n\n case null: // By default null / no transform is center.\n case 'center':\n vector[0] = -width * 0.5;\n vector[1] = -height * 0.5;\n mat4.fromTranslation(output[0], vector);\n vector[0] = width * 0.5;\n vector[1] = height * 0.5;\n mat4.fromTranslation(output[1], vector);\n break;\n\n case 'center right':\n vector[0] = -width;\n vector[1] = -height * 0.5;\n mat4.fromTranslation(output[0], vector);\n vector[0] = width;\n vector[1] = height * 0.5;\n mat4.fromTranslation(output[1], vector);\n break;\n\n case 'bottom left':\n vector[0] = 0;\n vector[1] = -height;\n mat4.fromTranslation(output[0], vector);\n vector[1] = height;\n mat4.fromTranslation(output[1], vector);\n break;\n\n case 'bottom center':\n vector[0] = -width * 0.5;\n vector[1] = -height;\n mat4.fromTranslation(output[0], vector);\n vector[0] = width * 0.5;\n vector[1] = height;\n mat4.fromTranslation(output[1], vector);\n break;\n\n case 'bottom right':\n vector[0] = -width;\n vector[1] = -height;\n mat4.fromTranslation(output[0], vector);\n vector[0] = width;\n vector[1] = height;\n mat4.fromTranslation(output[1], vector);\n break;\n\n // No valid transform origin parameter; set identity.\n default:\n mat4.identity(output[0]);\n mat4.identity(output[1]);\n break;\n }\n\n return output;\n}\n","import { writable } from 'svelte/store';\n\nimport { TransformData } from '../transform/TransformData.js';\nimport { PositionData } from '../PositionData.js';\n\nexport class UpdateElementData\n{\n constructor()\n {\n /**\n * Stores the private data from Position.\n *\n * @type {PositionData}\n */\n this.data = void 0;\n\n /**\n * Provides a copy of local data sent to subscribers.\n *\n * @type {PositionData}\n */\n this.dataSubscribers = new PositionData();\n\n /**\n * Stores the current dimension data used for the readable `dimension` store.\n *\n * @type {{width: number | 'auto', height: number | 'auto'}}\n */\n this.dimensionData = { width: 0, height: 0 };\n\n /**\n * @type {PositionChangeSet}\n */\n this.changeSet = void 0;\n\n /**\n * @type {PositionOptions}\n */\n this.options = void 0;\n\n /**\n * Stores if this Position / update data is queued for update.\n *\n * @type {boolean}\n */\n this.queued = false;\n\n /**\n * @type {StyleCache}\n */\n this.styleCache = void 0;\n\n /**\n * @type {Transforms}\n */\n this.transforms = void 0;\n\n /**\n * Stores the current transform data used for the readable `transform` store. It is only active when there are\n * subscribers to the store or calculateTransform options is true.\n *\n * @type {TransformData}\n */\n this.transformData = new TransformData();\n\n /**\n * @type {(function(PositionData): void)[]}\n */\n this.subscriptions = void 0;\n\n /**\n * @type {Writable<{width: (number|\"auto\"), height: (number|\"auto\")}>}\n */\n this.storeDimension = writable(this.dimensionData);\n\n // When there are subscribers set option to calculate transform updates; set to false when no subscribers.\n\n /**\n * @type {Writable<TransformData>}\n */\n this.storeTransform = writable(this.transformData, () =>\n {\n this.options.transformSubscribed = true;\n return () => this.options.transformSubscribed = false;\n });\n\n /**\n * Stores the queued state for update element processing.\n *\n * @type {boolean}\n */\n this.queued = false;\n\n // Seal data backing readable stores.\n Object.seal(this.dimensionData);\n }\n}\n","import { isWritableStore } from '@typhonjs-fvtt/runtime/svelte/store';\n\n/**\n * Svelte doesn't provide any events for the animate directive.\n *\n * The provided function below wraps a Svelte animate directive function generating bubbling events for start & end of\n * animation.\n *\n * These events are `animate:start` and `animate:end`.\n *\n * This is useful for instance if you are animating several nodes in a scrollable container where the overflow parameter\n * needs to be set to `none` while animating such that the scrollbar is not activated by the animation.\n *\n * Optionally you may also provide a boolean writable store that will be set to true when animation is active. In some\n * cases this leads to an easier implementation for gating on animation state.\n *\n * @example <caption>With events</caption>\n * const flipWithEvents = animateEvents(flip);\n * </script>\n *\n * <main on:animate:start={() => console.log('animate:start')\n * on:animate:end={() => console.log('animate:end')}>\n * {#each someData as entry (entry.id)}\n * <section animate:flipWithEvents />\n * {/each}\n\n * @example <caption>With optional store</caption>\n * const isAnimating = writable(false);\n * const flipWithEvents = animateEvents(flip, isAnimating);\n * </script>\n *\n * <main class:no-scroll={$isAnimating}>\n * {#each someData as entry (entry.id)}\n * <section animate:flipWithEvents />\n * {/each}\n *\n * @param {(node: Element, { from: DOMRect, to: DOMRect }, params?: *) => import('svelte/animate').AnimationConfig} fn -\n * A Svelte animation function.\n *\n * @param {import('svelte/store').Writable<boolean>} [store] - An optional boolean writable store that is set to true\n * when animation is active.\n *\n * @returns {(node: Element, { from: DOMRect, to: DOMRect }, params?: *) => import('svelte/animate').AnimationConfig}\n * Wrapped animation function.\n */\nfunction animateEvents(fn, store = void 0)\n{\n if (typeof fn !== 'function') { throw new TypeError(`'fn' is not a function.`); }\n if (store !== void 0 && !isWritableStore(store)) { throw new TypeError(`'store' is not a writable store.`); }\n\n // Track a single start / end sequence across all animations.\n let startFired = false;\n let endFired = false;\n\n return (node, animations, params = {}) =>\n {\n const animationConfig = fn(node, animations, params);\n\n // Store any existing tick function.\n const existingTick = animationConfig.tick;\n\n // Use tick callback to fire events only once when t / time is 0 and 1.\n animationConfig.tick = (t, u) =>\n {\n // If there is any tick function then invoke it.\n if (existingTick) { existingTick(t, u); }\n\n if (!startFired && t === 0)\n {\n if (store) { store.set(true); }\n node.dispatchEvent(new CustomEvent('animate:start', { bubbles: true }));\n startFired = true;\n endFired = false;\n }\n\n if (!endFired && t === 1)\n {\n if (store) { store.set(false); }\n node.dispatchEvent(new CustomEvent('animate:end', { bubbles: true }));\n endFired = true;\n startFired = false;\n }\n };\n\n return animationConfig;\n };\n}\n\n/**\n * Awaits `requestAnimationFrame` calls by the counter specified. This allows asynchronous applications for direct /\n * inline style modification amongst other direct animation techniques.\n *\n * @param {number} [cntr=1] - A positive integer greater than 0 for amount of requestAnimationFrames to wait.\n *\n * @returns {Promise<number>} Returns current time equivalent to `performance.now()`.\n */\nasync function nextAnimationFrame(cntr = 1)\n{\n if (!Number.isInteger(cntr) || cntr < 1)\n {\n throw new TypeError(`nextAnimationFrame error: 'cntr' must be a positive integer greater than 0.`);\n }\n\n let currentTime = performance.now();\n for (;--cntr >= 0;)\n {\n currentTime = await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n return currentTime;\n}\n\nexport { animateEvents, nextAnimationFrame };\n//# sourceMappingURL=index.js.map\n","import { nextAnimationFrame } from '@typhonjs-fvtt/runtime/svelte/animate';\n\n/**\n * Decouples updates to any parent target HTMLElement inline styles. Invoke {@link Position.elementUpdated} to await\n * on the returned promise that is resolved with the current render time via `nextAnimationFrame` /\n * `requestAnimationFrame`. This allows the underlying data model to be updated immediately while updates to the\n * element are in sync with the browser and potentially in the future be further throttled.\n *\n * @param {HTMLElement} el - The target HTMLElement.\n */\nexport class UpdateElementManager\n{\n static list = [];\n static listCntr = 0;\n\n static updatePromise;\n\n static get promise() { return this.updatePromise; }\n\n /**\n * Potentially adds the given element and internal updateData instance to the list.\n *\n * @param {HTMLElement} el - An HTMLElement instance.\n *\n * @param {UpdateElementData} updateData - An UpdateElementData instance.\n *\n * @returns {Promise<number>} The unified next frame update promise. Returns `currentTime`.\n */\n static add(el, updateData)\n {\n if (this.listCntr < this.list.length)\n {\n const entry = this.list[this.listCntr];\n entry[0] = el;\n entry[1] = updateData;\n }\n else\n {\n this.list.push([el, updateData]);\n }\n\n this.listCntr++;\n updateData.queued = true;\n\n if (!this.updatePromise) { this.updatePromise = this.wait(); }\n\n return this.updatePromise;\n }\n\n /**\n * Await on `nextAnimationFrame` and iterate over list map invoking callback functions.\n *\n * @returns {Promise<number>} The next frame Promise / currentTime from nextAnimationFrame.\n */\n static async wait()\n {\n // Await the next animation frame. In the future this can be extended to multiple frames to divide update rate.\n const currentTime = await nextAnimationFrame();\n\n this.updatePromise = void 0;\n\n for (let cntr = this.listCntr; --cntr >= 0;)\n {\n // Obtain data for entry.\n const entry = this.list[cntr];\n const el = entry[0];\n const updateData = entry[1];\n\n // Clear entry data.\n entry[0] = void 0;\n entry[1] = void 0;\n\n // Reset queued state.\n updateData.queued = false;\n\n // Early out if the element is no longer connected to the DOM / shadow root.\n // if (!el.isConnected || !updateData.changeSet.hasChange()) { continue; }\n if (!el.isConnected) { continue; }\n\n if (updateData.options.ortho)\n {\n s_UPDATE_ELEMENT_ORTHO(el, updateData);\n }\n else\n {\n s_UPDATE_ELEMENT(el, updateData);\n }\n\n // If calculate transform options is enabled then update the transform data and set the readable store.\n if (updateData.options.calculateTransform || updateData.options.transformSubscribed)\n {\n s_UPDATE_TRANSFORM(el, updateData);\n }\n\n // Update all subscribers with changed data.\n this.updateSubscribers(updateData);\n }\n\n this.listCntr = 0;\n\n return currentTime;\n }\n\n /**\n * Potentially immediately updates the given element.\n *\n * @param {HTMLElement} el - An HTMLElement instance.\n *\n * @param {UpdateElementData} updateData - An UpdateElementData instance.\n */\n static immediate(el, updateData)\n {\n // Early out if the element is no longer connected to the DOM / shadow root.\n // if (!el.isConnected || !updateData.changeSet.hasChange()) { continue; }\n if (!el.isConnected) { return; }\n\n if (updateData.options.ortho)\n {\n s_UPDATE_ELEMENT_ORTHO(el, updateData);\n }\n else\n {\n s_UPDATE_ELEMENT(el, updateData);\n }\n\n // If calculate transform options is enabled then update the transform data and set the readable store.\n if (updateData.options.calculateTransform || updateData.options.transformSubscribed)\n {\n s_UPDATE_TRANSFORM(el, updateData);\n }\n\n // Update all subscribers with changed data.\n this.updateSubscribers(updateData);\n }\n\n /**\n * @param {UpdateElementData} updateData - Data change set.\n */\n static updateSubscribers(updateData)\n {\n const data = updateData.data;\n const changeSet = updateData.changeSet;\n\n if (!changeSet.hasChange()) { return; }\n\n // Make a copy of the data.\n const output = updateData.dataSubscribers.copy(data);\n\n const subscriptions = updateData.subscriptions;\n\n // Early out if there are no subscribers.\n if (subscriptions.length > 0)\n {\n for (let cntr = 0; cntr < subscriptions.length; cntr++) { subscriptions[cntr](output); }\n }\n\n // Update dimension data if width / height has changed.\n if (changeSet.width || changeSet.height)\n {\n updateData.dimensionData.width = data.width;\n updateData.dimensionData.height = data.height;\n updateData.storeDimension.set(updateData.dimensionData);\n }\n\n changeSet.set(false);\n }\n}\n\n/**\n * Decouples updates to any parent target HTMLElement inline styles. Invoke {@link Position.elementUpdated} to await\n * on the returned promise that is resolved with the current render time via `nextAnimationFrame` /\n * `requestAnimationFrame`. This allows the underlying data model to be updated immediately while updates to the\n * element are in sync with the browser and potentially in the future be further throttled.\n *\n * @param {HTMLElement} el - The target HTMLElement.\n *\n * @param {UpdateElementData} updateData - Update data.\n */\nfunction s_UPDATE_ELEMENT(el, updateData)\n{\n const changeSet = updateData.changeSet;\n const data = updateData.data;\n\n if (changeSet.left)\n {\n el.style.left = `${data.left}px`;\n }\n\n if (changeSet.top)\n {\n el.style.top = `${data.top}px`;\n }\n\n if (changeSet.zIndex)\n {\n el.style.zIndex = typeof data.zIndex === 'number' ? `${data.zIndex}` : null;\n }\n\n if (changeSet.width)\n {\n el.style.width = typeof data.width === 'number' ? `${data.width}px` : data.width;\n }\n\n if (changeSet.height)\n {\n el.style.height = typeof data.height === 'number' ? `${data.height}px` : data.height;\n }\n\n if (changeSet.transformOrigin)\n {\n // When set to 'center' we can simply set the transform to null which is center by default.\n el.style.transformOrigin = data.transformOrigin === 'center' ? null : data.transformOrigin;\n }\n\n // Update all transforms in order added to transforms object.\n if (changeSet.transform)\n {\n el.style.transform = updateData.transforms.isActive ? updateData.transforms.getCSS() : null;\n }\n}\n\n/**\n * Decouples updates to any parent target HTMLElement inline styles. Invoke {@link Position.elementUpdated} to await\n * on the returned promise that is resolved with the current render time via `nextAnimationFrame` /\n * `requestAnimationFrame`. This allows the underlying data model to be updated immediately while updates to the\n * element are in sync with the browser and potentially in the future be further throttled.\n *\n * @param {HTMLElement} el - The target HTMLElement.\n *\n * @param {UpdateElementData} updateData - Update data.\n */\nfunction s_UPDATE_ELEMENT_ORTHO(el, updateData)\n{\n const changeSet = updateData.changeSet;\n const data = updateData.data;\n\n if (changeSet.zIndex)\n {\n el.style.zIndex = typeof data.zIndex === 'number' ? `${data.zIndex}` : null;\n }\n\n if (changeSet.width)\n {\n el.style.width = typeof data.width === 'number' ? `${data.width}px` : data.width;\n }\n\n if (changeSet.height)\n {\n el.style.height = typeof data.height === 'number' ? `${data.height}px` : data.height;\n }\n\n if (changeSet.transformOrigin)\n {\n // When set to 'center' we can simply set the transform to null which is center by default.\n el.style.transformOrigin = data.transformOrigin === 'center' ? null : data.transformOrigin;\n }\n\n // Update all transforms in order added to transforms object.\n if (changeSet.left || changeSet.top || changeSet.transform)\n {\n el.style.transform = updateData.transforms.getCSSOrtho(data);\n }\n}\n\n/**\n * Updates the applied transform data and sets the readble `transform` store.\n *\n * @param {HTMLElement} el - The target HTMLElement.\n *\n * @param {UpdateElementData} updateData - Update element data.\n */\nfunction s_UPDATE_TRANSFORM(el, updateData)\n{\n s_VALIDATION_DATA.height = updateData.data.height !== 'auto' ? updateData.data.height :\n updateData.styleCache.offsetHeight;\n\n s_VALIDATION_DATA.width = updateData.data.width !== 'auto' ? updateData.data.width :\n updateData.styleCache.offsetWidth;\n\n s_VALIDATION_DATA.marginLeft = updateData.styleCache.marginLeft;\n\n s_VALIDATION_DATA.marginTop = updateData.styleCache.marginTop;\n\n // Get transform data. First set constraints including any margin top / left as offsets and width / height. Used\n // when position width / height is 'auto'.\n updateData.transforms.getData(updateData.data, updateData.transformData, s_VALIDATION_DATA);\n\n updateData.storeTransform.set(updateData.transformData);\n}\n\nconst s_VALIDATION_DATA = {\n height: void 0,\n width: void 0,\n marginLeft: void 0,\n marginTop: void 0\n};\n","import {\n propertyStore,\n subscribeIgnoreFirst } from '@typhonjs-fvtt/runtime/svelte/store';\n\nimport {\n isIterable,\n isObject,\n isPlainObject } from '@typhonjs-fvtt/runtime/svelte/util';\n\nimport { AnimationAPI } from './animation/AnimationAPI.js';\nimport { AnimationGroupAPI } from './animation/AnimationGroupAPI.js';\nimport * as constants from './constants.js';\nimport { convertRelative } from './convertRelative.js';\nimport * as positionInitial from './initial/index.js';\nimport { PositionChangeSet } from './PositionChangeSet.js';\nimport { PositionData } from './PositionData.js';\nimport { PositionStateAPI } from './PositionStateAPI.js';\nimport { StyleCache } from './StyleCache.js';\nimport { TransformData } from './transform/TransformData.js';\nimport { AdapterValidators } from './validators/AdapterValidators.js';\nimport * as positionValidators from './validators/index.js';\nimport { Transforms } from './transform/Transforms.js';\nimport { UpdateElementData } from './update/UpdateElementData.js';\nimport { UpdateElementManager } from './update/UpdateElementManager.js';\n\n/**\n * Provides a store for position following the subscriber protocol in addition to providing individual writable derived\n * stores for each independent variable.\n */\nexport class Position\n{\n /**\n * @type {PositionData}\n */\n #data = new PositionData();\n\n /**\n * Provides the animation API.\n *\n * @type {AnimationAPI}\n */\n #animate = new AnimationAPI(this, this.#data);\n\n /**\n * Provides a way to turn on / off the position handling.\n *\n * @type {boolean}\n */\n #enabled = true;\n\n /**\n * Stores the style attributes that changed on update.\n *\n * @type {PositionChangeSet}\n */\n #positionChangeSet = new PositionChangeSet();\n\n /**\n * Stores ongoing options that are set in the constructor or by transform store subscription.\n *\n * @type {PositionOptions}\n */\n #options = {\n calculateTransform: false,\n initialHelper: void 0,\n ortho: true,\n transformSubscribed: false\n };\n\n /**\n * The associated parent for positional data tracking. Used in validators.\n *\n * @type {PositionParent}\n */\n #parent;\n\n /**\n * @type {StorePosition}\n */\n #stores;\n\n /**\n * Stores an instance of the computer styles for the target element.\n *\n * @type {StyleCache}\n */\n #styleCache;\n\n /**\n * Stores the subscribers.\n *\n * @type {(function(PositionData): void)[]}\n */\n #subscriptions = [];\n\n /**\n * @type {Transforms}\n */\n #transforms = new Transforms();\n\n /**\n * @type {UpdateElementData}\n */\n #updateElementData;\n\n /**\n * Stores the UpdateElementManager wait promise.\n *\n * @type {Promise}\n */\n #updateElementPromise;\n\n /**\n * @type {AdapterValidators}\n */\n #validators;\n\n /**\n * @type {ValidatorData[]}\n */\n #validatorData;\n\n /**\n * @type {PositionStateAPI}\n */\n #state = new PositionStateAPI(this, this.#data, this.#transforms);\n\n /**\n * @returns {AnimationGroupAPI} Public Animation API.\n */\n static get Animate() { return AnimationGroupAPI; }\n\n /**\n * @returns {{browserCentered?: Centered, Centered?: *}} Initial position helpers.\n */\n static get Initial() { return positionInitial; }\n\n /**\n * Returns TransformData class / constructor.\n *\n * @returns {TransformData} TransformData class / constructor.\n */\n static get TransformData() { return TransformData; }\n\n /**\n * Returns default validators.\n *\n * Note: `basicWindow` and `BasicBounds` will eventually be removed.\n *\n * @returns {{basicWindow?: BasicBounds, transformWindow?: TransformBounds, TransformBounds?: *, BasicBounds?: *}}\n * Available validators.\n */\n static get Validators() { return positionValidators; }\n\n /**\n * Returns a duplicate of a given position instance copying any options and validators.\n *\n * // TODO: Consider more safety over options processing.\n *\n * @param {Position} position - A position instance.\n *\n * @param {PositionOptions} options - Position options.\n *\n * @returns {Position} A duplicate position instance.\n */\n static duplicate(position, options)\n {\n if (!(position instanceof Position)) { throw new TypeError(`'position' is not an instance of Position.`); }\n\n const newPosition = new Position(options);\n\n newPosition.#options = Object.assign({}, position.#options, options);\n newPosition.#validators.add(...position.#validators);\n\n newPosition.set(position.#data);\n\n return newPosition;\n }\n\n /**\n * @param {PositionParent|PositionOptionsAll} [parent] - A potential parent element or object w/ `elementTarget`\n * getter. May also be the PositionOptions object w/ 1 argument.\n *\n * @param {PositionOptionsAll} [options] - Default values.\n */\n constructor(parent, options)\n {\n // Test if `parent` is a plain object; if so treat as options object.\n if (isPlainObject(parent))\n {\n options = parent;\n }\n else\n {\n this.#parent = parent;\n }\n\n const data = this.#data;\n const transforms = this.#transforms;\n\n this.#styleCache = new StyleCache();\n\n const updateData = new UpdateElementData();\n\n updateData.changeSet = this.#positionChangeSet;\n updateData.data = this.#data;\n updateData.options = this.#options;\n updateData.styleCache = this.#styleCache;\n updateData.subscriptions = this.#subscriptions;\n updateData.transforms = this.#transforms;\n\n this.#updateElementData = updateData;\n\n if (isObject(options))\n {\n // Set Position options\n if (typeof options.calculateTransform === 'boolean')\n {\n this.#options.calculateTransform = options.calculateTransform;\n }\n\n if (typeof options.ortho === 'boolean')\n {\n this.#options.ortho = options.ortho;\n }\n\n // Set default values from options.\n\n if (Number.isFinite(options.height) || options.height === 'auto' || options.height === 'inherit' ||\n options.height === null)\n {\n data.height = updateData.dimensionData.height = typeof options.height === 'number' ?\n Math.round(options.height) : options.height;\n }\n\n if (Number.isFinite(options.left) || options.left === null)\n {\n data.left = typeof options.left === 'number' ? Math.round(options.left) : options.left;\n }\n\n if (Number.isFinite(options.maxHeight) || options.maxHeight === null)\n {\n data.maxHeight = typeof options.maxHeight === 'number' ? Math.round(options.maxHeight) : options.maxHeight;\n }\n\n if (Number.isFinite(options.maxWidth) || options.maxWidth === null)\n {\n data.maxWidth = typeof options.maxWidth === 'number' ? Math.round(options.maxWidth) : options.maxWidth;\n }\n\n if (Number.isFinite(options.minHeight) || options.minHeight === null)\n {\n data.minHeight = typeof options.minHeight === 'number' ? Math.round(options.minHeight) : options.minHeight;\n }\n\n if (Number.isFinite(options.minWidth) || options.minWidth === null)\n {\n data.minWidth = typeof options.minWidth === 'number' ? Math.round(options.minWidth) : options.minWidth;\n }\n\n if (Number.isFinite(options.rotateX) || options.rotateX === null)\n {\n transforms.rotateX = data.rotateX = options.rotateX;\n }\n\n if (Number.isFinite(options.rotateY) || options.rotateY === null)\n {\n transforms.rotateY = data.rotateY = options.rotateY;\n }\n\n if (Number.isFinite(options.rotateZ) || options.rotateZ === null)\n {\n transforms.rotateZ = data.rotateZ = options.rotateZ;\n }\n\n if (Number.isFinite(options.scale) || options.scale === null)\n {\n transforms.scale = data.scale = options.scale;\n }\n\n if (Number.isFinite(options.top) || options.top === null)\n {\n data.top = typeof options.top === 'number' ? Math.round(options.top) : options.top;\n }\n\n if (typeof options.transformOrigin === 'string' || options.transformOrigin === null)\n {\n data.transformOrigin = constants.transformOrigins.includes(options.transformOrigin) ?\n options.transformOrigin : null;\n }\n\n if (Number.isFinite(options.translateX) || options.translateX === null)\n {\n transforms.translateX = data.translateX = options.translateX;\n }\n\n if (Number.isFinite(options.translateY) || options.translateY === null)\n {\n transforms.translateY = data.translateY = options.translateY;\n }\n\n if (Number.isFinite(options.translateZ) || options.translateZ === null)\n {\n transforms.translateZ = data.translateZ = options.translateZ;\n }\n\n if (Number.isFinite(options.width) || options.width === 'auto' || options.width === 'inherit' ||\n options.width === null)\n {\n data.width = updateData.dimensionData.width = typeof options.width === 'number' ?\n Math.round(options.width) : options.width;\n }\n\n if (Number.isFinite(options.zIndex) || options.zIndex === null)\n {\n data.zIndex = typeof options.zIndex === 'number' ? Math.round(options.zIndex) : options.zIndex;\n }\n }\n\n this.#stores = {\n // The main properties for manipulating Position.\n height: propertyStore(this, 'height'),\n left: propertyStore(this, 'left'),\n rotateX: propertyStore(this, 'rotateX'),\n rotateY: propertyStore(this, 'rotateY'),\n rotateZ: propertyStore(this, 'rotateZ'),\n scale: propertyStore(this, 'scale'),\n top: propertyStore(this, 'top'),\n transformOrigin: propertyStore(this, 'transformOrigin'),\n translateX: propertyStore(this, 'translateX'),\n translateY: propertyStore(this, 'translateY'),\n translateZ: propertyStore(this, 'translateZ'),\n width: propertyStore(this, 'width'),\n zIndex: propertyStore(this, 'zIndex'),\n\n // Stores that control validation when width / height is not `auto`.\n maxHeight: propertyStore(this, 'maxHeight'),\n maxWidth: propertyStore(this, 'maxWidth'),\n minHeight: propertyStore(this, 'minHeight'),\n minWidth: propertyStore(this, 'minWidth'),\n\n // Readable stores based on updates or from resize observer changes.\n dimension: { subscribe: updateData.storeDimension.subscribe },\n element: { subscribe: this.#styleCache.stores.element.subscribe },\n resizeContentHeight: { subscribe: this.#styleCache.stores.resizeContentHeight.subscribe },\n resizeContentWidth: { subscribe: this.#styleCache.stores.resizeContentWidth.subscribe },\n resizeOffsetHeight: { subscribe: this.#styleCache.stores.resizeOffsetHeight.subscribe },\n resizeOffsetWidth: { subscribe: this.#styleCache.stores.resizeOffsetWidth.subscribe },\n transform: { subscribe: updateData.storeTransform.subscribe },\n\n // Protected store that should only be set by resizeObserver action.\n resizeObserved: this.#styleCache.stores.resizeObserved,\n };\n\n // When resize change from any applied resizeObserver action automatically set data for new validation run.\n // A resizeObserver prop should be set to true for ApplicationShell components or usage of resizeObserver action\n // to monitor for changes. This should only be used on elements that have 'auto' for width or height.\n subscribeIgnoreFirst(this.#stores.resizeObserved, (resizeData) =>\n {\n const parent = this.#parent;\n const el = parent instanceof HTMLElement ? parent : parent?.elementTarget;\n\n // Only invoke set if there is a target element and the resize data has a valid offset width & height.\n if (el instanceof HTMLElement && Number.isFinite(resizeData?.offsetWidth) &&\n Number.isFinite(resizeData?.offsetHeight))\n {\n this.set(data);\n }\n });\n\n this.#stores.transformOrigin.values = constants.transformOrigins;\n\n [this.#validators, this.#validatorData] = new AdapterValidators();\n\n if (options?.initial || options?.positionInitial)\n {\n const initialHelper = options.initial ?? options.positionInitial;\n\n if (typeof initialHelper?.getLeft !== 'function' || typeof initialHelper?.getTop !== 'function')\n {\n throw new Error(\n `'options.initial' position helper does not contain 'getLeft' and / or 'getTop' functions.`);\n }\n\n this.#options.initialHelper = options.initial;\n }\n\n if (options?.validator)\n {\n if (isIterable(options?.validator)) { this.validators.add(...options.validator); }\n else { this.validators.add(options.validator); }\n }\n }\n\n /**\n * Returns the animation API.\n *\n * @returns {AnimationAPI} Animation API.\n */\n get animate()\n {\n return this.#animate;\n }\n\n /**\n * Returns the dimension data for the readable store.\n *\n * @returns {{width: number | 'auto', height: number | 'auto'}} Dimension data.\n */\n get dimension()\n {\n return this.#updateElementData.dimensionData;\n }\n\n /**\n * Returns the enabled state.\n *\n * @returns {boolean} Enabled state.\n */\n get enabled()\n {\n return this.#enabled;\n }\n\n /**\n * Returns the current HTMLElement being positioned.\n *\n * @returns {HTMLElement|undefined} Current HTMLElement being positioned.\n */\n get element()\n {\n return this.#styleCache.el;\n }\n\n /**\n * Returns a promise that is resolved on the next element update with the time of the update.\n *\n * @returns {Promise<number>} Promise resolved on element update.\n */\n get elementUpdated()\n {\n return this.#updateElementPromise;\n }\n\n /**\n * Returns the associated {@link PositionParent} instance.\n *\n * @returns {PositionParent} The PositionParent instance.\n */\n get parent() { return this.#parent; }\n\n /**\n * Returns the state API.\n *\n * @returns {PositionStateAPI} Position state API.\n */\n get state() { return this.#state; }\n\n /**\n * Returns the derived writable stores for individual data variables.\n *\n * @returns {StorePosition} Derived / writable stores.\n */\n get stores() { return this.#stores; }\n\n /**\n * Returns the transform data for the readable store.\n *\n * @returns {TransformData} Transform Data.\n */\n get transform()\n {\n return this.#updateElementData.transformData;\n }\n\n /**\n * Returns the validators.\n *\n * @returns {AdapterValidators} validators.\n */\n get validators() { return this.#validators; }\n\n /**\n * Sets the enabled state.\n *\n * @param {boolean} enabled - New enabled state.\n */\n set enabled(enabled)\n {\n if (typeof enabled !== 'boolean')\n {\n throw new TypeError(`'enabled' is not a boolean.`);\n }\n\n this.#enabled = enabled;\n }\n\n /**\n * Sets the associated {@link PositionParent} instance. Resets the style cache and default data.\n *\n * @param {PositionParent|void} parent - A PositionParent instance.\n */\n set parent(parent)\n {\n if (parent !== void 0 && !(parent instanceof HTMLElement) && !isObject(parent))\n {\n throw new TypeError(`'parent' is not an HTMLElement, object, or undefined.`);\n }\n\n this.#parent = parent;\n\n // Reset any stored default data & the style cache.\n this.#state.remove({ name: '#defaultData' });\n this.#styleCache.reset();\n\n // If a parent is defined then invoke set to update any parent element.\n if (parent) { this.set(this.#data); }\n }\n\n// Data accessors ----------------------------------------------------------------------------------------------------\n\n /**\n * @returns {number|'auto'|'inherit'|null} height\n */\n get height() { return this.#data.height; }\n\n /**\n * @returns {number|null} left\n */\n get left() { return this.#data.left; }\n\n /**\n * @returns {number|null} maxHeight\n */\n get maxHeight() { return this.#data.maxHeight; }\n\n /**\n * @returns {number|null} maxWidth\n */\n get maxWidth() { return this.#data.maxWidth; }\n\n /**\n * @returns {number|null} minHeight\n */\n get minHeight() { return this.#data.minHeight; }\n\n /**\n * @returns {number|null} minWidth\n */\n get minWidth() { return this.#data.minWidth; }\n\n /**\n * @returns {number|null} rotateX\n */\n get rotateX() { return this.#data.rotateX; }\n\n /**\n * @returns {number|null} rotateY\n */\n get rotateY() { return this.#data.rotateY; }\n\n /**\n * @returns {number|null} rotateZ\n */\n get rotateZ() { return this.#data.rotateZ; }\n\n /**\n * @returns {number|null} alias for rotateZ\n */\n get rotation() { return this.#data.rotateZ; }\n\n /**\n * @returns {number|null} scale\n */\n get scale() { return this.#data.scale; }\n\n /**\n * @returns {number|null} top\n */\n get top() { return this.#data.top; }\n\n /**\n * @returns {string} transformOrigin\n */\n get transformOrigin() { return this.#data.transformOrigin; }\n\n /**\n * @returns {number|null} translateX\n */\n get translateX() { return this.#data.translateX; }\n\n /**\n * @returns {number|null} translateY\n */\n get translateY() { return this.#data.translateY; }\n\n /**\n * @returns {number|null} translateZ\n */\n get translateZ() { return this.#data.translateZ; }\n\n /**\n * @returns {number|'auto'|'inherit'|null} width\n */\n get width() { return this.#data.width; }\n\n /**\n * @returns {number|null} z-index\n */\n get zIndex() { return this.#data.zIndex; }\n\n /**\n * @param {number|string|null} height -\n */\n set height(height)\n {\n this.#stores.height.set(height);\n }\n\n /**\n * @param {number|string|null} left -\n */\n set left(left)\n {\n this.#stores.left.set(left);\n }\n\n /**\n * @param {number|string|null} maxHeight -\n */\n set maxHeight(maxHeight)\n {\n this.#stores.maxHeight.set(maxHeight);\n }\n\n /**\n * @param {number|string|null} maxWidth -\n */\n set maxWidth(maxWidth)\n {\n this.#stores.maxWidth.set(maxWidth);\n }\n\n /**\n * @param {number|string|null} minHeight -\n */\n set minHeight(minHeight)\n {\n this.#stores.minHeight.set(minHeight);\n }\n\n /**\n * @param {number|string|null} minWidth -\n */\n set minWidth(minWidth)\n {\n this.#stores.minWidth.set(minWidth);\n }\n\n /**\n * @param {number|string|null} rotateX -\n */\n set rotateX(rotateX)\n {\n this.#stores.rotateX.set(rotateX);\n }\n\n /**\n * @param {number|string|null} rotateY -\n */\n set rotateY(rotateY)\n {\n this.#stores.rotateY.set(rotateY);\n }\n\n /**\n * @param {number|string|null} rotateZ -\n */\n set rotateZ(rotateZ)\n {\n this.#stores.rotateZ.set(rotateZ);\n }\n\n /**\n * @param {number|string|null} rotateZ - alias for rotateZ\n */\n set rotation(rotateZ)\n {\n this.#stores.rotateZ.set(rotateZ);\n }\n\n /**\n * @param {number|string|null} scale -\n */\n set scale(scale)\n {\n this.#stores.scale.set(scale);\n }\n\n /**\n * @param {number|string|null} top -\n */\n set top(top)\n {\n this.#stores.top.set(top);\n }\n\n /**\n * @param {string} transformOrigin -\n */\n set transformOrigin(transformOrigin)\n {\n if (constants.transformOrigins.includes(transformOrigin)) { this.#stores.transformOrigin.set(transformOrigin); }\n }\n\n /**\n * @param {number|string|null} translateX -\n */\n set translateX(translateX)\n {\n this.#stores.translateX.set(translateX);\n }\n\n /**\n * @param {number|string|null} translateY -\n */\n set translateY(translateY)\n {\n this.#stores.translateY.set(translateY);\n }\n\n /**\n * @param {number|string|null} translateZ -\n */\n set translateZ(translateZ)\n {\n this.#stores.translateZ.set(translateZ);\n }\n\n /**\n * @param {number|string|null} width -\n */\n set width(width)\n {\n this.#stores.width.set(width);\n }\n\n /**\n * @param {number|string|null} zIndex -\n */\n set zIndex(zIndex)\n {\n this.#stores.zIndex.set(zIndex);\n }\n\n /**\n * Assigns current position to object passed into method.\n *\n * @param {object|PositionData} [position] - Target to assign current position data.\n *\n * @param {PositionGetOptions} [options] - Defines options for specific keys and substituting null for numeric\n * default values.\n *\n * @returns {PositionData} Passed in object with current position data.\n */\n get(position = {}, options)\n {\n const keys = options?.keys;\n const excludeKeys = options?.exclude;\n const numeric = options?.numeric ?? false;\n\n if (isIterable(keys))\n {\n // Replace any null values potentially with numeric default values.\n if (numeric)\n {\n for (const key of keys) { position[key] = this[key] ?? constants.numericDefaults[key]; }\n }\n else // Accept current values.\n {\n for (const key of keys) { position[key] = this[key]; }\n }\n\n // Remove any excluded keys.\n if (isIterable(excludeKeys))\n {\n for (const key of excludeKeys) { delete position[key]; }\n }\n\n return position;\n }\n else\n {\n const data = Object.assign(position, this.#data);\n\n // Remove any excluded keys.\n if (isIterable(excludeKeys))\n {\n for (const key of excludeKeys) { delete data[key]; }\n }\n\n // Potentially set numeric defaults.\n if (numeric) { constants.setNumericDefaults(data); }\n\n return data;\n }\n }\n\n /**\n * @returns {PositionData} Current position data.\n */\n toJSON()\n {\n return Object.assign({}, this.#data);\n }\n\n /**\n * All calculation and updates of position are implemented in {@link Position}. This allows position to be fully\n * reactive and in control of updating inline styles for the application.\n *\n * Note: the logic for updating position is improved and changes a few aspects from the default\n * {@link Application.setPosition}. The gate on `popOut` is removed, so to ensure no positional application occurs\n * popOut applications can set `this.options.positionable` to false ensuring no positional inline styles are\n * applied.\n *\n * The initial set call on an application with a target element will always set width / height as this is\n * necessary for correct calculations.\n *\n * When a target element is present updated styles are applied after validation. To modify the behavior of set\n * implement one or more validator functions and add them from the application via\n * `this.position.validators.add(<Function>)`.\n *\n * Updates to any target element are decoupled from the underlying Position data. This method returns this instance\n * that you can then await on the target element inline style update by using {@link Position.elementUpdated}.\n *\n * @param {PositionDataExtended} [position] - Position data to set.\n *\n * @returns {Position} This Position instance.\n */\n set(position = {})\n {\n if (typeof position !== 'object') { throw new TypeError(`Position - set error: 'position' is not an object.`); }\n\n const parent = this.#parent;\n\n // An early out to prevent `set` from taking effect if not enabled.\n if (!this.#enabled)\n {\n return this;\n }\n\n // An early out to prevent `set` from taking effect if options `positionable` is false.\n if (parent !== void 0 && typeof parent?.options?.positionable === 'boolean' && !parent?.options?.positionable)\n {\n return this;\n }\n\n // Callers can specify to immediately update an associated element. This is useful if set is called from\n // requestAnimationFrame / rAF. Library integrations like GSAP invoke set from rAF.\n const immediateElementUpdate = position.immediateElementUpdate === true;\n\n const data = this.#data;\n const transforms = this.#transforms;\n\n // Find the target HTML element and verify that it is connected storing it in `el`.\n const targetEl = parent instanceof HTMLElement ? parent : parent?.elementTarget;\n const el = targetEl instanceof HTMLElement && targetEl.isConnected ? targetEl : void 0;\n\n const changeSet = this.#positionChangeSet;\n const styleCache = this.#styleCache;\n\n if (el)\n {\n // Cache the computed styles of the element.\n if (!styleCache.hasData(el))\n {\n styleCache.update(el);\n\n // Add will-change property if not already set in inline or computed styles.\n if (!styleCache.hasWillChange)\n {\n // TODO: This is commented out as there is a Chrome bug that reduces quality / blurs\n // child elements when `will-change: transform` is set.\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1343711#c4\n\n // el.style.willChange = this.#options.ortho ? 'transform' : 'top, left, transform';\n }\n\n // Update all properties / clear queued state.\n changeSet.set(true);\n this.#updateElementData.queued = false;\n }\n\n // Converts any relative string position data to numeric inputs.\n convertRelative(position, this);\n\n position = this.#updatePosition(position, parent, el, styleCache);\n\n // Check if a validator cancelled the update.\n if (position === null) { return this; }\n }\n\n if (Number.isFinite(position.left))\n {\n position.left = Math.round(position.left);\n\n if (data.left !== position.left) { data.left = position.left; changeSet.left = true; }\n }\n\n if (Number.isFinite(position.top))\n {\n position.top = Math.round(position.top);\n\n if (data.top !== position.top) { data.top = position.top; changeSet.top = true; }\n }\n\n if (Number.isFinite(position.maxHeight) || position.maxHeight === null)\n {\n position.maxHeight = typeof position.maxHeight === 'number' ? Math.round(position.maxHeight) : null;\n\n if (data.maxHeight !== position.maxHeight) { data.maxHeight = position.maxHeight; changeSet.maxHeight = true; }\n }\n\n if (Number.isFinite(position.maxWidth) || position.maxWidth === null)\n {\n position.maxWidth = typeof position.maxWidth === 'number' ? Math.round(position.maxWidth) : null;\n\n if (data.maxWidth !== position.maxWidth) { data.maxWidth = position.maxWidth; changeSet.maxWidth = true; }\n }\n\n if (Number.isFinite(position.minHeight) || position.minHeight === null)\n {\n position.minHeight = typeof position.minHeight === 'number' ? Math.round(position.minHeight) : null;\n\n if (data.minHeight !== position.minHeight) { data.minHeight = position.minHeight; changeSet.minHeight = true; }\n }\n\n if (Number.isFinite(position.minWidth) || position.minWidth === null)\n {\n position.minWidth = typeof position.minWidth === 'number' ? Math.round(position.minWidth) : null;\n\n if (data.minWidth !== position.minWidth) { data.minWidth = position.minWidth; changeSet.minWidth = true; }\n }\n\n if (Number.isFinite(position.rotateX) || position.rotateX === null)\n {\n if (data.rotateX !== position.rotateX)\n {\n data.rotateX = transforms.rotateX = position.rotateX;\n changeSet.transform = true;\n }\n }\n\n if (Number.isFinite(position.rotateY) || position.rotateY === null)\n {\n if (data.rotateY !== position.rotateY)\n {\n data.rotateY = transforms.rotateY = position.rotateY;\n changeSet.transform = true;\n }\n }\n\n if (Number.isFinite(position.rotateZ) || position.rotateZ === null)\n {\n if (data.rotateZ !== position.rotateZ)\n {\n data.rotateZ = transforms.rotateZ = position.rotateZ;\n changeSet.transform = true;\n }\n }\n\n if (Number.isFinite(position.scale) || position.scale === null)\n {\n position.scale = typeof position.scale === 'number' ? Math.max(0, Math.min(position.scale, 1000)) : null;\n\n if (data.scale !== position.scale)\n {\n data.scale = transforms.scale = position.scale;\n changeSet.transform = true;\n }\n }\n\n if ((typeof position.transformOrigin === 'string' && constants.transformOrigins.includes(\n position.transformOrigin)) || position.transformOrigin === null)\n {\n if (data.transformOrigin !== position.transformOrigin)\n {\n data.transformOrigin = position.transformOrigin;\n changeSet.transformOrigin = true;\n }\n }\n\n if (Number.isFinite(position.translateX) || position.translateX === null)\n {\n if (data.translateX !== position.translateX)\n {\n data.translateX = transforms.translateX = position.translateX;\n changeSet.transform = true;\n }\n }\n\n if (Number.isFinite(position.translateY) || position.translateY === null)\n {\n if (data.translateY !== position.translateY)\n {\n data.translateY = transforms.translateY = position.translateY;\n changeSet.transform = true;\n }\n }\n\n if (Number.isFinite(position.translateZ) || position.translateZ === null)\n {\n if (data.translateZ !== position.translateZ)\n {\n data.translateZ = transforms.translateZ = position.translateZ;\n changeSet.transform = true;\n }\n }\n\n if (Number.isFinite(position.zIndex))\n {\n position.zIndex = Math.round(position.zIndex);\n\n if (data.zIndex !== position.zIndex) { data.zIndex = position.zIndex; changeSet.zIndex = true; }\n }\n\n if (Number.isFinite(position.width) || position.width === 'auto' || position.width === 'inherit' ||\n position.width === null)\n {\n position.width = typeof position.width === 'number' ? Math.round(position.width) : position.width;\n\n if (data.width !== position.width) { data.width = position.width; changeSet.width = true; }\n }\n\n if (Number.isFinite(position.height) || position.height === 'auto' || position.height === 'inherit' ||\n position.height === null)\n {\n position.height = typeof position.height === 'number' ? Math.round(position.height) : position.height;\n\n if (data.height !== position.height) { data.height = position.height; changeSet.height = true; }\n }\n\n if (el)\n {\n const defaultData = this.#state.getDefault();\n\n // Set default data after first set operation that has a target element.\n if (typeof defaultData !== 'object')\n {\n this.#state.save({ name: '#defaultData', ...Object.assign({}, data) });\n }\n\n // If `immediateElementUpdate` is true in position data passed to `set` then update the element immediately.\n // This is for rAF based library integrations like GSAP.\n if (immediateElementUpdate)\n {\n UpdateElementManager.immediate(el, this.#updateElementData);\n this.#updateElementPromise = Promise.resolve(performance.now());\n }\n // Else if not queued then queue an update for the next rAF callback.\n else if (!this.#updateElementData.queued)\n {\n this.#updateElementPromise = UpdateElementManager.add(el, this.#updateElementData);\n }\n }\n else\n {\n // Notify main store subscribers.\n UpdateElementManager.updateSubscribers(this.#updateElementData);\n }\n\n return this;\n }\n\n /**\n *\n * @param {function(PositionData): void} handler - Callback function that is invoked on update / changes. Receives\n * a copy of the PositionData.\n *\n * @returns {(function(): void)} Unsubscribe function.\n */\n subscribe(handler)\n {\n this.#subscriptions.push(handler); // add handler to the array of subscribers\n\n handler(Object.assign({}, this.#data)); // call handler with current value\n\n // Return unsubscribe function.\n return () =>\n {\n const index = this.#subscriptions.findIndex((sub) => sub === handler);\n if (index >= 0) { this.#subscriptions.splice(index, 1); }\n };\n }\n\n /**\n * @param {PositionDataExtended} opts -\n *\n * @param {number|null} opts.left -\n *\n * @param {number|null} opts.top -\n *\n * @param {number|null} opts.maxHeight -\n *\n * @param {number|null} opts.maxWidth -\n *\n * @param {number|null} opts.minHeight -\n *\n * @param {number|null} opts.minWidth -\n *\n * @param {number|'auto'|null} opts.width -\n *\n * @param {number|'auto'|null} opts.height -\n *\n * @param {number|null} opts.rotateX -\n *\n * @param {number|null} opts.rotateY -\n *\n * @param {number|null} opts.rotateZ -\n *\n * @param {number|null} opts.scale -\n *\n * @param {string} opts.transformOrigin -\n *\n * @param {number|null} opts.translateX -\n *\n * @param {number|null} opts.translateY -\n *\n * @param {number|null} opts.translateZ -\n *\n * @param {number|null} opts.zIndex -\n *\n * @param {number|null} opts.rotation - alias for rotateZ\n *\n * @param {*} opts.rest -\n *\n * @param {object} parent -\n *\n * @param {HTMLElement} el -\n *\n * @param {StyleCache} styleCache -\n *\n * @returns {null|PositionData} Updated position data or null if validation fails.\n */\n #updatePosition({\n // Directly supported parameters\n left, top, maxWidth, maxHeight, minWidth, minHeight, width, height, rotateX, rotateY, rotateZ, scale,\n transformOrigin, translateX, translateY, translateZ, zIndex,\n\n // Aliased parameters\n rotation,\n\n ...rest\n } = {}, parent, el, styleCache)\n {\n let currentPosition = s_DATA_UPDATE.copy(this.#data);\n\n // Update width if an explicit value is passed, or if no width value is set on the element.\n if (el.style.width === '' || width !== void 0)\n {\n if (width === 'auto' || (currentPosition.width === 'auto' && width !== null))\n {\n currentPosition.width = 'auto';\n width = styleCache.offsetWidth;\n }\n else if (width === 'inherit' || (currentPosition.width === 'inherit' && width !== null))\n {\n currentPosition.width = 'inherit';\n width = styleCache.offsetWidth;\n }\n else\n {\n const newWidth = Number.isFinite(width) ? width : currentPosition.width;\n currentPosition.width = width = Number.isFinite(newWidth) ? Math.round(newWidth) : styleCache.offsetWidth;\n }\n }\n else\n {\n width = Number.isFinite(currentPosition.width) ? currentPosition.width : styleCache.offsetWidth;\n }\n\n // Update height if an explicit value is passed, or if no height value is set on the element.\n if (el.style.height === '' || height !== void 0)\n {\n if (height === 'auto' || (currentPosition.height === 'auto' && height !== null))\n {\n currentPosition.height = 'auto';\n height = styleCache.offsetHeight;\n }\n else if (height === 'inherit' || (currentPosition.height === 'inherit' && height !== null))\n {\n currentPosition.height = 'inherit';\n height = styleCache.offsetHeight;\n }\n else\n {\n const newHeight = Number.isFinite(height) ? height : currentPosition.height;\n currentPosition.height = height = Number.isFinite(newHeight) ? Math.round(newHeight) :\n styleCache.offsetHeight;\n }\n }\n else\n {\n height = Number.isFinite(currentPosition.height) ? currentPosition.height : styleCache.offsetHeight;\n }\n\n // Update left\n if (Number.isFinite(left))\n {\n currentPosition.left = left;\n }\n else if (!Number.isFinite(currentPosition.left))\n {\n // Potentially use any initial position helper if available or set to 0.\n currentPosition.left = typeof this.#options.initialHelper?.getLeft === 'function' ?\n this.#options.initialHelper.getLeft(width) : 0;\n }\n\n // Update top\n if (Number.isFinite(top))\n {\n currentPosition.top = top;\n }\n else if (!Number.isFinite(currentPosition.top))\n {\n // Potentially use any initial position helper if available or set to 0.\n currentPosition.top = typeof this.#options.initialHelper?.getTop === 'function' ?\n this.#options.initialHelper.getTop(height) : 0;\n }\n\n if (Number.isFinite(maxHeight) || maxHeight === null)\n {\n currentPosition.maxHeight = Number.isFinite(maxHeight) ? Math.round(maxHeight) : null;\n }\n\n if (Number.isFinite(maxWidth) || maxWidth === null)\n {\n currentPosition.maxWidth = Number.isFinite(maxWidth) ? Math.round(maxWidth) : null;\n }\n\n if (Number.isFinite(minHeight) || minHeight === null)\n {\n currentPosition.minHeight = Number.isFinite(minHeight) ? Math.round(minHeight) : null;\n }\n\n if (Number.isFinite(minWidth) || minWidth === null)\n {\n currentPosition.minWidth = Number.isFinite(minWidth) ? Math.round(minWidth) : null;\n }\n\n // Update rotate X/Y/Z, scale, z-index\n if (Number.isFinite(rotateX) || rotateX === null) { currentPosition.rotateX = rotateX; }\n if (Number.isFinite(rotateY) || rotateY === null) { currentPosition.rotateY = rotateY; }\n\n // Handle alias for rotateZ. First check if `rotateZ` is valid and different from the current value. Next check if\n // `rotation` is valid and use it for `rotateZ`.\n if (rotateZ !== currentPosition.rotateZ && (Number.isFinite(rotateZ) || rotateZ === null))\n {\n currentPosition.rotateZ = rotateZ;\n }\n else if (rotation !== currentPosition.rotateZ && (Number.isFinite(rotation) || rotation === null))\n {\n currentPosition.rotateZ = rotation;\n }\n\n if (Number.isFinite(translateX) || translateX === null) { currentPosition.translateX = translateX; }\n if (Number.isFinite(translateY) || translateY === null) { currentPosition.translateY = translateY; }\n if (Number.isFinite(translateZ) || translateZ === null) { currentPosition.translateZ = translateZ; }\n\n if (Number.isFinite(scale) || scale === null)\n {\n currentPosition.scale = typeof scale === 'number' ? Math.max(0, Math.min(scale, 1000)) : null;\n }\n\n if (typeof transformOrigin === 'string' || transformOrigin === null)\n {\n currentPosition.transformOrigin = constants.transformOrigins.includes(transformOrigin) ? transformOrigin :\n null;\n }\n\n if (Number.isFinite(zIndex) || zIndex === null)\n {\n currentPosition.zIndex = typeof zIndex === 'number' ? Math.round(zIndex) : zIndex;\n }\n\n const validatorData = this.#validatorData;\n\n // If there are any validators allow them to potentially modify position data or reject the update.\n if (this.#validators.enabled && validatorData.length)\n {\n s_VALIDATION_DATA.parent = parent;\n\n s_VALIDATION_DATA.el = el;\n\n s_VALIDATION_DATA.computed = styleCache.computed;\n\n s_VALIDATION_DATA.transforms = this.#transforms;\n\n s_VALIDATION_DATA.height = height;\n\n s_VALIDATION_DATA.width = width;\n\n s_VALIDATION_DATA.marginLeft = styleCache.marginLeft;\n\n s_VALIDATION_DATA.marginTop = styleCache.marginTop;\n\n s_VALIDATION_DATA.maxHeight = styleCache.maxHeight ?? currentPosition.maxHeight;\n\n s_VALIDATION_DATA.maxWidth = styleCache.maxWidth ?? currentPosition.maxWidth;\n\n // Given a parent w/ reactive state and is minimized ignore styleCache min-width/height.\n const isMinimized = parent?.reactive?.minimized ?? false;\n\n // Note the use of || for accessing the style cache as the left hand is ignored w/ falsy values such as '0'.\n s_VALIDATION_DATA.minHeight = isMinimized ? currentPosition.minHeight ?? 0 :\n styleCache.minHeight || (currentPosition.minHeight ?? 0);\n\n s_VALIDATION_DATA.minWidth = isMinimized ? currentPosition.minWidth ?? 0 :\n styleCache.minWidth || (currentPosition.minWidth ?? 0);\n\n for (let cntr = 0; cntr < validatorData.length; cntr++)\n {\n s_VALIDATION_DATA.position = currentPosition;\n s_VALIDATION_DATA.rest = rest;\n currentPosition = validatorData[cntr].validator(s_VALIDATION_DATA);\n\n if (currentPosition === null) { return null; }\n }\n }\n\n // Return the updated position object.\n return currentPosition;\n }\n}\n\nconst s_DATA_UPDATE = new PositionData();\n\n/**\n * @type {ValidationData}\n */\nconst s_VALIDATION_DATA = {\n position: void 0,\n parent: void 0,\n el: void 0,\n computed: void 0,\n transforms: void 0,\n height: void 0,\n width: void 0,\n marginLeft: void 0,\n marginTop: void 0,\n maxHeight: void 0,\n maxWidth: void 0,\n minHeight: void 0,\n minWidth: void 0,\n rest: void 0\n};\n\nObject.seal(s_VALIDATION_DATA);\n\n/**\n * @typedef {object} PositionInitialHelper\n *\n * @property {(width: number) => number} getLeft - Returns the left position given the width of the browser window.\n *\n * @property {(height: number) => number} getTop - Returns the top position given the height of the browser window.\n */\n\n/**\n * @typedef {object} PositionDataExtended\n *\n * @property {number|string|null} [height] -\n *\n * @property {number|string|null} [left] -\n *\n * @property {number|string|null} [maxHeight] -\n *\n * @property {number|string|null} [maxWidth] -\n *\n * @property {number|string|null} [minHeight] -\n *\n * @property {number|string|null} [minWidth] -\n *\n * @property {number|string|null} [rotateX] -\n *\n * @property {number|string|null} [rotateY] -\n *\n * @property {number|string|null} [rotateZ] -\n *\n * @property {number|string|null} [scale] -\n *\n * @property {number|string|null} [top] -\n *\n * @property {string|null} [transformOrigin] -\n *\n * @property {number|string|null} [translateX] -\n *\n * @property {number|string|null} [translateY] -\n *\n * @property {number|string|null} [translateZ] -\n *\n * @property {number|string|null} [width] -\n *\n * @property {number|string|null} [zIndex] -\n *\n * Extended properties -----------------------------------------------------------------------------------------------\n *\n * @property {boolean} [immediateElementUpdate] - When true any associated element is updated immediately.\n *\n * @property {number|null} [rotation] - Alias for `rotateZ`.\n */\n\n/**\n * @typedef {object} PositionGetOptions\n *\n * @property {Iterable<string>} keys - When provided only these keys are copied.\n *\n * @property {Iterable<string>} exclude - When provided these keys are excluded.\n *\n * @property {boolean} numeric - When true any `null` values are converted into defaults.\n */\n\n/**\n * @typedef {object} PositionOptions - Options set in constructor.\n *\n * @property {boolean} calculateTransform - When true always calculate transform data.\n *\n * @property {PositionInitialHelper} initialHelper - Provides a helper for setting initial position data.\n *\n * @property {boolean} ortho - Sets Position to orthographic mode using just transform / matrix3d for positioning.\n *\n * @property {boolean} transformSubscribed - Set to true when there are subscribers to the readable transform store.\n */\n\n/**\n * @typedef {PositionOptions & PositionData} PositionOptionsAll\n */\n\n/**\n * @typedef {HTMLElement | object} PositionParent\n *\n * @property {Function} [elementTarget] - Potentially returns any parent object.\n */\n\n/**\n * @typedef {object} ResizeObserverData\n *\n * @property {number|undefined} contentHeight -\n *\n * @property {number|undefined} contentWidth -\n *\n * @property {number|undefined} offsetHeight -\n *\n * @property {number|undefined} offsetWidth -\n */\n\n/**\n * @typedef {object} StorePosition - Provides individual writable stores for {@link Position}.\n *\n * @property {import('svelte/store').Readable<{width: number, height: number}>} dimension - Readable store for dimension\n * data.\n *\n * @property {import('svelte/store').Readable<HTMLElement>} element - Readable store for current element.\n *\n * @property {import('svelte/store').Writable<number|null>} left - Derived store for `left` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} top - Derived store for `top` updates.\n *\n * @property {import('svelte/store').Writable<number|'auto'|null>} width - Derived store for `width` updates.\n *\n * @property {import('svelte/store').Writable<number|'auto'|null>} height - Derived store for `height` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} maxHeight - Derived store for `maxHeight` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} maxWidth - Derived store for `maxWidth` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} minHeight - Derived store for `minHeight` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} minWidth - Derived store for `minWidth` updates.\n *\n * @property {import('svelte/store').Readable<number|undefined>} resizeContentHeight - Readable store for `contentHeight`.\n *\n * @property {import('svelte/store').Readable<number|undefined>} resizeContentWidth - Readable store for `contentWidth`.\n *\n * @property {import('svelte/store').Writable<ResizeObserverData>} resizeObserved - Protected store for resize observer updates.\n *\n * @property {import('svelte/store').Readable<number|undefined>} resizeOffsetHeight - Readable store for `offsetHeight`.\n *\n * @property {import('svelte/store').Readable<number|undefined>} resizeOffsetWidth - Readable store for `offsetWidth`.\n *\n * @property {import('svelte/store').Writable<number|null>} rotate - Derived store for `rotate` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} rotateX - Derived store for `rotateX` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} rotateY - Derived store for `rotateY` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} rotateZ - Derived store for `rotateZ` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} scale - Derived store for `scale` updates.\n *\n * @property {import('svelte/store').Readable<TransformData>} transform - Readable store for transform data.\n *\n * @property {import('svelte/store').Writable<string>} transformOrigin - Derived store for `transformOrigin`.\n *\n * @property {import('svelte/store').Writable<number|null>} translateX - Derived store for `translateX` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} translateY - Derived store for `translateY` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} translateZ - Derived store for `translateZ` updates.\n *\n * @property {import('svelte/store').Writable<number|null>} zIndex - Derived store for `zIndex` updates.\n */\n\n/**\n * @typedef {object} ValidationData\n *\n * @property {PositionData} position -\n *\n * @property {PositionParent} parent -\n *\n * @property {HTMLElement} el -\n *\n * @property {CSSStyleDeclaration} computed -\n *\n * @property {Transforms} transforms -\n *\n * @property {number} height -\n *\n * @property {number} width -\n *\n * @property {number|undefined} marginLeft -\n *\n * @property {number|undefined} marginTop -\n *\n * @property {number|undefined} maxHeight -\n *\n * @property {number|undefined} maxWidth -\n *\n * @property {number|undefined} minHeight -\n *\n * @property {number|undefined} minWidth -\n *\n * @property {object} rest - The rest of any data submitted to {@link Position.set}\n */\n","import { linear } from 'svelte/easing';\n\nimport { lerp } from '@typhonjs-fvtt/runtime/svelte/math';\nimport { isObject } from '@typhonjs-fvtt/runtime/svelte/util';\n\n/**\n * Provides the ability the save / restore application state for positional and UI state such as minimized status.\n *\n * You can restore a saved state with animation; please see the options of {@link ApplicationState.restore}.\n */\nexport class ApplicationState\n{\n /** @type {ApplicationShellExt} */\n #application;\n\n /** @type {Map<string, ApplicationStateData>} */\n #dataSaved = new Map();\n\n /**\n * @param {ApplicationShellExt} application - The application.\n */\n constructor(application)\n {\n this.#application = application;\n\n Object.seal(this);\n }\n\n /**\n * Returns current application state along with any extra data passed into method.\n *\n * @param {object} [extra] - Extra data to add to application state.\n *\n * @returns {ApplicationStateData} Passed in object with current application state.\n */\n get(extra = {})\n {\n return Object.assign(extra, {\n position: this.#application?.position?.get(),\n beforeMinimized: this.#application?.position?.state.get({ name: '#beforeMinimized' }),\n options: Object.assign({}, this.#application?.options),\n ui: { minimized: this.#application?.reactive?.minimized }\n });\n }\n\n /**\n * Returns any stored save state by name.\n *\n * @param {string} name - Saved data set name.\n *\n * @returns {ApplicationStateData} The saved data set.\n */\n getSave({ name })\n {\n if (typeof name !== 'string')\n {\n throw new TypeError(`ApplicationState - getSave error: 'name' is not a string.`);\n }\n\n return this.#dataSaved.get(name);\n }\n\n /**\n * Removes and returns any application state by name.\n *\n * @param {object} options - Options.\n *\n * @param {string} options.name - Name to remove and retrieve.\n *\n * @returns {ApplicationStateData} Saved application data.\n */\n remove({ name })\n {\n if (typeof name !== 'string') { throw new TypeError(`ApplicationState - remove: 'name' is not a string.`); }\n\n const data = this.#dataSaved.get(name);\n this.#dataSaved.delete(name);\n\n return data;\n }\n\n /**\n * Restores a saved application state returning the data. Several optional parameters are available\n * to control whether the restore action occurs silently (no store / inline styles updates), animates\n * to the stored data, or simply sets the stored data. Restoring via {@link AnimationAPI.to} allows\n * specification of the duration, easing, and interpolate functions along with configuring a Promise to be\n * returned if awaiting the end of the animation.\n *\n * @param {object} params - Parameters\n *\n * @param {string} params.name - Saved data set name.\n *\n * @param {boolean} [params.remove=false] - Remove data set.\n *\n * @param {boolean} [params.async=false] - If animating return a Promise that resolves with any saved data.\n *\n * @param {boolean} [params.animateTo=false] - Animate to restore data.\n *\n * @param {number} [params.duration=0.1] - Duration in seconds.\n *\n * @param {Function} [params.ease=linear] - Easing function.\n *\n * @param {Function} [params.interpolate=lerp] - Interpolation function.\n *\n * @returns {ApplicationStateData|Promise<ApplicationStateData>} Saved application data.\n */\n restore({ name, remove = false, async = false, animateTo = false, duration = 0.1, ease = linear,\n interpolate = lerp })\n {\n if (typeof name !== 'string')\n {\n throw new TypeError(`ApplicationState - restore error: 'name' is not a string.`);\n }\n\n const dataSaved = this.#dataSaved.get(name);\n\n if (dataSaved)\n {\n if (remove) { this.#dataSaved.delete(name); }\n\n if (async)\n {\n return this.set(dataSaved, { async, animateTo, duration, ease, interpolate }).then(() => dataSaved);\n }\n else\n {\n this.set(dataSaved, { async, animateTo, duration, ease, interpolate });\n }\n }\n\n return dataSaved;\n }\n\n /**\n * Saves current application state with the opportunity to add extra data to the saved state.\n *\n * @param {object} options - Options.\n *\n * @param {string} options.name - name to index this saved data.\n *\n * @param {...*} [options.extra] - Extra data to add to saved data.\n *\n * @returns {ApplicationStateData} Current application data\n */\n save({ name, ...extra })\n {\n if (typeof name !== 'string') { throw new TypeError(`ApplicationState - save error: 'name' is not a string.`); }\n\n const data = this.get(extra);\n\n this.#dataSaved.set(name, data);\n\n return data;\n }\n\n /**\n * Restores a saved application state returning the data. Several optional parameters are available\n * to control whether the restore action occurs silently (no store / inline styles updates), animates\n * to the stored data, or simply sets the stored data. Restoring via {@link AnimationAPI.to} allows\n * specification of the duration, easing, and interpolate functions along with configuring a Promise to be\n * returned if awaiting the end of the animation.\n *\n * Note: If serializing application state any minimized apps will use the before minimized state on initial render\n * of the app as it is currently not possible to render apps with Foundry VTT core API in the minimized state.\n *\n * TODO: THIS METHOD NEEDS TO BE REFACTORED WHEN TRL IS MADE INTO A STANDALONE FRAMEWORK.\n *\n * @param {ApplicationStateData} data - Saved data set name.\n *\n * @param {object} [opts] - Optional parameters\n *\n * @param {boolean} [opts.async=false] - If animating return a Promise that resolves with any saved data.\n *\n * @param {boolean} [opts.animateTo=false] - Animate to restore data.\n *\n * @param {number} [opts.duration=0.1] - Duration in seconds.\n *\n * @param {Function} [opts.ease=linear] - Easing function.\n *\n * @param {Function} [opts.interpolate=lerp] - Interpolation function.\n *\n * @returns {ApplicationShellExt|Promise<ApplicationShellExt>} When synchronous the application or Promise when\n * animating resolving with application.\n */\n set(data, { async = false, animateTo = false, duration = 0.1, ease = linear, interpolate = lerp } = {})\n {\n if (!isObject(data))\n {\n throw new TypeError(`ApplicationState - restore error: 'data' is not an object.`);\n }\n\n const application = this.#application;\n\n if (!isObject(data?.position))\n {\n console.warn(`ApplicationState.set warning: 'data.position' is not an object.`);\n return application;\n }\n\n // TODO: TAKE NOTE THAT WE ARE ACCESSING A FOUNDRY APP v1 GETTER HERE TO DETERMINE IF APPLICATION IS RENDERED.\n // TODO: THIS NEEDS TO BE REFACTORED WHEN CONVERTING TRL TO A GENERIC FRAMEWORK.\n const rendered = application.rendered;\n\n if (animateTo && !rendered)\n {\n console.warn(`ApplicationState.set warning: Application is not rendered and 'animateTo' is true.`);\n return application;\n }\n\n // Update data directly with no store or inline style updates.\n if (animateTo) // Animate to saved data.\n {\n // Provide special handling to potentially change transform origin as this parameter is not animated.\n if (data.position.transformOrigin !== application.position.transformOrigin)\n {\n application.position.transformOrigin = data.position.transformOrigin;\n }\n\n if (isObject(data?.ui))\n {\n const minimized = typeof data.ui?.minimized === 'boolean' ? data.ui.minimized : false;\n\n if (application?.reactive?.minimized && !minimized)\n {\n application.maximize({ animate: false, duration: 0 });\n }\n }\n\n const promise = application.position.animate.to(data.position,\n { duration, ease, interpolate }).finished.then((cancelled) =>\n {\n if (cancelled) { return application; }\n\n // Merge in saved options to application.\n if (isObject(data?.options))\n {\n application?.reactive.mergeOptions(data.options);\n }\n\n if (isObject(data?.ui))\n {\n const minimized = typeof data.ui?.minimized === 'boolean' ? data.ui.minimized : false;\n\n // Application is currently minimized and stored state is not, so reset minimized state without\n // animation.\n if (!application?.reactive?.minimized && minimized)\n {\n application.minimize({ animate: false, duration: 0 });\n }\n }\n\n if (isObject(data?.beforeMinimized))\n {\n application.position.state.set({ name: '#beforeMinimized', ...data.beforeMinimized });\n }\n\n return application;\n });\n\n // Return a Promise with the application that resolves after animation ends.\n if (async) { return promise; }\n }\n else\n {\n if (rendered)\n {\n // Merge in saved options to application.\n if (isObject(data?.options))\n {\n application?.reactive.mergeOptions(data.options);\n }\n\n if (isObject(data?.ui))\n {\n const minimized = typeof data.ui?.minimized === 'boolean' ? data.ui.minimized : false;\n\n // Application is currently minimized and stored state is not, so reset minimized state without\n // animation.\n if (application?.reactive?.minimized && !minimized)\n {\n application.maximize({ animate: false, duration: 0 });\n }\n else if (!application?.reactive?.minimized && minimized)\n {\n application.minimize({ animate: false, duration });\n }\n }\n\n if (isObject(data?.beforeMinimized))\n {\n application.position.state.set({ name: '#beforeMinimized', ...data.beforeMinimized });\n }\n\n // Default options is to set data for an immediate update.\n application.position.set(data.position);\n }\n else\n {\n // When not rendered set position to the 'beforeMinimized' data if it exists otherwise set w/ 'position'.\n // Currently, w/ Foundry core Application API it is impossible to initially render an app in the minimized\n // state.\n\n let positionData = data.position;\n\n if (isObject(data.beforeMinimized))\n {\n // Take before minimized data.\n positionData = data.beforeMinimized;\n\n // Apply position left / top to before minimized data. This covers the case when an app is minimized,\n // but then moved. This allows restoration of the before minimized parameters w/ the last position\n // location.\n positionData.left = data.position.left;\n positionData.top = data.position.top;\n }\n\n application.position.set(positionData);\n }\n }\n\n return application;\n }\n}\n\n/**\n * @typedef {object} ApplicationStateData\n *\n * @property {PositionDataExtended} position - Application position.\n *\n * @property {object} beforeMinimized - Any application saved position state for #beforeMinimized\n *\n * @property {object} options - Application options.\n *\n * @property {object} ui - Application UI state.\n */\n","import { isObject } from '@typhonjs-fvtt/runtime/svelte/util';\n\n/**\n * Provides a helper class for {@link SvelteApplication} by combining all methods that work on the {@link SvelteData[]}\n * of mounted components. This class is instantiated and can be retrieved by the getter `svelte` via SvelteApplication.\n */\nexport class GetSvelteData\n{\n /**\n * @type {MountedAppShell[]|null[]}\n */\n #applicationShellHolder;\n\n /**\n * @type {SvelteData[]}\n */\n #svelteData;\n\n /**\n * Keep a direct reference to the SvelteData array in an associated {@link SvelteApplication}.\n *\n * @param {MountedAppShell[]|null[]} applicationShellHolder - A reference to the MountedAppShell array.\n *\n * @param {SvelteData[]} svelteData - A reference to the SvelteData array of mounted components.\n */\n constructor(applicationShellHolder, svelteData)\n {\n this.#applicationShellHolder = applicationShellHolder;\n this.#svelteData = svelteData;\n }\n\n /**\n * Returns any mounted {@link MountedAppShell}.\n *\n * @returns {MountedAppShell|null} Any mounted application shell.\n */\n get applicationShell() { return this.#applicationShellHolder[0]; }\n\n /**\n * Returns the indexed Svelte component.\n *\n * @param {number} index -\n *\n * @returns {object} The loaded Svelte component.\n */\n component(index)\n {\n const data = this.#svelteData[index];\n return isObject(data) ? data?.component : void 0;\n }\n\n /**\n * Returns the Svelte component entries iterator.\n *\n * @returns {Generator<Array<number|SvelteComponent>>} Svelte component entries iterator.\n * @yields\n */\n *componentEntries()\n {\n for (let cntr = 0; cntr < this.#svelteData.length; cntr++)\n {\n yield [cntr, this.#svelteData[cntr].component];\n }\n }\n\n /**\n * Returns the Svelte component values iterator.\n *\n * @returns {Generator<SvelteComponent>} Svelte component values iterator.\n * @yields\n */\n *componentValues()\n {\n for (let cntr = 0; cntr < this.#svelteData.length; cntr++)\n {\n yield this.#svelteData[cntr].component;\n }\n }\n\n /**\n * Returns the indexed SvelteData entry.\n *\n * @param {number} index -\n *\n * @returns {SvelteData} The loaded Svelte config + component.\n */\n data(index)\n {\n return this.#svelteData[index];\n }\n\n /**\n * Returns the {@link SvelteData} instance for a given component.\n *\n * @param {object} component - Svelte component.\n *\n * @returns {SvelteData} - The loaded Svelte config + component.\n */\n dataByComponent(component)\n {\n for (const data of this.#svelteData)\n {\n if (data.component === component) { return data; }\n }\n\n return void 0;\n }\n\n /**\n * Returns the SvelteData entries iterator.\n *\n * @returns {IterableIterator<[number, SvelteData]>} SvelteData entries iterator.\n */\n dataEntries()\n {\n return this.#svelteData.entries();\n }\n\n /**\n * Returns the SvelteData values iterator.\n *\n * @returns {IterableIterator<SvelteData>} SvelteData values iterator.\n */\n dataValues()\n {\n return this.#svelteData.values();\n }\n\n /**\n * Returns the length of the mounted Svelte component list.\n *\n * @returns {number} Length of mounted Svelte component list.\n */\n get length()\n {\n return this.#svelteData.length;\n }\n}\n","import {\n isApplicationShell,\n isObject,\n parseSvelteConfig } from '@typhonjs-fvtt/runtime/svelte/util';\n\n/**\n * Instantiates and attaches a Svelte component to the main inserted HTML.\n *\n * @param {object} opts - Optional parameters.\n *\n * @param {object} opts.app - The target application\n *\n * @param {HTMLElement} opts.template - Any HTML template.\n *\n * @param {object} opts.config - Svelte component options\n *\n * @param {Function} opts.elementRootUpdate - A callback to assign to the external context.\n *\n * @returns {SvelteData} The config + instantiated Svelte component.\n */\nexport function loadSvelteConfig({ app, template, config, elementRootUpdate } = {})\n{\n const svelteOptions = isObject(config.options) ? config.options : {};\n\n let target;\n\n // A specific HTMLElement to append Svelte component.\n if (config.target instanceof HTMLElement)\n {\n target = config.target;\n }\n // A string target defines a selector to find in existing HTML.\n else if (template instanceof HTMLElement && typeof config.target === 'string')\n {\n target = template.querySelector(config.target);\n }\n else // No target defined, create a document fragment.\n {\n target = document.createDocumentFragment();\n }\n\n if (target === void 0)\n {\n console.log(\n `%c[TRL] loadSvelteConfig error - could not find target selector, '${config.target}', for config:\\n`,\n 'background: rgb(57,34,34)', config);\n\n throw new Error();\n }\n\n const NewSvelteComponent = config.class;\n\n const svelteConfig = parseSvelteConfig({ ...config, target }, app);\n\n const externalContext = svelteConfig.context.get('#external');\n\n // Inject the Foundry application instance and `elementRootUpdate` to the external context.\n externalContext.application = app;\n externalContext.elementRootUpdate = elementRootUpdate;\n externalContext.sessionStorage = app.reactive.sessionStorage;\n\n let eventbus;\n\n // Potentially inject any TyphonJS eventbus and track the proxy in the SvelteData instance.\n if (isObject(app._eventbus) && typeof app._eventbus.createProxy === 'function')\n {\n eventbus = app._eventbus.createProxy();\n externalContext.eventbus = eventbus;\n }\n\n // Seal external context so that it can't be extended.\n Object.seal(externalContext);\n\n // TODO: Remove deprecation warning in the future -----------------------------------------------------------------\n\n svelteConfig.context.set('external', new Proxy({}, {\n get(targetUnused, prop)\n {\n console.warn(`[TRL] Deprecation warning: Please change getContext('external') to getContext('#external').`);\n return externalContext[prop];\n }\n }));\n\n // TODO: Remove deprecation warning in the future -----------------------------------------------------------------\n\n // Create the Svelte component.\n /**\n * @type {import('svelte').SvelteComponent}\n */\n const component = new NewSvelteComponent(svelteConfig);\n\n // Set any eventbus to the config.\n svelteConfig.eventbus = eventbus;\n\n /**\n * @type {HTMLElement}\n */\n let element;\n\n // We can directly get the root element from components which follow the application store contract.\n if (isApplicationShell(component))\n {\n element = component.elementRoot;\n }\n\n // Detect if target is a synthesized DocumentFragment with a child element. Child elements will be present\n // if the Svelte component mounts and renders initial content into the document fragment.\n if (target instanceof DocumentFragment && target.firstElementChild)\n {\n if (element === void 0) { element = target.firstElementChild; }\n template.append(target);\n }\n else if (config.target instanceof HTMLElement && element === void 0)\n {\n if (config.target instanceof HTMLElement && typeof svelteOptions.selectorElement !== 'string')\n {\n console.log(\n `%c[TRL] loadSvelteConfig error - HTMLElement target with no 'selectorElement' defined.\\n` +\n `\\nNote: If configuring an application shell and directly targeting a HTMLElement did you bind an` +\n `'elementRoot' and include '<svelte:options accessors={true}/>'?\\n` +\n `\\nOffending config:\\n`, 'background: rgb(57,34,34)', config);\n\n throw new Error();\n }\n\n // The target is an HTMLElement so find the Application element from `selectorElement` option.\n element = target.querySelector(svelteOptions.selectorElement);\n\n if (element === null || element === void 0)\n {\n console.log(\n `%c[TRL] loadSvelteConfig error - HTMLElement target with 'selectorElement', '${\n svelteOptions.selectorElement}', not found for config:\\n`,\n 'background: rgb(57,34,34)', config);\n\n throw new Error();\n }\n }\n\n // If the configuration / original target is an HTML element then do not inject HTML.\n const injectHTML = !(config.target instanceof HTMLElement);\n\n return { config: svelteConfig, component, element, injectHTML };\n}\n","import { derived, writable } from \"svelte/store\";\n\nimport {\n propertyStore,\n subscribeIgnoreFirst,\n TJSSessionStorage } from '@typhonjs-fvtt/runtime/svelte/store';\n\nimport {\n deepMerge,\n safeAccess,\n safeSet } from '@typhonjs-fvtt/runtime/svelte/util';\n\n/**\n * Contains the reactive functionality / Svelte stores associated with SvelteApplication and retrievable by\n * {@link SvelteApplication.reactive}.\n *\n * There are several reactive getters for UI state such and for two-way bindings / stores see\n * {@link SvelteReactive.storeUIState}:\n * - {@link SvelteReactive.dragging}\n * - {@link SvelteReactive.minimized}\n * - {@link SvelteReactive.resizing}\n *\n * There are also reactive getters / setters for {@link SvelteApplicationOptions} and Foundry\n * {@link ApplicationOptions}. You can use the following as one way bindings and update the associated stores. For\n * two-way bindings / stores see {@link SvelteReactive.storeAppOptions}.\n *\n * - {@link SvelteReactive.draggable}\n * - {@link SvelteReactive.focusAuto}\n * - {@link SvelteReactive.focusKeep}\n * - {@link SvelteReactive.focusTrap}\n * - {@link SvelteReactive.headerButtonNoClose}\n * - {@link SvelteReactive.headerButtonNoLabel}\n * - {@link SvelteReactive.headerIcon}\n * - {@link SvelteReactive.headerNoTitleMinimized}\n * - {@link SvelteReactive.minimizable}\n * - {@link SvelteReactive.popOut}\n * - {@link SvelteReactive.positionable}\n * - {@link SvelteReactive.resizable}\n * - {@link SvelteReactive.title}\n *\n * An instance of TJSSessionStorage is accessible via {@link SvelteReactive.sessionStorage}. Optionally you can pass\n * in an existing instance that can be shared across multiple SvelteApplications by setting\n * {@link SvelteApplicationOptions.sessionStorage}.\n *\n * -------------------------------------------------------------------------------------------------------------------\n *\n * This API is not sealed, and it is recommended that you extend it with accessors to get / set data that is reactive\n * in your application. An example of setting an exported prop `document` from the main mounted application shell.\n *\n * @example\n * import { hasSetter } from '@typhonjs-fvtt/runtime/svelte/util';\n *\n * // Note: make a normal comment.\n * // * @member {object} document - Adds accessors to SvelteReactive to get / set the document associated with\n * // * Document with the mounted application shell Svelte component.\n * // *\n * // * @memberof SvelteReactive#\n * // *\n * Object.defineProperty(this.reactive, 'document', {\n * get: () => this.svelte?.applicationShell?.document,\n * set: (document) =>\n * {\n * const component = this.svelte?.applicationShell;\n * if (hasSetter(component, 'document')) { component.document = document; }\n * }\n * });\n */\nexport class SvelteReactive\n{\n /**\n * @type {SvelteApplication}\n */\n #application;\n\n /**\n * @type {boolean}\n */\n #initialized = false;\n\n /** @type {TJSSessionStorage} */\n #sessionStorage;\n\n /**\n * The Application option store which is injected into mounted Svelte component context under the `external` key.\n *\n * @type {StoreAppOptions}\n */\n #storeAppOptions;\n\n /**\n * Stores the update function for `#storeAppOptions`.\n *\n * @type {import('svelte/store').Writable.update}\n */\n #storeAppOptionsUpdate;\n\n /**\n * Stores the UI state data to make it accessible via getters.\n *\n * @type {object}\n */\n #dataUIState;\n\n /**\n * The UI option store which is injected into mounted Svelte component context under the `external` key.\n *\n * @type {StoreUIOptions}\n */\n #storeUIState;\n\n /**\n * Stores the update function for `#storeUIState`.\n *\n * @type {import('svelte/store').Writable.update}\n */\n #storeUIStateUpdate;\n\n /**\n * Stores the unsubscribe functions from local store subscriptions.\n *\n * @type {import('svelte/store').Unsubscriber[]}\n */\n #storeUnsubscribe = [];\n\n /**\n * @param {SvelteApplication} application - The host Foundry application.\n */\n constructor(application)\n {\n this.#application = application;\n const optionsSessionStorage = application?.options?.sessionStorage;\n\n if (optionsSessionStorage !== void 0 && !(optionsSessionStorage instanceof TJSSessionStorage))\n {\n throw new TypeError(`'options.sessionStorage' is not an instance of TJSSessionStorage.`);\n }\n\n this.#sessionStorage = optionsSessionStorage !== void 0 ? optionsSessionStorage : new TJSSessionStorage();\n }\n\n /**\n * Initializes reactive support. Package private for internal use.\n *\n * @returns {SvelteStores|void} Internal methods to interact with Svelte stores.\n * @package\n */\n initialize()\n {\n if (this.#initialized) { return; }\n\n this.#initialized = true;\n\n this.#storesInitialize();\n\n return {\n appOptionsUpdate: this.#storeAppOptionsUpdate,\n uiOptionsUpdate: this.#storeUIStateUpdate,\n subscribe: this.#storesSubscribe.bind(this),\n unsubscribe: this.#storesUnsubscribe.bind(this)\n };\n }\n\n// Store getters -----------------------------------------------------------------------------------------------------\n\n /**\n * @returns {TJSSessionStorage} Returns TJSSessionStorage instance.\n */\n get sessionStorage()\n {\n return this.#sessionStorage;\n }\n\n /**\n * Returns the store for app options.\n *\n * @returns {StoreAppOptions} App options store.\n */\n get storeAppOptions() { return this.#storeAppOptions; }\n\n /**\n * Returns the store for UI options.\n *\n * @returns {StoreUIOptions} UI options store.\n */\n get storeUIState() { return this.#storeUIState; }\n\n// Only reactive getters ---------------------------------------------------------------------------------------------\n\n /**\n * Returns the current dragging UI state.\n *\n * @returns {boolean} Dragging UI state.\n */\n get dragging() { return this.#dataUIState.dragging; }\n\n /**\n * Returns the current minimized UI state.\n *\n * @returns {boolean} Minimized UI state.\n */\n get minimized() { return this.#dataUIState.minimized; }\n\n /**\n * Returns the current resizing UI state.\n *\n * @returns {boolean} Resizing UI state.\n */\n get resizing() { return this.#dataUIState.resizing; }\n\n// Reactive getter / setters -----------------------------------------------------------------------------------------\n\n /**\n * Returns the draggable app option.\n *\n * @returns {boolean} Draggable app option.\n */\n get draggable() { return this.#application?.options?.draggable; }\n\n /**\n * Returns the focusAuto app option.\n *\n * @returns {boolean} When true auto-management of app focus is enabled.\n */\n get focusAuto() { return this.#application?.options?.focusAuto; }\n\n /**\n * Returns the focusKeep app option.\n *\n * @returns {boolean} When `focusAuto` and `focusKeep` is true; keeps internal focus.\n */\n get focusKeep() { return this.#application?.options?.focusKeep; }\n\n /**\n * Returns the focusTrap app option.\n *\n * @returns {boolean} When true focus trapping / wrapping is enabled keeping focus inside app.\n */\n get focusTrap() { return this.#application?.options?.focusTrap; }\n\n /**\n * Returns the headerButtonNoClose app option.\n *\n * @returns {boolean} Remove the close the button in header app option.\n */\n get headerButtonNoClose() { return this.#application?.options?.headerButtonNoClose; }\n\n /**\n * Returns the headerButtonNoLabel app option.\n *\n * @returns {boolean} Remove the labels from buttons in header app option.\n */\n get headerButtonNoLabel() { return this.#application?.options?.headerButtonNoLabel; }\n\n /**\n * Returns the headerIcon app option.\n *\n * @returns {string|void} URL for header app icon.\n */\n get headerIcon() { return this.#application?.options?.headerIcon; }\n\n /**\n * Returns the headerNoTitleMinimized app option.\n *\n * @returns {boolean} When true removes the header title when minimized.\n */\n get headerNoTitleMinimized() { return this.#application?.options?.headerNoTitleMinimized; }\n\n /**\n * Returns the minimizable app option.\n *\n * @returns {boolean} Minimizable app option.\n */\n get minimizable() { return this.#application?.options?.minimizable; }\n\n /**\n * Returns the Foundry popOut state; {@link Application.popOut}\n *\n * @returns {boolean} Positionable app option.\n */\n get popOut() { return this.#application.popOut; }\n\n /**\n * Returns the positionable app option; {@link SvelteApplicationOptions.positionable}\n *\n * @returns {boolean} Positionable app option.\n */\n get positionable() { return this.#application?.options?.positionable; }\n\n /**\n * Returns the resizable option.\n *\n * @returns {boolean} Resizable app option.\n */\n get resizable() { return this.#application?.options?.resizable; }\n\n /**\n * Returns the title accessor from the parent Application class; {@link Application.title}\n * TODO: Application v2; note that super.title localizes `this.options.title`; IMHO it shouldn't.\n *\n * @returns {string} Title.\n */\n get title() { return this.#application.title; }\n\n /**\n * Sets `this.options.draggable` which is reactive for application shells.\n *\n * @param {boolean} draggable - Sets the draggable option.\n */\n set draggable(draggable)\n {\n if (typeof draggable === 'boolean') { this.setOptions('draggable', draggable); }\n }\n\n /**\n * Sets `this.options.focusAuto` which is reactive for application shells.\n *\n * @param {boolean} focusAuto - Sets the focusAuto option.\n */\n set focusAuto(focusAuto)\n {\n if (typeof focusAuto === 'boolean') { this.setOptions('focusAuto', focusAuto); }\n }\n\n /**\n * Sets `this.options.focusKeep` which is reactive for application shells.\n *\n * @param {boolean} focusKeep - Sets the focusKeep option.\n */\n set focusKeep(focusKeep)\n {\n if (typeof focusKeep === 'boolean') { this.setOptions('focusKeep', focusKeep); }\n }\n\n /**\n * Sets `this.options.focusTrap` which is reactive for application shells.\n *\n * @param {boolean} focusTrap - Sets the focusTrap option.\n */\n set focusTrap(focusTrap)\n {\n if (typeof focusTrap === 'boolean') { this.setOptions('focusTrap', focusTrap); }\n }\n\n /**\n * Sets `this.options.headerButtonNoClose` which is reactive for application shells.\n *\n * @param {boolean} headerButtonNoClose - Sets the headerButtonNoClose option.\n */\n set headerButtonNoClose(headerButtonNoClose)\n {\n if (typeof headerButtonNoClose === 'boolean') { this.setOptions('headerButtonNoClose', headerButtonNoClose); }\n }\n\n /**\n * Sets `this.options.headerButtonNoLabel` which is reactive for application shells.\n *\n * @param {boolean} headerButtonNoLabel - Sets the headerButtonNoLabel option.\n */\n set headerButtonNoLabel(headerButtonNoLabel)\n {\n if (typeof headerButtonNoLabel === 'boolean') { this.setOptions('headerButtonNoLabel', headerButtonNoLabel); }\n }\n\n /**\n * Sets `this.options.headerIcon` which is reactive for application shells.\n *\n * @param {string|void} headerIcon - Sets the headerButtonNoLabel option.\n */\n set headerIcon(headerIcon)\n {\n if (headerIcon === void 0 || typeof headerIcon === 'string') { this.setOptions('headerIcon', headerIcon); }\n }\n\n /**\n * Sets `this.options.headerNoTitleMinimized` which is reactive for application shells.\n *\n * @param {boolean} headerNoTitleMinimized - Sets the headerNoTitleMinimized option.\n */\n set headerNoTitleMinimized(headerNoTitleMinimized)\n {\n if (typeof headerNoTitleMinimized === 'boolean')\n {\n this.setOptions('headerNoTitleMinimized', headerNoTitleMinimized);\n }\n }\n\n /**\n * Sets `this.options.minimizable` which is reactive for application shells that are also pop out.\n *\n * @param {boolean} minimizable - Sets the minimizable option.\n */\n set minimizable(minimizable)\n {\n if (typeof minimizable === 'boolean') { this.setOptions('minimizable', minimizable); }\n }\n\n /**\n * Sets `this.options.popOut` which is reactive for application shells. This will add / remove this application\n * from `ui.windows`.\n *\n * @param {boolean} popOut - Sets the popOut option.\n */\n set popOut(popOut)\n {\n if (typeof popOut === 'boolean') { this.setOptions('popOut', popOut); }\n }\n\n /**\n * Sets `this.options.positionable` enabling / disabling {@link SvelteApplication.position.set}.\n *\n * @param {boolean} positionable - Sets the positionable option.\n */\n set positionable(positionable)\n {\n if (typeof positionable === 'boolean') { this.setOptions('positionable', positionable); }\n }\n\n /**\n * Sets `this.options.resizable` which is reactive for application shells.\n *\n * @param {boolean} resizable - Sets the resizable option.\n */\n set resizable(resizable)\n {\n if (typeof resizable === 'boolean') { this.setOptions('resizable', resizable); }\n }\n\n /**\n * Sets `this.options.title` which is reactive for application shells.\n *\n * Note: Will set empty string if title is undefined or null.\n *\n * @param {string|undefined|null} title - Application title; will be localized, so a translation key is fine.\n */\n set title(title)\n {\n if (typeof title === 'string')\n {\n this.setOptions('title', title);\n }\n else if (title === void 0 || title === null)\n {\n this.setOptions('title', '');\n }\n }\n\n // Reactive Options API -------------------------------------------------------------------------------------------\n\n /**\n * Provides a way to safely get this applications options given an accessor string which describes the\n * entries to walk. To access deeper entries into the object format the accessor string with `.` between entries\n * to walk.\n *\n * // TODO DOCUMENT the accessor in more detail.\n *\n * @param {string} accessor - The path / key to set. You can set multiple levels.\n *\n * @param {*} [defaultValue] - A default value returned if the accessor is not found.\n *\n * @returns {*} Value at the accessor.\n */\n getOptions(accessor, defaultValue)\n {\n return safeAccess(this.#application.options, accessor, defaultValue);\n }\n\n /**\n * Provides a way to merge `options` into this applications options and update the appOptions store.\n *\n * @param {object} options - The options object to merge with `this.options`.\n */\n mergeOptions(options)\n {\n this.#storeAppOptionsUpdate((instanceOptions) => deepMerge(instanceOptions, options));\n }\n\n /**\n * Provides a way to safely set this applications options given an accessor string which describes the\n * entries to walk. To access deeper entries into the object format the accessor string with `.` between entries\n * to walk.\n *\n * Additionally if an application shell Svelte component is mounted and exports the `appOptions` property then\n * the application options is set to `appOptions` potentially updating the application shell / Svelte component.\n *\n * // TODO DOCUMENT the accessor in more detail.\n *\n * @param {string} accessor - The path / key to set. You can set multiple levels.\n *\n * @param {*} value - Value to set.\n */\n setOptions(accessor, value)\n {\n const success = safeSet(this.#application.options, accessor, value);\n\n // If `this.options` modified then update the app options store.\n if (success)\n {\n this.#storeAppOptionsUpdate(() => this.#application.options);\n }\n }\n\n /**\n * Initializes the Svelte stores and derived stores for the application options and UI state.\n *\n * While writable stores are created the update method is stored in private variables locally and derived Readable\n * stores are provided for essential options which are commonly used.\n *\n * These stores are injected into all Svelte components mounted under the `external` context: `storeAppOptions` and\n * ` storeUIState`.\n */\n #storesInitialize()\n {\n const writableAppOptions = writable(this.#application.options);\n\n // Keep the update function locally, but make the store essentially readable.\n this.#storeAppOptionsUpdate = writableAppOptions.update;\n\n /**\n * Create custom store. The main subscribe method for all app options changes is provided along with derived\n * writable stores for all reactive options.\n *\n * @type {StoreAppOptions}\n */\n const storeAppOptions = {\n subscribe: writableAppOptions.subscribe,\n\n draggable: propertyStore(writableAppOptions, 'draggable'),\n focusAuto: propertyStore(writableAppOptions, 'focusAuto'),\n focusKeep: propertyStore(writableAppOptions, 'focusKeep'),\n focusTrap: propertyStore(writableAppOptions, 'focusTrap'),\n headerButtonNoClose: propertyStore(writableAppOptions, 'headerButtonNoClose'),\n headerButtonNoLabel: propertyStore(writableAppOptions, 'headerButtonNoLabel'),\n headerIcon: propertyStore(writableAppOptions, 'headerIcon'),\n headerNoTitleMinimized: propertyStore(writableAppOptions, 'headerNoTitleMinimized'),\n minimizable: propertyStore(writableAppOptions, 'minimizable'),\n popOut: propertyStore(writableAppOptions, 'popOut'),\n positionable: propertyStore(writableAppOptions, 'positionable'),\n resizable: propertyStore(writableAppOptions, 'resizable'),\n title: propertyStore(writableAppOptions, 'title')\n };\n\n Object.freeze(storeAppOptions);\n\n this.#storeAppOptions = storeAppOptions;\n\n this.#dataUIState = {\n dragging: false,\n headerButtons: [],\n minimized: this.#application._minimized,\n resizing: false\n };\n\n // Create a store for UI state data.\n const writableUIOptions = writable(this.#dataUIState);\n\n // Keep the update function locally, but make the store essentially readable.\n this.#storeUIStateUpdate = writableUIOptions.update;\n\n /**\n * @type {StoreUIOptions}\n */\n const storeUIState = {\n subscribe: writableUIOptions.subscribe,\n\n dragging: propertyStore(writableUIOptions, 'dragging'),\n headerButtons: derived(writableUIOptions, ($options, set) => set($options.headerButtons)),\n minimized: derived(writableUIOptions, ($options, set) => set($options.minimized)),\n resizing: propertyStore(writableUIOptions, 'resizing')\n };\n\n Object.freeze(storeUIState);\n\n // Initialize the store with options set in the Application constructor.\n this.#storeUIState = storeUIState;\n }\n\n /**\n * Registers local store subscriptions for app options. `popOut` controls registering this app with `ui.windows`.\n *\n * @see SvelteApplication._injectHTML\n */\n #storesSubscribe()\n {\n // Register local subscriptions.\n\n // Handles updating header buttons to add / remove the close button.\n this.#storeUnsubscribe.push(subscribeIgnoreFirst(this.#storeAppOptions.headerButtonNoClose, (value) =>\n {\n this.updateHeaderButtons({ headerButtonNoClose: value });\n }));\n\n // Handles updating header buttons to add / remove button labels.\n this.#storeUnsubscribe.push(subscribeIgnoreFirst(this.#storeAppOptions.headerButtonNoLabel, (value) =>\n {\n this.updateHeaderButtons({ headerButtonNoLabel: value });\n }));\n\n // Handles adding / removing this application from `ui.windows` when popOut changes.\n this.#storeUnsubscribe.push(subscribeIgnoreFirst(this.#storeAppOptions.popOut, (value) =>\n {\n if (value && this.#application.rendered)\n {\n globalThis.ui.windows[this.#application.appId] = this.#application;\n }\n else\n {\n delete globalThis.ui.windows[this.#application.appId];\n }\n }));\n }\n\n /**\n * Unsubscribes from any locally monitored stores.\n *\n * @see SvelteApplication.close\n */\n #storesUnsubscribe()\n {\n this.#storeUnsubscribe.forEach((unsubscribe) => unsubscribe());\n this.#storeUnsubscribe = [];\n }\n\n /**\n * Updates the UI Options store with the current header buttons. You may dynamically add / remove header buttons\n * if using an application shell Svelte component. In either overriding `_getHeaderButtons` or responding to the\n * Hooks fired return a new button array and the uiOptions store is updated and the application shell will render\n * the new buttons.\n *\n * Optionally you can set in the SvelteApplication app options {@link SvelteApplicationOptions.headerButtonNoClose}\n * to remove the close button and {@link SvelteApplicationOptions.headerButtonNoLabel} to true and labels will be\n * removed from the header buttons.\n *\n * @param {object} opts - Optional parameters (for internal use)\n *\n * @param {boolean} opts.headerButtonNoClose - The value for `headerButtonNoClose`.\n *\n * @param {boolean} opts.headerButtonNoLabel - The value for `headerButtonNoLabel`.\n */\n updateHeaderButtons({ headerButtonNoClose = this.#application.options.headerButtonNoClose,\n headerButtonNoLabel = this.#application.options.headerButtonNoLabel } = {})\n {\n let buttons = this.#application._getHeaderButtons();\n\n // Remove close button if this.options.headerButtonNoClose is true;\n if (typeof headerButtonNoClose === 'boolean' && headerButtonNoClose)\n {\n buttons = buttons.filter((button) => button.class !== 'close');\n }\n\n // Remove labels if this.options.headerButtonNoLabel is true;\n if (typeof headerButtonNoLabel === 'boolean' && headerButtonNoLabel)\n {\n for (const button of buttons) { button.label = void 0; }\n }\n\n this.#storeUIStateUpdate((options) =>\n {\n options.headerButtons = buttons;\n return options;\n });\n }\n}\n","// import { Position } from '@typhonjs-fvtt/runtime/svelte/store';\nimport { Position } from './position/Position.js';\n\nimport {\n A11yHelper,\n deepMerge,\n hasGetter,\n isApplicationShell,\n isHMRProxy,\n isObject,\n outroAndDestroy } from '@typhonjs-fvtt/runtime/svelte/util';\n\nimport {\n ApplicationState,\n GetSvelteData,\n loadSvelteConfig,\n SvelteReactive } from './internal/index.js';\n\n/**\n * Provides a Svelte aware extension to Application to control the app lifecycle appropriately. You can declaratively\n * load one or more components from `defaultOptions`.\n */\nexport class SvelteApplication extends Application\n{\n /**\n * Stores the first mounted component which follows the application shell contract.\n *\n * @type {MountedAppShell[]|null[]} Application shell.\n */\n #applicationShellHolder = [null];\n\n /**\n * Stores and manages application state for saving / restoring / serializing.\n *\n * @type {ApplicationState}\n */\n #applicationState;\n\n /**\n * Stores the target element which may not necessarily be the main element.\n *\n * @type {HTMLElement}\n */\n #elementTarget = null;\n\n /**\n * Stores the content element which is set for application shells.\n *\n * @type {HTMLElement}\n */\n #elementContent = null;\n\n /**\n * Stores initial z-index from `_renderOuter` to set to target element / Svelte component.\n *\n * @type {number}\n */\n #initialZIndex = 95;\n\n /**\n * Stores on mount state which is checked in _render to trigger onSvelteMount callback.\n *\n * @type {boolean}\n */\n #onMount = false;\n\n /**\n * The position store.\n *\n * @type {Position}\n */\n #position;\n\n /**\n * Contains the Svelte stores and reactive accessors.\n *\n * @type {SvelteReactive}\n */\n #reactive;\n\n /**\n * Stores SvelteData entries with instantiated Svelte components.\n *\n * @type {SvelteData[]}\n */\n #svelteData = [];\n\n /**\n * Provides a helper class that combines multiple methods for interacting with the mounted components tracked in\n * {@link SvelteData}.\n *\n * @type {GetSvelteData}\n */\n #getSvelteData = new GetSvelteData(this.#applicationShellHolder, this.#svelteData);\n\n /**\n * Contains methods to interact with the Svelte stores.\n *\n * @type {SvelteStores}\n */\n #stores;\n\n /**\n * @param {SvelteApplicationOptions} options - The options for the application.\n *\n * @inheritDoc\n */\n constructor(options = {})\n {\n super(options);\n\n this.#applicationState = new ApplicationState(this);\n\n // Initialize Position with the position object set by Application.\n this.#position = new Position(this, {\n ...this.position,\n ...this.options,\n initial: this.options.positionInitial,\n ortho: this.options.positionOrtho,\n validator: this.options.positionValidator\n });\n\n // Remove old position field.\n delete this.position;\n\n /**\n * Define accessors to retrieve Position by `this.position`.\n *\n * @member {Position} position - Adds accessors to SvelteApplication to get / set the position data.\n *\n * @memberof SvelteApplication#\n */\n Object.defineProperty(this, 'position', {\n get: () => this.#position,\n set: (position) => { if (isObject(position)) { this.#position.set(position); } }\n });\n\n this.#reactive = new SvelteReactive(this);\n\n this.#stores = this.#reactive.initialize();\n }\n\n /**\n * Specifies the default options that SvelteApplication supports.\n *\n * @returns {SvelteApplicationOptions} options - Application options.\n * @see https://foundryvtt.com/api/interfaces/client.ApplicationOptions.html\n */\n static get defaultOptions()\n {\n return deepMerge(super.defaultOptions, {\n defaultCloseAnimation: true, // If false the default slide close animation is not run.\n draggable: true, // If true then application shells are draggable.\n focusAuto: true, // When true auto-management of app focus is enabled.\n focusKeep: false, // When `focusAuto` and `focusKeep` is true; keeps internal focus.\n focusSource: void 0, // Stores any A11yFocusSource data that is applied when app is closed.\n focusTrap: true, // When true focus trapping / wrapping is enabled keeping focus inside app.\n headerButtonNoClose: false, // If true then the close header button is removed.\n headerButtonNoLabel: false, // If true then header button labels are removed for application shells.\n headerIcon: void 0, // Sets a header icon given an image URL.\n headerNoTitleMinimized: false, // If true then header title is hidden when application is minimized.\n minHeight: MIN_WINDOW_HEIGHT, // Assigned to position. Number specifying minimum window height.\n minWidth: MIN_WINDOW_WIDTH, // Assigned to position. Number specifying minimum window width.\n positionable: true, // If false then `position.set` does not take effect.\n positionInitial: Position.Initial.browserCentered, // A helper for initial position placement.\n positionOrtho: true, // When true Position is optimized for orthographic use.\n positionValidator: Position.Validators.transformWindow, // A function providing the default validator.\n sessionStorage: void 0, // An instance of SessionStorage to share across SvelteApplications.\n svelte: void 0, // A Svelte configuration object.\n transformOrigin: 'top left' // By default, 'top / left' respects rotation when minimizing.\n });\n }\n\n /**\n * Returns the content element if an application shell is mounted.\n *\n * @returns {HTMLElement} Content element.\n */\n get elementContent() { return this.#elementContent; }\n\n /**\n * Returns the target element or main element if no target defined.\n *\n * @returns {HTMLElement} Target element.\n */\n get elementTarget() { return this.#elementTarget; }\n\n /**\n * Returns the reactive accessors & Svelte stores for SvelteApplication.\n *\n * @returns {SvelteReactive} The reactive accessors & Svelte stores.\n */\n get reactive() { return this.#reactive; }\n\n /**\n * Returns the application state manager.\n *\n * @returns {ApplicationState} The application state manager.\n */\n get state() { return this.#applicationState; }\n\n /**\n * Returns the Svelte helper class w/ various methods to access mounted Svelte components.\n *\n * @returns {GetSvelteData} GetSvelteData\n */\n get svelte() { return this.#getSvelteData; }\n\n /**\n * In this case of when a template is defined in app options `html` references the inner HTML / template. However,\n * to activate classic v1 tabs for a Svelte component the element target is passed as an array simulating JQuery as\n * the element is retrieved immediately and the core listeners use standard DOM queries.\n *\n * @inheritDoc\n * @protected\n * @ignore\n */\n _activateCoreListeners(html)\n {\n super._activateCoreListeners(typeof this.options.template === 'string' ? html : [this.#elementTarget]);\n }\n\n /**\n * Provide an override to set this application as the active window regardless of z-index. Changes behaviour from\n * Foundry core. This is important / used for instance in dialog key handling for left / right button selection.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {boolean} [opts.force=false] - Force bring to top; will increment z-index by popOut order.\n *\n */\n bringToTop({ force = false } = {})\n {\n if (force || this.popOut) { super.bringToTop(); }\n\n // If the activeElement is not `document.body` and not contained in this app via elementTarget then blur the\n // current active element and make `document.body`focused. This allows <esc> key to close all open apps / windows.\n if (document.activeElement !== document.body && !this.elementTarget.contains(document.activeElement))\n {\n // Blur current active element.\n if (document.activeElement instanceof HTMLElement) { document.activeElement.blur(); }\n\n // Make document body focused.\n document.body.focus();\n }\n\n globalThis.ui.activeWindow = this;\n }\n\n /**\n * Note: This method is fully overridden and duplicated as Svelte components need to be destroyed manually and the\n * best visual result is to destroy them after the default slide up animation occurs, but before the element\n * is removed from the DOM.\n *\n * If you destroy the Svelte components before the slide up animation the Svelte elements are removed immediately\n * from the DOM. The purpose of overriding ensures the slide up animation is always completed before\n * the Svelte components are destroyed and then the element is removed from the DOM.\n *\n * Close the application and un-register references to it within UI mappings.\n * This function returns a Promise which resolves once the window closing animation concludes\n *\n * @param {object} [options] - Optional parameters.\n *\n * @param {boolean} [options.force] - Force close regardless of render state.\n *\n * @returns {Promise<void>} A Promise which resolves once the application is closed.\n * @ignore\n */\n async close(options = {})\n {\n const states = Application.RENDER_STATES;\n if (!options.force && ![states.RENDERED, states.ERROR].includes(this._state)) { return; }\n\n // Unsubscribe from any local stores.\n this.#stores.unsubscribe();\n\n /**\n * @ignore\n */\n this._state = states.CLOSING;\n\n /**\n * Get the element.\n *\n * @type {HTMLElement}\n */\n const el = this.#elementTarget;\n if (!el) { return this._state = states.CLOSED; }\n\n // Make any window content overflow hidden to avoid any scrollbars appearing in default or Svelte outro\n // transitions.\n const content = el.querySelector('.window-content');\n if (content)\n {\n content.style.overflow = 'hidden';\n\n // Set all children of content to overflow hidden as if there is going to be additional scrolling elements\n // they are likely one level deep.\n for (let cntr = content.children.length; --cntr >= 0;)\n {\n content.children[cntr].style.overflow = 'hidden';\n }\n }\n\n // Dispatch Hooks for closing the base and subclass applications\n for (const cls of this.constructor._getInheritanceChain())\n {\n /**\n * A hook event that fires whenever this Application is closed.\n *\n * @param {Application} app The Application instance being closed\n *\n * @param {jQuery[]} html The application HTML when it is closed\n *\n * @function closeApplication\n *\n * @memberof hookEvents\n */\n Hooks.call(`close${cls.name}`, this, el);\n }\n\n // If options `defaultCloseAnimation` is false then do not execute the standard slide up animation.\n // This allows Svelte components to provide any out transition. Application shells will automatically set\n // `defaultCloseAnimation` based on any out transition set or unset.\n const animate = typeof this.options.defaultCloseAnimation === 'boolean' ? this.options.defaultCloseAnimation :\n true;\n\n if (animate)\n {\n // Set min height for full slide.\n el.style.minHeight = '0';\n\n const { paddingBottom, paddingTop } = globalThis.getComputedStyle(el);\n\n // Slide-up application.\n await el.animate([\n { maxHeight: `${el.clientHeight}px`, paddingTop, paddingBottom },\n { maxHeight: 0, paddingTop: 0, paddingBottom: 0 }\n ], { duration: 250, easing: 'ease-in', fill: 'forwards' }).finished;\n }\n\n // Stores the Promises returned from running outro transitions and destroying each Svelte component.\n const svelteDestroyPromises = [];\n\n // Manually invoke the destroy callbacks for all Svelte components.\n for (const entry of this.#svelteData)\n {\n // Use `outroAndDestroy` to run outro transitions before destroying.\n svelteDestroyPromises.push(outroAndDestroy(entry.component));\n\n // If any proxy eventbus has been added then remove all event registrations from the component.\n const eventbus = entry.config.eventbus;\n if (isObject(eventbus) && typeof eventbus.off === 'function')\n {\n eventbus.off();\n entry.config.eventbus = void 0;\n }\n }\n\n // Await all Svelte components to destroy.\n await Promise.all(svelteDestroyPromises);\n\n // Reset SvelteData like this to maintain reference to GetSvelteData / `this.svelte`.\n this.#svelteData.length = 0;\n\n // Remove element from the DOM. Most SvelteComponents have already removed it.\n el.remove();\n\n // Silently restore any width / height state before minimized as applicable.\n this.position.state.restore({\n name: '#beforeMinimized',\n properties: ['width', 'height'],\n silent: true,\n remove: true\n });\n\n // Clean up data\n this.#applicationShellHolder[0] = null;\n /**\n * @ignore\n */\n this._element = null;\n this.#elementContent = null;\n this.#elementTarget = null;\n delete globalThis.ui.windows[this.appId];\n /**\n * @ignore\n */\n this._minimized = false;\n /**\n * @ignore\n */\n this._scrollPositions = null;\n this._state = states.CLOSED;\n\n this.#onMount = false;\n\n // Update the minimized UI store options.\n this.#stores.uiOptionsUpdate((storeOptions) => deepMerge(storeOptions, { minimized: this._minimized }));\n\n // Apply any stored focus options and then remove them from options.\n A11yHelper.applyFocusSource(this.options.focusSource);\n\n delete this.options.focusSource;\n }\n\n /**\n * Inject the Svelte components defined in `this.options.svelte`. The Svelte component can attach to the existing\n * pop-out of Application or provide no template and render into a document fragment which is then attached to the\n * DOM.\n *\n * @param {JQuery} html -\n *\n * @inheritDoc\n * @ignore\n */\n _injectHTML(html)\n {\n if (this.popOut && html.length === 0 && Array.isArray(this.options.svelte))\n {\n throw new Error(\n 'SvelteApplication - _injectHTML - A popout app with no template can only support one Svelte component.');\n }\n\n // Make sure the store is updated with the latest header buttons. Also allows filtering buttons before display.\n this.reactive.updateHeaderButtons();\n\n // Create a function to generate a callback for Svelte components to invoke to update the tracked elements for\n // application shells in the rare cases that the main element root changes. The update is only trigged on\n // successive changes of `elementRoot`. Returns a boolean to indicate the element roots are updated.\n const elementRootUpdate = () =>\n {\n let cntr = 0;\n\n return (elementRoot) =>\n {\n if (elementRoot !== null && elementRoot !== void 0 && cntr++ > 0)\n {\n this.#updateApplicationShell();\n return true;\n }\n\n return false;\n };\n };\n\n if (Array.isArray(this.options.svelte))\n {\n for (const svelteConfig of this.options.svelte)\n {\n const svelteData = loadSvelteConfig({\n app: this,\n template: html[0],\n config: svelteConfig,\n elementRootUpdate\n });\n\n if (isApplicationShell(svelteData.component))\n {\n if (this.svelte.applicationShell !== null)\n {\n throw new Error(\n `SvelteApplication - _injectHTML - An application shell is already mounted; offending config:\n ${JSON.stringify(svelteConfig)}`);\n }\n\n this.#applicationShellHolder[0] = svelteData.component;\n\n // If Vite / HMR / svelte_hmr is enabled then add a hook to receive callbacks when the ProxyComponent\n // refreshes. Update the element root accordingly and force an update to Position.\n // See this issue for info about `on_hmr`:\n // https://github.com/sveltejs/svelte-hmr/issues/57\n if (isHMRProxy(svelteData.component) && Array.isArray(svelteData.component?.$$?.on_hmr))\n {\n svelteData.component.$$.on_hmr.push(() => () => this.#updateApplicationShell());\n }\n }\n\n this.#svelteData.push(svelteData);\n }\n }\n else if (isObject(this.options.svelte))\n {\n const svelteData = loadSvelteConfig({\n app: this,\n template: html[0],\n config: this.options.svelte,\n elementRootUpdate\n });\n\n if (isApplicationShell(svelteData.component))\n {\n // A sanity check as shouldn't hit this case as only one component is being mounted.\n if (this.svelte.applicationShell !== null)\n {\n throw new Error(\n `SvelteApplication - _injectHTML - An application shell is already mounted; offending config:\n ${JSON.stringify(this.options.svelte)}`);\n }\n\n this.#applicationShellHolder[0] = svelteData.component;\n\n // If Vite / HMR / svelte_hmr is enabled then add a hook to receive callbacks when the ProxyComponent\n // refreshes. Update the element root accordingly and force an update to Position.\n // See this issue for info about `on_hmr`:\n // https://github.com/sveltejs/svelte-hmr/issues/57\n if (isHMRProxy(svelteData.component) && Array.isArray(svelteData.component?.$$?.on_hmr))\n {\n svelteData.component.$$.on_hmr.push(() => () => this.#updateApplicationShell());\n }\n }\n\n this.#svelteData.push(svelteData);\n }\n\n // Detect if this is a synthesized DocumentFragment.\n const isDocumentFragment = html.length && html[0] instanceof DocumentFragment;\n\n // If any of the Svelte components mounted directly targets an HTMLElement then do not inject HTML.\n let injectHTML = true;\n for (const svelteData of this.#svelteData)\n {\n if (!svelteData.injectHTML) { injectHTML = false; break; }\n }\n if (injectHTML) { super._injectHTML(html); }\n\n if (this.svelte.applicationShell !== null)\n {\n this._element = $(this.svelte.applicationShell.elementRoot);\n\n // Detect if the application shell exports an `elementContent` accessor.\n this.#elementContent = hasGetter(this.svelte.applicationShell, 'elementContent') ?\n this.svelte.applicationShell.elementContent : null;\n\n // Detect if the application shell exports an `elementTarget` accessor.\n this.#elementTarget = hasGetter(this.svelte.applicationShell, 'elementTarget') ?\n this.svelte.applicationShell.elementTarget : null;\n }\n else if (isDocumentFragment) // Set the element of the app to the first child element in order of Svelte components mounted.\n {\n for (const svelteData of this.#svelteData)\n {\n if (svelteData.element instanceof HTMLElement)\n {\n this._element = $(svelteData.element);\n break;\n }\n }\n }\n\n // Potentially retrieve a specific target element if `selectorTarget` is defined otherwise make the target the\n // main element.\n if (this.#elementTarget === null)\n {\n this.#elementTarget = typeof this.options.selectorTarget === 'string' ?\n this._element[0].querySelector(this.options.selectorTarget) : this._element[0];\n }\n\n if (this.#elementTarget === null || this.#elementTarget === void 0)\n {\n throw new Error(`SvelteApplication - _injectHTML: Target element '${this.options.selectorTarget}' not found.`);\n }\n\n // The initial zIndex may be set in application options or for popOut applications is stored by `_renderOuter`\n // in `this.#initialZIndex`.\n if (typeof this.options.positionable === 'boolean' && this.options.positionable)\n {\n this.#elementTarget.style.zIndex = typeof this.options.zIndex === 'number' ? this.options.zIndex :\n this.#initialZIndex ?? 95;\n }\n\n // Subscribe to local store handling.\n this.#stores.subscribe();\n }\n\n /**\n * Provides a mechanism to update the UI options store for maximized.\n *\n * Note: the sanity check is duplicated from {@link Application.maximize} the store is updated _before_\n * performing the rest of animations. This allows application shells to remove / show any resize handlers\n * correctly. Extra constraint data is stored in a saved position state in {@link SvelteApplication.minimize}\n * to animate the content area.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {boolean} [opts.animate=true] - When true perform default maximizing animation.\n *\n * @param {number} [opts.duration=0.1] - Controls content area animation duration in seconds.\n */\n async maximize({ animate = true, duration = 0.1 } = {})\n {\n if (!this.popOut || [false, null].includes(this._minimized)) { return; }\n\n this._minimized = null;\n\n const durationMS = duration * 1000; // For WAAPI.\n\n // Get content\n const element = this.elementTarget;\n const header = element.querySelector('.window-header');\n const content = element.querySelector('.window-content');\n\n // Get the complete position before minimized. Used to reset min width & height to initial values later.\n const positionBefore = this.position.state.get({ name: '#beforeMinimized' });\n\n // First animate / restore width / async.\n if (animate)\n {\n await this.position.state.restore({\n name: '#beforeMinimized',\n async: true,\n animateTo: true,\n properties: ['width'],\n duration: 0.1\n });\n }\n\n element.classList.remove('minimized');\n\n // Reset display none on all children of header.\n for (let cntr = header.children.length; --cntr >= 0;) { header.children[cntr].style.display = null; }\n\n content.style.display = null;\n\n let constraints;\n\n if (animate)\n {\n // Next animate / restore height synchronously and remove key. Retrieve constraints data for slide up animation\n // below.\n ({ constraints } = this.position.state.restore({\n name: '#beforeMinimized',\n animateTo: true,\n properties: ['height'],\n remove: true,\n duration\n }));\n }\n else\n {\n ({ constraints } = this.position.state.remove({ name: '#beforeMinimized' }));\n }\n\n // Slide down content with stored constraints.\n await content.animate([\n { maxHeight: 0, paddingTop: 0, paddingBottom: 0, offset: 0 },\n { ...constraints, offset: 1 },\n { maxHeight: '100%', offset: 1 },\n ], { duration: durationMS, fill: 'forwards' }).finished; // WAAPI in ms.\n\n // Restore previous min width & height from saved data, app options, or default Foundry values.\n this.position.set({\n minHeight: positionBefore.minHeight ?? this.options?.minHeight ?? MIN_WINDOW_HEIGHT,\n minWidth: positionBefore.minWidth ?? this.options?.minWidth ?? MIN_WINDOW_WIDTH,\n });\n\n // Remove inline styles that override any styles assigned to the app.\n element.style.minWidth = null;\n element.style.minHeight = null;\n\n this._minimized = false;\n\n // Using a 50ms timeout prevents any instantaneous display of scrollbars with the above maximize animation.\n setTimeout(() =>\n {\n content.style.overflow = null;\n\n // Reset all children of content removing overflow hidden.\n for (let cntr = content.children.length; --cntr >= 0;)\n {\n content.children[cntr].style.overflow = null;\n }\n }, 50);\n\n this.#stores.uiOptionsUpdate((options) => deepMerge(options, { minimized: false }));\n }\n\n /**\n * Provides a mechanism to update the UI options store for minimized.\n *\n * Note: the sanity check is duplicated from {@link Application.minimize} the store is updated _before_\n * performing the rest of animations. This allows application shells to remove / show any resize handlers\n * correctly. Extra constraint data is stored in a saved position state in {@link SvelteApplication.minimize}\n * to animate the content area.\n *\n * @param {object} [opts] - Optional parameters\n *\n * @param {boolean} [opts.animate=true] - When true perform default minimizing animation.\n *\n * @param {number} [opts.duration=0.1] - Controls content area animation duration in seconds.\n */\n async minimize({ animate = true, duration = 0.1 } = {})\n {\n if (!this.rendered || !this.popOut || [true, null].includes(this._minimized)) { return; }\n\n this.#stores.uiOptionsUpdate((options) => deepMerge(options, { minimized: true }));\n\n this._minimized = null;\n\n const durationMS = duration * 1000; // For WAAPI.\n\n const element = this.elementTarget;\n\n // Get content\n const header = element.querySelector('.window-header');\n const content = element.querySelector('.window-content');\n\n // Save current max / min height & width.\n const beforeMinWidth = this.position.minWidth;\n const beforeMinHeight = this.position.minHeight;\n\n // Set minimized min width & height for header bar.\n this.position.set({ minWidth: 100, minHeight: 30 });\n\n // Also set inline styles to override any styles scoped to the app.\n element.style.minWidth = '100px';\n element.style.minHeight = '30px';\n\n if (content)\n {\n content.style.overflow = 'hidden';\n\n // Set all children of content to overflow hidden as if there is going to be additional scrolling elements\n // they are likely one level deep.\n for (let cntr = content.children.length; --cntr >= 0;)\n {\n content.children[cntr].style.overflow = 'hidden';\n }\n }\n\n const { paddingBottom, paddingTop } = globalThis.getComputedStyle(content);\n\n // Extra data that is saved with the current position. Used during `maximize`.\n const constraints = {\n maxHeight: `${content.clientHeight}px`,\n paddingTop,\n paddingBottom\n };\n\n // Slide-up content\n if (animate)\n {\n const animation = content.animate([\n constraints,\n { maxHeight: 0, paddingTop: 0, paddingBottom: 0 }\n ], { duration: durationMS, fill: 'forwards' }); // WAAPI in ms.\n\n // Set display style to none when animation finishes.\n animation.finished.then(() => content.style.display = 'none');\n }\n else\n {\n setTimeout(() => content.style.display = 'none', durationMS);\n }\n\n // Save current position state and add the constraint data to use in `maximize`.\n const saved = this.position.state.save({ name: '#beforeMinimized', constraints });\n\n // Set the initial before min width & height.\n saved.minWidth = beforeMinWidth;\n saved.minHeight = beforeMinHeight;\n\n const headerOffsetHeight = header.offsetHeight;\n\n // minHeight needs to be adjusted to header height.\n this.position.minHeight = headerOffsetHeight;\n\n if (animate)\n {\n // First await animation of height upward.\n await this.position.animate.to({ height: headerOffsetHeight }, { duration }).finished;\n }\n\n // Set all header buttons besides close and the window title to display none.\n for (let cntr = header.children.length; --cntr >= 0;)\n {\n const className = header.children[cntr].className;\n\n if (className.includes('window-title') || className.includes('close')) { continue; }\n\n // v10+ of Foundry core styles automatically hides anything besides the window title and close button, so\n // explicitly set display to block.\n if (className.includes('keep-minimized'))\n {\n header.children[cntr].style.display = 'block';\n continue;\n }\n\n header.children[cntr].style.display = 'none';\n }\n\n if (animate)\n {\n // Await animation of width to the left / minimum width.\n await this.position.animate.to({ width: MIN_WINDOW_WIDTH }, { duration: 0.1 }).finished;\n }\n\n element.classList.add('minimized');\n\n this._minimized = true;\n }\n\n /**\n * Provides a callback after all Svelte components are initialized.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {HTMLElement} [opts.element] - HTMLElement container for main application element.\n *\n * @param {HTMLElement} [opts.elementContent] - HTMLElement container for content area of application shells.\n *\n * @param {HTMLElement} [opts.elementTarget] - HTMLElement container for main application target element.\n */\n onSvelteMount({ element, elementContent, elementTarget } = {}) {} // eslint-disable-line no-unused-vars\n\n /**\n * Provides a callback after the main application shell is remounted. This may occur during HMR / hot module\n * replacement or directly invoked from the `elementRootUpdate` callback passed to the application shell component\n * context.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {HTMLElement} [opts.element] - HTMLElement container for main application element.\n *\n * @param {HTMLElement} [opts.elementContent] - HTMLElement container for content area of application shells.\n *\n * @param {HTMLElement} [opts.elementTarget] - HTMLElement container for main application target element.\n */\n onSvelteRemount({ element, elementContent, elementTarget } = {}) {} // eslint-disable-line no-unused-vars\n\n /**\n * Override replacing HTML as Svelte components control the rendering process. Only potentially change the outer\n * application frame / title for pop-out applications.\n *\n * @inheritDoc\n * @ignore\n */\n _replaceHTML(element, html) // eslint-disable-line no-unused-vars\n {\n if (!element.length) { return; }\n\n this.reactive.updateHeaderButtons();\n }\n\n /**\n * Provides an override verifying that a new Application being rendered for the first time doesn't have a\n * corresponding DOM element already loaded. This is a check that only occurs when `this._state` is\n * `Application.RENDER_STATES.NONE`. It is useful in particular when SvelteApplication has a static ID\n * explicitly set in `this.options.id` and long intro / outro transitions are assigned. If a new application\n * sharing this static ID attempts to open / render for the first time while an existing DOM element sharing\n * this static ID exists then the initial render is cancelled below rather than crashing later in the render\n * cycle {@link Position.set}.\n *\n * @inheritDoc\n * @protected\n * @ignore\n */\n async _render(force = false, options = {})\n {\n // Store any focusSource instance.\n if (isObject(options?.focusSource)) { this.options.focusSource = options.focusSource; }\n\n if (this._state === Application.RENDER_STATES.NONE &&\n document.querySelector(`#${this.id}`) instanceof HTMLElement)\n {\n console.warn(`SvelteApplication - _render: A DOM element already exists for CSS ID '${this.id\n }'. Cancelling initial render for new application with appId '${this.appId}'.`);\n\n return;\n }\n\n await super._render(force, options);\n\n if (!this.#onMount)\n {\n this.onSvelteMount({ element: this._element[0], elementContent: this.#elementContent, elementTarget:\n this.#elementTarget });\n\n this.#onMount = true;\n }\n }\n\n /**\n * Render the inner application content. Only render a template if one is defined otherwise provide an empty\n * JQuery element per the core Foundry API.\n *\n * @param {object} data The data used to render the inner template\n *\n * @returns {Promise.<JQuery>} A promise resolving to the constructed jQuery object\n *\n * @protected\n * @ignore\n */\n async _renderInner(data)\n {\n const html = typeof this.template === 'string' ? await renderTemplate(this.template, data) :\n document.createDocumentFragment();\n\n return $(html);\n }\n\n /**\n * Stores the initial z-index set in `_renderOuter` which is used in `_injectHTML` to set the target element\n * z-index after the Svelte component is mounted.\n *\n * @returns {Promise<JQuery>} Outer frame / unused.\n * @protected\n * @ignore\n */\n async _renderOuter()\n {\n const html = await super._renderOuter();\n this.#initialZIndex = html[0].style.zIndex;\n return html;\n }\n\n /**\n * All calculation and updates of position are implemented in {@link Position.set}. This allows position to be fully\n * reactive and in control of updating inline styles for the application.\n *\n * This method remains for backward compatibility with Foundry. If you have a custom override quite likely you need\n * to update to using the {@link Position.validators} functionality.\n *\n * @param {PositionDataExtended} [position] - Position data.\n *\n * @returns {Position} The updated position object for the application containing the new values\n */\n setPosition(position)\n {\n return this.position.set(position);\n }\n\n /**\n * This method is invoked by the `elementRootUpdate` callback that is added to the external context passed to\n * Svelte components. When invoked it updates the local element roots tracked by SvelteApplication.\n *\n * This method may also be invoked by HMR / hot module replacement via `svelte-hmr`.\n */\n #updateApplicationShell()\n {\n const applicationShell = this.svelte.applicationShell;\n\n if (applicationShell !== null)\n {\n this._element = $(applicationShell.elementRoot);\n\n // Detect if the application shell exports an `elementContent` accessor.\n this.#elementContent = hasGetter(applicationShell, 'elementContent') ?\n applicationShell.elementContent : null;\n\n // Detect if the application shell exports an `elementTarget` accessor.\n this.#elementTarget = hasGetter(applicationShell, 'elementTarget') ?\n applicationShell.elementTarget : null;\n\n if (this.#elementTarget === null)\n {\n this.#elementTarget = typeof this.options.selectorTarget === 'string' ?\n this._element[0].querySelector(this.options.selectorTarget) : this._element[0];\n }\n\n // The initial zIndex may be set in application options or for popOut applications is stored by `_renderOuter`\n // in `this.#initialZIndex`.\n if (typeof this.options.positionable === 'boolean' && this.options.positionable)\n {\n this.#elementTarget.style.zIndex = typeof this.options.zIndex === 'number' ? this.options.zIndex :\n this.#initialZIndex ?? 95;\n\n super.bringToTop();\n\n // Ensure that new root element has inline position styles set.\n this.position.set(this.position.get());\n }\n\n super._activateCoreListeners([this.#elementTarget]);\n\n this.onSvelteRemount({ element: this._element[0], elementContent: this.#elementContent, elementTarget:\n this.#elementTarget });\n }\n }\n}\n\n/**\n * @typedef {ApplicationOptions} SvelteApplicationOptions\n *\n * @property {boolean} [defaultCloseAnimation=true] - If false the default slide close animation is not run.\n *\n * @property {boolean} [draggable=true] - If true then application shells are draggable.\n *\n * @property {boolean} [focusAuto=true] - When true auto-management of app focus is enabled.\n *\n * @property {boolean} [focusKeep=false] - When `focusAuto` and `focusKeep` is true; keeps internal focus.\n *\n * @property {object} [focusSource] - Defines A11yHelper focus source to apply when application closes.\n *\n * @property {boolean} [headerButtonNoClose=false] - If true then the close header button is removed.\n *\n * @property {boolean} [headerButtonNoLabel=false] - If true then header button labels are removed.\n *\n * @property {boolean} [headerNoTitleMinimized=false] - If true then header title is hidden when minimized.\n *\n * @property {number} [minHeight=MIN_WINDOW_HEIGHT] - Assigned to position. Number specifying minimum window height.\n *\n * @property {number} [minWidth=MIN_WINDOW_WIDTH] - Assigned to position. Number specifying minimum window width.\n *\n * @property {boolean} [positionable=true] - If false then `position.set` does not take effect.\n *\n * @property {PositionInitialHelper} [positionInitial] - A helper for initial position placement.\n *\n * @property {boolean} [positionOrtho=true] - When true Position is optimized for orthographic use.\n *\n * @property {PositionValidatorOptions} [positionValidator] - A validator function or data or list of validators.\n *\n * @property {object} [sessionStorage] - An instance of TJSSessionStorage to share across SvelteApplications.\n *\n * @property {object} [svelte] - A Svelte configuration object defining the main component.\n *\n * @property {string} [transformOrigin='top left'] - By default, 'top / left' respects rotation when minimizing.\n */\n\n/**\n * @typedef {object} SvelteData\n *\n * @property {object} config -\n *\n * @property {import('svelte').SvelteComponent} component -\n *\n * @property {HTMLElement} element -\n *\n * @property {boolean} injectHTML -\n */\n\n/**\n * @typedef {object} SvelteStores\n *\n * @property {import('svelte/store').Writable.update} appOptionsUpdate - Update function for app options store.\n *\n * @property {Function} subscribe - Subscribes to local stores.\n *\n * @property {import('svelte/store').Writable.update} uiOptionsUpdate - Update function for UI options store.\n *\n * @property {Function} unsubscribe - Unsubscribes from local stores.\n */\n","import { StyleManager } from '@typhonjs-fvtt/runtime/svelte/util';\n\nconst s_STYLE_KEY = '#__trl-root-styles';\n\nconst cssVariables = new StyleManager({ docKey: s_STYLE_KEY, version: 1 });\n\nexport { cssVariables };\n","import { isUpdatableStore, isWritableStore } from '@typhonjs-fvtt/runtime/svelte/store';\nimport { styleParsePixels, isObject, debounce, hasSetter, isIterable } from '@typhonjs-fvtt/runtime/svelte/util';\nimport { cubicOut } from 'svelte/easing';\n\n/**\n * Provides an action to always blur the element when any pointer up event occurs on the element.\n *\n * @param {HTMLElement} node - The node to handle always blur on pointer up.\n *\n * @returns {{destroy: Function}} Lifecycle functions.\n */\nfunction alwaysBlur(node)\n{\n /**\n * Blurs node if active element.\n */\n function blurNode()\n {\n setTimeout(() => { if (document.activeElement === node) { node.blur(); } }, 0);\n }\n\n node.addEventListener('pointerup', blurNode);\n\n return {\n destroy: () => node.removeEventListener('pointerup', blurNode)\n };\n}\n\n/**\n * Provides an action to monitor the given HTMLElement node with `ResizeObserver` posting width / height changes\n * to the target in various ways depending on the shape of the target. The target can be one of the following and the\n * precedence order is listed from top to bottom:\n *\n * - has a `resizeObserved` function as attribute; offset then content width / height are passed as parameters.\n * - has a `setContentBounds` function as attribute; content width / height are passed as parameters.\n * - has a `setDimension` function as attribute; offset width / height are passed as parameters.\n * - target is an object; offset and content width / height attributes are directly set on target.\n * - target is a function; the function is invoked with offset then content width / height parameters.\n * - has a writable store `resizeObserved` as an attribute; updated with offset & content width / height.\n * - has an object 'stores' that has a writable store `resizeObserved` as an attribute; updated with offset &\n * content width / height.\n *\n * Note: Svelte currently uses an archaic IFrame based workaround to monitor offset / client width & height changes.\n * A more up to date way to do this is with ResizeObserver. To track when Svelte receives ResizeObserver support\n * monitor this issue: {@link https://github.com/sveltejs/svelte/issues/4233}\n *\n * Can-I-Use: {@link https://caniuse.com/resizeobserver}\n *\n * @param {HTMLElement} node - The node associated with the action.\n *\n * @param {ResizeObserverTarget} target - An object or function to update with observed width & height changes.\n *\n * @returns {{update: Function, destroy: Function}} The action lifecycle methods.\n * @see {@link https://github.com/sveltejs/svelte/issues/4233}\n */\nfunction resizeObserver(node, target)\n{\n ResizeObserverManager.add(node, target);\n\n return {\n update: (newTarget) =>\n {\n ResizeObserverManager.remove(node, target);\n target = newTarget;\n ResizeObserverManager.add(node, target);\n },\n\n destroy: () =>\n {\n ResizeObserverManager.remove(node, target);\n }\n };\n}\n\n/**\n * Provides a function that when invoked with an element updates the cached styles for each subscriber of the element.\n *\n * The style attributes cached to calculate offset height / width include border & padding dimensions. You only need\n * to update the cache if you change border or padding attributes of the element.\n *\n * @param {HTMLElement} el - An HTML element.\n */\nresizeObserver.updateCache = function(el)\n{\n if (!(el instanceof HTMLElement)) { throw new TypeError(`resizeObserverUpdate error: 'el' is not an HTMLElement.`); }\n\n const subscribers = s_MAP.get(el);\n\n if (Array.isArray(subscribers))\n {\n const computed = globalThis.getComputedStyle(el);\n\n // Cache styles first from any inline styles then computed styles defaulting to 0 otherwise.\n // Used to create the offset width & height values from the context box ResizeObserver provides.\n const borderBottom = styleParsePixels(el.style.borderBottom) ?? styleParsePixels(computed.borderBottom) ?? 0;\n const borderLeft = styleParsePixels(el.style.borderLeft) ?? styleParsePixels(computed.borderLeft) ?? 0;\n const borderRight = styleParsePixels(el.style.borderRight) ?? styleParsePixels(computed.borderRight) ?? 0;\n const borderTop = styleParsePixels(el.style.borderTop) ?? styleParsePixels(computed.borderTop) ?? 0;\n const paddingBottom = styleParsePixels(el.style.paddingBottom) ?? styleParsePixels(computed.paddingBottom) ?? 0;\n const paddingLeft = styleParsePixels(el.style.paddingLeft) ?? styleParsePixels(computed.paddingLeft) ?? 0;\n const paddingRight = styleParsePixels(el.style.paddingRight) ?? styleParsePixels(computed.paddingRight) ?? 0;\n const paddingTop = styleParsePixels(el.style.paddingTop) ?? styleParsePixels(computed.paddingTop) ?? 0;\n\n const additionalWidth = borderLeft + borderRight + paddingLeft + paddingRight;\n const additionalHeight = borderTop + borderBottom + paddingTop + paddingBottom;\n\n for (const subscriber of subscribers)\n {\n subscriber.styles.additionalWidth = additionalWidth;\n subscriber.styles.additionalHeight = additionalHeight;\n s_UPDATE_SUBSCRIBER(subscriber, subscriber.contentWidth, subscriber.contentHeight);\n }\n }\n};\n\n// Below is the static ResizeObserverManager ------------------------------------------------------------------------\n\nconst s_MAP = new Map();\n\n/**\n * Provides a static / single instance of ResizeObserver that can notify listeners in different ways.\n *\n * The action, {@link resizeObserver}, utilizes ResizeObserverManager for automatic registration and removal\n * via Svelte.\n */\nclass ResizeObserverManager\n{\n /**\n * Add an HTMLElement and ResizeObserverTarget instance for monitoring. Create cached style attributes for the\n * given element include border & padding dimensions for offset width / height calculations.\n *\n * @param {HTMLElement} el - The element to observe.\n *\n * @param {ResizeObserverTarget} target - A target that contains one of several mechanisms for updating resize data.\n */\n static add(el, target)\n {\n const updateType = s_GET_UPDATE_TYPE(target);\n\n if (updateType === 0)\n {\n throw new Error(`'target' does not match supported ResizeObserverManager update mechanisms.`);\n }\n\n const computed = globalThis.getComputedStyle(el);\n\n // Cache styles first from any inline styles then computed styles defaulting to 0 otherwise.\n // Used to create the offset width & height values from the context box ResizeObserver provides.\n const borderBottom = styleParsePixels(el.style.borderBottom) ?? styleParsePixels(computed.borderBottom) ?? 0;\n const borderLeft = styleParsePixels(el.style.borderLeft) ?? styleParsePixels(computed.borderLeft) ?? 0;\n const borderRight = styleParsePixels(el.style.borderRight) ?? styleParsePixels(computed.borderRight) ?? 0;\n const borderTop = styleParsePixels(el.style.borderTop) ?? styleParsePixels(computed.borderTop) ?? 0;\n const paddingBottom = styleParsePixels(el.style.paddingBottom) ?? styleParsePixels(computed.paddingBottom) ?? 0;\n const paddingLeft = styleParsePixels(el.style.paddingLeft) ?? styleParsePixels(computed.paddingLeft) ?? 0;\n const paddingRight = styleParsePixels(el.style.paddingRight) ?? styleParsePixels(computed.paddingRight) ?? 0;\n const paddingTop = styleParsePixels(el.style.paddingTop) ?? styleParsePixels(computed.paddingTop) ?? 0;\n\n const data = {\n updateType,\n target,\n\n // Stores most recent contentRect.width and contentRect.height values from ResizeObserver.\n contentWidth: 0,\n contentHeight: 0,\n\n // Convenience data for total border & padding for offset width & height calculations.\n styles: {\n additionalWidth: borderLeft + borderRight + paddingLeft + paddingRight,\n additionalHeight: borderTop + borderBottom + paddingTop + paddingBottom\n }\n };\n\n if (s_MAP.has(el))\n {\n const subscribers = s_MAP.get(el);\n subscribers.push(data);\n }\n else\n {\n s_MAP.set(el, [data]);\n }\n\n s_RESIZE_OBSERVER.observe(el);\n }\n\n /**\n * Removes all targets from monitoring when just an element is provided otherwise removes a specific target\n * from the monitoring map. If no more targets remain then the element is removed from monitoring.\n *\n * @param {HTMLElement} el - Element to remove from monitoring.\n *\n * @param {ResizeObserverTarget} [target] - A specific target to remove from monitoring.\n */\n static remove(el, target = void 0)\n {\n const subscribers = s_MAP.get(el);\n if (Array.isArray(subscribers))\n {\n const index = subscribers.findIndex((entry) => entry.target === target);\n if (index >= 0)\n {\n // Update target subscriber with undefined values.\n s_UPDATE_SUBSCRIBER(subscribers[index], void 0, void 0);\n\n subscribers.splice(index, 1);\n }\n\n // Remove element monitoring if last target removed.\n if (subscribers.length === 0)\n {\n s_MAP.delete(el);\n s_RESIZE_OBSERVER.unobserve(el);\n }\n }\n }\n}\n\n/**\n * Defines the various shape / update type of the given target.\n *\n * @type {Record<string, number>}\n */\nconst s_UPDATE_TYPES = {\n none: 0,\n attribute: 1,\n function: 2,\n resizeObserved: 3,\n setContentBounds: 4,\n setDimension: 5,\n storeObject: 6,\n storesObject: 7\n};\n\nconst s_RESIZE_OBSERVER = new ResizeObserver((entries) =>\n{\n for (const entry of entries)\n {\n const subscribers = s_MAP.get(entry?.target);\n\n if (Array.isArray(subscribers))\n {\n const contentWidth = entry.contentRect.width;\n const contentHeight = entry.contentRect.height;\n\n for (const subscriber of subscribers)\n {\n s_UPDATE_SUBSCRIBER(subscriber, contentWidth, contentHeight);\n }\n }\n }\n});\n\n/**\n * Determines the shape of the target instance regarding valid update mechanisms to set width & height changes.\n *\n * @param {*} target - The target instance.\n *\n * @returns {number} Update type value.\n */\nfunction s_GET_UPDATE_TYPE(target)\n{\n if (target?.resizeObserved instanceof Function) { return s_UPDATE_TYPES.resizeObserved; }\n if (target?.setDimension instanceof Function) { return s_UPDATE_TYPES.setDimension; }\n if (target?.setContentBounds instanceof Function) { return s_UPDATE_TYPES.setContentBounds; }\n\n const targetType = typeof target;\n\n // Does the target have resizeObserved writable store?\n if (targetType !== null && (targetType === 'object' || targetType === 'function'))\n {\n if (isUpdatableStore(target.resizeObserved))\n {\n return s_UPDATE_TYPES.storeObject;\n }\n\n // Now check for a child stores object which is a common TRL pattern for exposing stores.\n const stores = target?.stores;\n if (isObject(stores) || typeof stores === 'function')\n {\n if (isUpdatableStore(stores.resizeObserved))\n {\n return s_UPDATE_TYPES.storesObject;\n }\n }\n }\n\n if (targetType !== null && targetType === 'object') { return s_UPDATE_TYPES.attribute; }\n\n if (targetType === 'function') { return s_UPDATE_TYPES.function; }\n\n return s_UPDATE_TYPES.none;\n}\n\n/**\n * Updates a subscriber target with given content width & height values. Offset width & height is calculated from\n * the content values + cached styles.\n *\n * @param {object} subscriber - Internal data about subscriber.\n *\n * @param {number|undefined} contentWidth - ResizeObserver contentRect.width value or undefined.\n *\n * @param {number|undefined} contentHeight - ResizeObserver contentRect.height value or undefined.\n */\nfunction s_UPDATE_SUBSCRIBER(subscriber, contentWidth, contentHeight)\n{\n const styles = subscriber.styles;\n\n subscriber.contentWidth = contentWidth;\n subscriber.contentHeight = contentHeight;\n\n const offsetWidth = Number.isFinite(contentWidth) ? contentWidth + styles.additionalWidth : void 0;\n const offsetHeight = Number.isFinite(contentHeight) ? contentHeight + styles.additionalHeight : void 0;\n\n const target = subscriber.target;\n\n switch (subscriber.updateType)\n {\n case s_UPDATE_TYPES.attribute:\n target.contentWidth = contentWidth;\n target.contentHeight = contentHeight;\n target.offsetWidth = offsetWidth;\n target.offsetHeight = offsetHeight;\n break;\n\n case s_UPDATE_TYPES.function:\n target?.(offsetWidth, offsetHeight, contentWidth, contentHeight);\n break;\n\n case s_UPDATE_TYPES.resizeObserved:\n target.resizeObserved?.(offsetWidth, offsetHeight, contentWidth, contentHeight);\n break;\n\n case s_UPDATE_TYPES.setContentBounds:\n target.setContentBounds?.(contentWidth, contentHeight);\n break;\n\n case s_UPDATE_TYPES.setDimension:\n target.setDimension?.(offsetWidth, offsetHeight);\n break;\n\n case s_UPDATE_TYPES.storeObject:\n target.resizeObserved.update((object) =>\n {\n object.contentHeight = contentHeight;\n object.contentWidth = contentWidth;\n object.offsetHeight = offsetHeight;\n object.offsetWidth = offsetWidth;\n\n return object;\n });\n break;\n\n case s_UPDATE_TYPES.storesObject:\n target.stores.resizeObserved.update((object) =>\n {\n object.contentHeight = contentHeight;\n object.contentWidth = contentWidth;\n object.offsetHeight = offsetHeight;\n object.offsetWidth = offsetWidth;\n\n return object;\n });\n break;\n }\n}\n\n/**\n * @typedef {object | Function} ResizeObserverTarget\n *\n * @property {number} [contentHeight] -\n *\n * @property {number} [contentWidth] -\n *\n * @property {number} [offsetHeight] -\n *\n * @property {number} [offsetWidth] -\n *\n * @property {Writable<object> | Function} [resizedObserver] - Either a function or a writable store.\n *\n * @property {Function} [setContentSize] - A function that is invoked with content width & height changes.\n *\n * @property {Function} [setDimension] - A function that is invoked with offset width & height changes.\n *\n * @property {{resizedObserver: Writable<object>}} [stores] - An object with a writable store.\n */\n\n/**\n * Provides an action to save `scrollTop` of an element with a vertical scrollbar. This action should be used on the\n * scrollable element and must include a writable store that holds the active store for the current `scrollTop` value.\n * You may switch the stores externally and this action will set the `scrollTop` based on the newly set store. This is\n * useful for instance providing a select box that controls the scrollable container.\n *\n * @param {HTMLElement} element - The target scrollable HTML element.\n *\n * @param {import('svelte/store').Writable<number>} store - A writable store that stores the element scrollTop.\n *\n * @returns {{destroy: Function, update: Function}} Lifecycle functions.\n */\nfunction applyScrolltop(element, store)\n{\n if (!isWritableStore(store))\n {\n throw new TypeError(`applyScrolltop error: 'store' must be a writable Svelte store.`);\n }\n\n /**\n * Updates element `scrollTop`.\n *\n * @param {number} value -\n */\n function storeUpdate(value)\n {\n if (!Number.isFinite(value)) { return; }\n\n // For some reason for scrollTop to take on first update from a new element setTimeout is necessary.\n setTimeout(() => element.scrollTop = value, 0);\n }\n\n let unsubscribe = store.subscribe(storeUpdate);\n\n const resizeControl = resizeObserver(element, debounce(() =>\n {\n if (element.isConnected) { store.set(element.scrollTop); }\n }, 500));\n\n /**\n * Save target `scrollTop` to the current set store.\n *\n * @param {Event} event -\n */\n function onScroll(event)\n {\n store.set(event.target.scrollTop);\n }\n\n const debounceFn = debounce((e) => onScroll(e), 500);\n\n element.addEventListener('scroll', debounceFn);\n\n return {\n update: (newStore) =>\n {\n unsubscribe();\n store = newStore;\n\n if (!isWritableStore(store))\n {\n throw new TypeError(`applyScrolltop.update error: 'store' must be a writable Svelte store.`);\n }\n\n unsubscribe = store.subscribe(storeUpdate);\n },\n\n destroy: () =>\n {\n element.removeEventListener('scroll', debounceFn);\n unsubscribe();\n resizeControl.destroy();\n }\n };\n}\n\n/**\n * Provides an action to blur the element when any pointer down event occurs outside the element. This can be useful\n * for input elements including select to blur / unfocus the element when any pointer down occurs outside the element.\n *\n * @param {HTMLElement} node - The node to handle automatic blur on focus loss.\n *\n * @returns {{destroy: Function}} Lifecycle functions.\n */\nfunction autoBlur(node)\n{\n /**\n * Removes listener on blur.\n */\n function onBlur() { document.body.removeEventListener('pointerdown', onPointerDown); }\n\n /**\n * Adds listener on focus.\n */\n function onFocus() { document.body.addEventListener('pointerdown', onPointerDown); }\n\n /**\n * Blur the node if a pointer down event happens outside the node.\n *\n * @param {PointerEvent} event -\n */\n function onPointerDown(event)\n {\n if (event.target === node || node.contains(event.target)) { return; }\n\n if (document.activeElement === node) { node.blur(); }\n }\n\n node.addEventListener('blur', onBlur);\n node.addEventListener('focus', onFocus);\n\n return {\n destroy: () =>\n {\n document.body.removeEventListener('pointerdown', onPointerDown);\n node.removeEventListener('blur', onBlur);\n node.removeEventListener('focus', onFocus);\n }\n };\n}\n\n/**\n * Provides an action to monitor focus state of a given element and set an associated store with current focus state.\n *\n * This action is usable with any writable store.\n *\n * @param {HTMLElement} node - Target element.\n *\n * @param {import('svelte/store').Writable<boolean>} storeFocused - Update store for focus changes.\n *\n * @returns {{update: (function(object): void), destroy: (function(): void)}} Action lifecycle methods.\n */\nfunction isFocused(node, storeFocused)\n{\n let localFocused = false;\n\n /**\n * Updates `storeFocused` w/ current focused state.\n *\n * @param {boolean} current - current focused state.\n */\n function setFocused(current)\n {\n localFocused = current;\n\n if (isWritableStore(storeFocused)) { storeFocused.set(localFocused); }\n }\n\n /**\n * Focus event listener.\n */\n function onFocus()\n {\n setFocused(true);\n }\n\n /**\n * Blur event listener.\n */\n function onBlur()\n {\n setFocused(false);\n }\n\n /**\n * Activate listeners.\n */\n function activateListeners()\n {\n node.addEventListener('focus', onFocus);\n node.addEventListener('blur', onBlur);\n }\n\n /**\n * Remove listeners.\n */\n function removeListeners()\n {\n node.removeEventListener('focus', onFocus);\n node.removeEventListener('blur', onBlur);\n }\n\n activateListeners();\n\n return {\n update: (newStoreFocused) => // eslint-disable-line no-shadow\n {\n storeFocused = newStoreFocused;\n setFocused(localFocused);\n },\n\n destroy: () => removeListeners()\n };\n}\n\n/**\n * Provides an action to forward on key down & up events. This can be any object that has associated `keydown` and\n * `keyup` methods. See {@link KeyStore} for a store implementation.\n *\n * @param {HTMLElement} node - Target element.\n *\n * @param {{keydown: Function, keyup: Function}} keyStore - Object to forward events key down / up events to...\n *\n * @returns {{update: (function(object): void), destroy: (function(): void)}} Action lifecycle methods.\n */\nfunction keyforward(node, keyStore)\n{\n if (typeof keyStore?.keydown !== 'function' || typeof keyStore.keyup !== 'function')\n {\n throw new TypeError(`'keyStore' doesn't have required 'keydown' or 'keyup' methods.`);\n }\n\n /**\n * @param {KeyboardEvent} event -\n */\n function onKeydown(event)\n {\n keyStore.keydown(event);\n }\n\n /**\n * @param {KeyboardEvent} event -\n */\n function onKeyup(event)\n {\n keyStore.keyup(event);\n }\n\n /**\n * Activates key listeners.\n */\n function activateListeners()\n {\n node.addEventListener('keydown', onKeydown);\n node.addEventListener('keyup', onKeyup);\n }\n\n /**\n * Removes key listeners.\n */\n function removeListeners()\n {\n node.removeEventListener('keydown', onKeydown);\n node.removeEventListener('keyup', onKeyup);\n }\n\n activateListeners();\n\n return {\n update: (newKeyStore) => // eslint-disable-line no-shadow\n {\n keyStore = newKeyStore;\n\n if (typeof keyStore?.keydown !== 'function' || typeof keyStore.keyup !== 'function')\n {\n throw new TypeError(`'newKeyStore' doesn't have required 'keydown' or 'keyup' methods.`);\n }\n },\n\n destroy: () => removeListeners()\n };\n}\n\n/**\n * Provides an action to apply style properties provided as an object.\n *\n * @param {HTMLElement} node - Target element\n *\n * @param {object} properties - Key / value object of properties to set.\n *\n * @returns {Function} Update function.\n */\nfunction applyStyles(node, properties)\n{\n /** Sets properties on node. */\n function setProperties()\n {\n if (typeof properties !== 'object') { return; }\n\n for (const prop of Object.keys(properties))\n {\n node.style.setProperty(`${prop}`, properties[prop]);\n }\n }\n\n setProperties();\n\n return {\n update(newProperties)\n {\n properties = newProperties;\n setProperties();\n }\n };\n}\n\n/**\n * Provides an action to apply a Position instance to a HTMLElement and invoke `position.parent`\n *\n * @param {HTMLElement} node - The node associated with the action.\n *\n * @param {Position} position - A position instance.\n *\n * @returns {{update: Function, destroy: Function}} The action lifecycle methods.\n */\nfunction applyPosition(node, position)\n{\n if (hasSetter(position, 'parent')) { position.parent = node; }\n\n return {\n update: (newPosition) =>\n {\n // Sanity case to short circuit update if positions are the same instance.\n if (newPosition === position && newPosition.parent === position.parent) { return; }\n\n if (hasSetter(position)) { position.parent = void 0; }\n\n position = newPosition;\n\n if (hasSetter(position, 'parent')) { position.parent = node; }\n },\n\n destroy: () => { if (hasSetter(position, 'parent')) { position.parent = void 0; } }\n };\n}\n\n/**\n * Provides an action to enable pointer dragging of an HTMLElement and invoke `position.set` on a given {@link Position}\n * instance provided. When the attached boolean store state changes the draggable action is enabled or disabled.\n *\n * @param {HTMLElement} node - The node associated with the action.\n *\n * @param {object} params - Required parameters.\n *\n * @param {Position} params.position - A position instance.\n *\n * @param {boolean} [params.active=true] - A boolean value; attached to a readable store.\n *\n * @param {number} [params.button=0] - MouseEvent button; {@link https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button}.\n *\n * @param {import('svelte/store').Writable<boolean>} [params.storeDragging] - A writable store that tracks \"dragging\"\n * state.\n *\n * @param {boolean} [params.ease=true] - When true easing is enabled.\n *\n * @param {object} [params.easeOptions] - Gsap `to / `quickTo` vars object.\n *\n * @param {Iterable<string>} [params.hasTargetClassList] - When defined any event targets that have a class in this\n * list are allowed.\n *\n * @param {Iterable<string>} [params.ignoreTargetClassList] - When defined any event targets that have a class in this\n * list are ignored.\n *\n * @returns {{update: Function, destroy: Function}} The action lifecycle methods.\n */\nfunction draggable(node, { position, active = true, button = 0, storeDragging = void 0, ease = false,\n easeOptions = { duration: 0.1, ease: cubicOut }, hasTargetClassList, ignoreTargetClassList })\n{\n if (hasTargetClassList !== void 0 && !isIterable(hasTargetClassList))\n {\n throw new TypeError(`'hasTargetClassList' is not iterable.`);\n }\n\n if (ignoreTargetClassList !== void 0 && !isIterable(ignoreTargetClassList))\n {\n throw new TypeError(`'ignoreTargetClassList' is not iterable.`);\n }\n\n /**\n * Duplicate the app / Positionable starting position to track differences.\n *\n * @type {object}\n */\n let initialPosition = null;\n\n /**\n * Stores the initial X / Y on drag down.\n *\n * @type {object}\n */\n let initialDragPoint = {};\n\n /**\n * Stores the current dragging state and gates the move pointer as the dragging store is not\n * set until the first pointer move.\n *\n * @type {boolean}\n */\n let dragging = false;\n\n /**\n * Stores the quickTo callback to use for optimized tweening when easing is enabled.\n *\n * @type {quickToCallback}\n */\n let quickTo = position.animate.quickTo(['top', 'left'], easeOptions);\n\n /**\n * Remember event handlers associated with this action so they may be later unregistered.\n *\n * @type {object}\n */\n const handlers = {\n dragDown: ['pointerdown', (e) => onDragPointerDown(e), false],\n dragMove: ['pointermove', (e) => onDragPointerChange(e), false],\n dragUp: ['pointerup', (e) => onDragPointerUp(e), false]\n };\n\n /**\n * Activates listeners.\n */\n function activateListeners()\n {\n // Drag handlers\n node.addEventListener(...handlers.dragDown);\n node.classList.add('draggable');\n }\n\n /**\n * Removes listeners.\n */\n function removeListeners()\n {\n if (typeof storeDragging?.set === 'function') { storeDragging.set(false); }\n\n // Drag handlers\n node.removeEventListener(...handlers.dragDown);\n node.removeEventListener(...handlers.dragMove);\n node.removeEventListener(...handlers.dragUp);\n node.classList.remove('draggable');\n }\n\n if (active)\n {\n activateListeners();\n }\n\n /**\n * Handle the initial pointer down that activates dragging behavior for the positionable.\n *\n * @param {PointerEvent} event - The pointer down event.\n */\n function onDragPointerDown(event)\n {\n if (event.button !== button || !event.isPrimary) { return; }\n\n // Do not process if the position system is not enabled.\n if (!position.enabled) { return; }\n\n // Potentially ignore this event if `ignoreTargetClassList` is defined and the `event.target` has a matching\n // class.\n if (ignoreTargetClassList !== void 0 && event.target instanceof HTMLElement)\n {\n for (const targetClass of ignoreTargetClassList)\n {\n if (event.target.classList.contains(targetClass)) { return; }\n }\n }\n\n // Potentially ignore this event if `hasTargetClassList` is defined and the `event.target` does not have any\n // matching class from the list.\n if (hasTargetClassList !== void 0 && event.target instanceof HTMLElement)\n {\n let foundTarget = false;\n\n for (const targetClass of hasTargetClassList)\n {\n if (event.target.classList.contains(targetClass))\n {\n foundTarget = true;\n break;\n }\n }\n\n if (!foundTarget) { return; }\n }\n\n event.preventDefault();\n\n dragging = false;\n\n // Record initial position.\n initialPosition = position.get();\n initialDragPoint = { x: event.clientX, y: event.clientY };\n\n // Add move and pointer up handlers.\n node.addEventListener(...handlers.dragMove);\n node.addEventListener(...handlers.dragUp);\n\n node.setPointerCapture(event.pointerId);\n }\n\n /**\n * Move the positionable.\n *\n * @param {PointerEvent} event - The pointer move event.\n */\n function onDragPointerChange(event)\n {\n // See chorded button presses for pointer events:\n // https://www.w3.org/TR/pointerevents3/#chorded-button-interactions\n // TODO: Support different button configurations for PointerEvents.\n if ((event.buttons & 1) === 0)\n {\n onDragPointerUp(event);\n return;\n }\n\n if (event.button !== -1 || !event.isPrimary) { return; }\n\n event.preventDefault();\n\n // Only set store dragging on first move event.\n if (!dragging && typeof storeDragging?.set === 'function')\n {\n dragging = true;\n storeDragging.set(true);\n }\n\n /** @type {number} */\n const newLeft = initialPosition.left + (event.clientX - initialDragPoint.x);\n /** @type {number} */\n const newTop = initialPosition.top + (event.clientY - initialDragPoint.y);\n\n if (ease)\n {\n quickTo(newTop, newLeft);\n }\n else\n {\n s_POSITION_DATA.left = newLeft;\n s_POSITION_DATA.top = newTop;\n\n position.set(s_POSITION_DATA);\n }\n }\n\n /**\n * Finish dragging and set the final position and removing listeners.\n *\n * @param {PointerEvent} event - The pointer up event.\n */\n function onDragPointerUp(event)\n {\n event.preventDefault();\n\n dragging = false;\n if (typeof storeDragging?.set === 'function') { storeDragging.set(false); }\n\n node.removeEventListener(...handlers.dragMove);\n node.removeEventListener(...handlers.dragUp);\n }\n\n return {\n // The default of active being true won't automatically add listeners twice.\n update: (options) =>\n {\n if (typeof options.active === 'boolean')\n {\n active = options.active;\n if (active) { activateListeners(); }\n else { removeListeners(); }\n }\n\n if (typeof options.button === 'number')\n {\n button = options.button;\n }\n\n if (options.position !== void 0 && options.position !== position)\n {\n position = options.position;\n quickTo = position.animate.quickTo(['top', 'left'], easeOptions);\n }\n\n if (typeof options.ease === 'boolean') { ease = options.ease; }\n\n if (isObject(options.easeOptions))\n {\n easeOptions = options.easeOptions;\n quickTo.options(easeOptions);\n }\n\n if (options.hasTargetClassList !== void 0)\n {\n if (!isIterable(options.hasTargetClassList))\n {\n throw new TypeError(`'hasTargetClassList' is not iterable.`);\n }\n else\n {\n hasTargetClassList = options.hasTargetClassList;\n }\n }\n\n if (options.ignoreTargetClassList !== void 0)\n {\n if (!isIterable(options.ignoreTargetClassList))\n {\n throw new TypeError(`'ignoreTargetClassList' is not iterable.`);\n }\n else\n {\n ignoreTargetClassList = options.ignoreTargetClassList;\n }\n }\n },\n\n destroy: () => removeListeners()\n };\n}\n\nclass DraggableOptions\n{\n #ease = false;\n\n #easeOptions = { duration: 0.1, ease: cubicOut };\n\n /**\n * Stores the subscribers.\n *\n * @type {(function(DraggableOptions): void)[]}\n */\n #subscriptions = [];\n\n constructor({ ease, easeOptions } = {})\n {\n // Define the following getters directly on this instance and make them enumerable. This allows them to be\n // picked up w/ `Object.assign`.\n Object.defineProperty(this, 'ease', {\n get: () => { return this.#ease; },\n set: (newEase) =>\n {\n if (typeof newEase !== 'boolean') { throw new TypeError(`'ease' is not a boolean.`); }\n\n this.#ease = newEase;\n this.#updateSubscribers();\n },\n enumerable: true\n });\n\n Object.defineProperty(this, 'easeOptions', {\n get: () => { return this.#easeOptions; },\n set: (newEaseOptions) =>\n {\n if (newEaseOptions === null || typeof newEaseOptions !== 'object')\n {\n throw new TypeError(`'easeOptions' is not an object.`);\n }\n\n if (newEaseOptions.duration !== void 0)\n {\n if (!Number.isFinite(newEaseOptions.duration))\n {\n throw new TypeError(`'easeOptions.duration' is not a finite number.`);\n }\n\n if (newEaseOptions.duration < 0) { throw new Error(`'easeOptions.duration' is less than 0.`); }\n\n this.#easeOptions.duration = newEaseOptions.duration;\n }\n\n if (newEaseOptions.ease !== void 0)\n {\n if (typeof newEaseOptions.ease !== 'function' && typeof newEaseOptions.ease !== 'string')\n {\n throw new TypeError(`'easeOptions.ease' is not a function or string.`);\n }\n\n this.#easeOptions.ease = newEaseOptions.ease;\n }\n\n this.#updateSubscribers();\n },\n enumerable: true\n });\n\n // Set default options.\n if (ease !== void 0) { this.ease = ease; }\n if (easeOptions !== void 0) { this.easeOptions = easeOptions; }\n }\n\n\n /**\n * @returns {number} Get ease duration\n */\n get easeDuration() { return this.#easeOptions.duration; }\n\n /**\n * @returns {string|Function} Get easing function value.\n */\n get easeValue() { return this.#easeOptions.ease; }\n\n\n /**\n * @param {number} duration - Set ease duration.\n */\n set easeDuration(duration)\n {\n if (!Number.isFinite(duration))\n {\n throw new TypeError(`'duration' is not a finite number.`);\n }\n\n if (duration < 0) { throw new Error(`'duration' is less than 0.`); }\n\n this.#easeOptions.duration = duration;\n this.#updateSubscribers();\n }\n\n /**\n * @param {string|Function} value - Get easing function value.\n */\n set easeValue(value)\n {\n if (typeof value !== 'function' && typeof value !== 'string')\n {\n throw new TypeError(`'value' is not a function or string.`);\n }\n\n this.#easeOptions.ease = value;\n this.#updateSubscribers();\n }\n\n /**\n * Resets all options data to default values.\n */\n reset()\n {\n this.#ease = false;\n this.#easeOptions = { duration: 0.1, ease: cubicOut };\n this.#updateSubscribers();\n }\n\n /**\n * Resets easing options to default values.\n */\n resetEase()\n {\n this.#easeOptions = { duration: 0.1, ease: cubicOut };\n this.#updateSubscribers();\n }\n\n /**\n *\n * @param {function(DraggableOptions): void} handler - Callback function that is invoked on update / changes.\n * Receives the DraggableOptions object / instance.\n *\n * @returns {(function(): void)} Unsubscribe function.\n */\n subscribe(handler)\n {\n this.#subscriptions.push(handler); // add handler to the array of subscribers\n\n handler(this); // call handler with current value\n\n // Return unsubscribe function.\n return () =>\n {\n const index = this.#subscriptions.findIndex((sub) => sub === handler);\n if (index >= 0) { this.#subscriptions.splice(index, 1); }\n };\n }\n\n #updateSubscribers()\n {\n const subscriptions = this.#subscriptions;\n\n // Early out if there are no subscribers.\n if (subscriptions.length > 0)\n {\n for (let cntr = 0; cntr < subscriptions.length; cntr++) { subscriptions[cntr](this); }\n }\n }\n}\n\n/**\n * Define a function to get a DraggableOptions instance.\n *\n * @param {{ ease?: boolean, easeOptions?: object }} options - Draggable options.\n *\n * @returns {DraggableOptions} A new options instance.\n */\ndraggable.options = (options) => new DraggableOptions(options);\n\n/**\n * Used for direct call to `position.set`.\n *\n * @type {{top: number, left: number}}\n */\nconst s_POSITION_DATA = { left: 0, top: 0 };\n\nexport { alwaysBlur, applyPosition, applyScrolltop, applyStyles, autoBlur, draggable, isFocused, keyforward, resizeObserver };\n//# sourceMappingURL=index.js.map\n","import { linear } from 'svelte/easing';\nimport { lerp } from '@typhonjs-fvtt/runtime/svelte/math';\nimport { fade, slide } from 'svelte/transition';\n\n/**\n * Provides a rotate transition. For options `easing` is applied to to the rotate transition. The default easing is\n * linear.\n *\n * Note: that when reversing the transition that time goes from `1 - 0`, so if specific options are applied for\n * rotating out transition then `end` and `initial` are swapped.\n *\n * @param {HTMLElement} node - The transition node.\n *\n * @param {object} options - Optional parameters.\n *\n * @param {number} [options.delay] - Delay in ms before start of transition.\n *\n * @param {number} [options.duration] - Total transition length in ms.\n *\n * @param {Function} [options.easing=linear] - The easing function to apply to the rotate transition.\n *\n * @param {number} [options.end=0] - End rotation in degrees.\n *\n * @param {number} [options.initial=0] - Initial rotation in degrees.\n *\n * @returns {{duration: number, css: (function(*=): string), delay: number, easing: (x: number) => number}}\n * Transition object.\n */\nfunction rotate(node, options)\n{\n const easingRotate = options.easing ?? linear;\n\n const initialDeg = options.initial ?? 0;\n const endDeg = options.end ?? 0;\n\n return {\n delay: options.delay ?? 0,\n duration: options.duration ?? 500,\n easing: linear,\n css: (t) =>\n {\n const rotateT = easingRotate(t);\n return `transform: rotate(${lerp(initialDeg, endDeg, rotateT)}deg)`;\n }\n };\n}\n\n/**\n * Combines rotate & fade transitions into a single transition. For options `easing` this is applied to both transitions,\n * however if provided `easingRotate` and / or `easingFade` will take precedence. The default easing is linear.\n *\n * Note: that when reversing the transition that time goes from `1 - 0`, so if specific options are applied for\n * rotating out transition then `end` and `initial` are swapped.\n *\n * @param {HTMLElement} node - The transition node.\n *\n * @param {object} options - Optional parameters.\n *\n * @param {number} [options.delay] - Delay in ms before start of transition.\n *\n * @param {number} [options.duration] - Total transition length in ms.\n *\n * @param {Function} [options.easing=linear] - The easing function to apply to both slide & fade transitions.\n *\n * @param {Function} [options.easingFade=linear] - The easing function to apply to the fade transition.\n *\n * @param {Function} [options.easingRotate=linear] - The easing function to apply to the rotate transition.\n *\n * @param {number} [options.end=0] - End rotation in degrees.\n *\n * @param {number} [options.initial=0] - Initial rotation in degrees.\n *\n * @returns {{duration: number, css: (function(*=): string), delay: number, easing: (x: number) => number}}\n * Transition object.\n */\nfunction rotateFade(node, options)\n{\n const easingFade = options.easingFade || options.easing || linear;\n const easingRotate = options.easingRotate || options.easing || linear;\n\n const fadeTransition = fade(node);\n\n const initialDeg = options.initial ?? 0;\n const endDeg = options.end ?? 0;\n\n return {\n delay: options.delay ?? 0,\n duration: options.duration ?? 500,\n easing: linear,\n css: (t) =>\n {\n const fadeT = easingFade(t);\n const rotateT = easingRotate(t);\n\n return `transform: rotate(${lerp(initialDeg, endDeg, rotateT)}deg); ${fadeTransition.css(fadeT, 1 - fadeT)}`;\n }\n };\n}\n\n/**\n * Combines slide & fade transitions into a single transition. For options `easing` this is applied to both transitions,\n * however if provided `easingSlide` and / or `easingFade` will take precedence. The default easing is linear.\n *\n * @param {HTMLElement} node - The transition node.\n *\n * @param {object} options - Optional parameters.\n *\n * @param {number} [options.delay] - Delay in ms before start of transition.\n *\n * @param {number} [options.duration] - Total transition length in ms.\n *\n * @param {Function} [options.easing=linear] - The easing function to apply to both slide & fade transitions.\n *\n * @param {Function} [options.easingFade=linear] - The easing function to apply to the fade transition.\n *\n * @param {Function} [options.easingSlide=linear] - The easing function to apply to the slide transition.\n *\n * @returns {{duration: number, css: (function(*=): string), delay: number, easing: (x: number) => number}}\n * Transition object.\n */\nfunction slideFade(node, options)\n{\n const fadeEasing = options.easingFade || options.easing || linear;\n const slideEasing = options.easingSlide || options.easing || linear;\n\n const fadeTransition = fade(node);\n const slideTransition = slide(node);\n\n return {\n delay: options.delay || 0,\n duration: options.duration || 500,\n easing: linear,\n css: (t) =>\n {\n const fadeT = fadeEasing(t);\n const slideT = slideEasing(t);\n return `${slideTransition.css(slideT, 1 - slideT)}; ${fadeTransition.css(fadeT, 1 - fadeT)}`;\n }\n };\n}\n\n/**\n * Converts a Svelte transition to an animation. Both transitions & animations use the same CSS / styles solution and\n * resulting data so wrap the transition function with the signature of an animation.\n *\n * @param {(node: Element, params?: object) => import('svelte/transition').TransitionConfig} fn -\n * A Svelte transition function.\n *\n * @returns {(node: Element, { from: DOMRect, to: DOMRect }, params?: object) => import('svelte/transition').TransitionConfig} -\n * Transition function converted to an animation.\n */\nfunction toAnimation(fn)\n{\n return (node, animations, params = {}) => fn(node, params);\n}\n\nconst s_DEFAULT_TRANSITION = () => void 0;\nconst s_DEFAULT_TRANSITION_OPTIONS = {};\n\nexport { rotate, rotateFade, s_DEFAULT_TRANSITION, s_DEFAULT_TRANSITION_OPTIONS, slideFade, toAnimation };\n//# sourceMappingURL=index.js.map\n","import { writable } from 'svelte/store';\n\n/**\n * Provides the internal context to all application shells.\n */\nexport class AppShellContextInternal\n{\n /** @type {InternalAppStores} */\n #stores;\n\n constructor()\n {\n this.#stores = {\n elementContent: writable(void 0),\n elementRoot: writable(void 0)\n };\n\n Object.freeze(this.#stores);\n Object.seal(this);\n }\n\n /**\n * @returns {InternalAppStores} The internal context stores for elementContent / elementRoot\n */\n get stores()\n {\n return this.#stores;\n }\n}\n\n/**\n * @typedef {object} InternalAppStores\n *\n * @property {import('svelte/store').Writable<HTMLElement>} elementContent - The window content element.\n *\n * @property {import('svelte/store').Writable<HTMLElement>} elementRoot - The window root element.\n */\n","/**\n * A helper to create a set of radio checkbox input elements in a named set.\n * The provided keys are the possible radio values while the provided values are human readable labels.\n *\n * @param {string} name The radio checkbox field name\n *\n * @param {object} choices A mapping of radio checkbox values to human readable labels\n *\n * @param {object} options Options which customize the radio boxes creation\n *\n * @param {string} options.checked Which key is currently checked?\n *\n * @param {boolean} options.localize Pass each label through string localization?\n *\n * @returns {string} HTML for radio boxes.\n *\n * @example <caption>The provided input data</caption>\n * let groupName = \"importantChoice\";\n * let choices = {a: \"Choice A\", b: \"Choice B\"};\n * let chosen = \"a\";\n *\n * @example <caption>The template HTML structure</caption>\n * <div class=\"form-group\">\n * <label>Radio Group Label</label>\n * <div class=\"form-fields\">\n * {@html radioBoxes(groupName, choices, { checked: chosen, localize: true})}\n * </div>\n * </div>\n */\nfunction radioBoxes(name, choices, options)\n{\n const checked = options['checked'] || null;\n\n const localize = options['localize'] || false;\n\n let html = '';\n\n for (let [key, label] of Object.entries(choices)) // eslint-disable-line prefer-const\n {\n if (localize) { label = globalThis.game.i18n.localize(label); }\n const isChecked = checked === key;\n html += `<label class=\"checkbox\"><input type=\"radio\" name=\"${name}\" value=\"${key}\" ${isChecked ? \"checked\" : \"\"}> ${label}</label>`;\n }\n\n return new globalThis.Handlebars.SafeString(html);\n}\n\n/**\n * Converts the `selectOptions` Handlebars helper to be Svelte compatible. This is useful when initially converting\n * over an app to Svelte and for essential usage to several dialogs that mirror the core Foundry experience. For\n * an example of usage see {@link TJSDocumentOwnership}.\n *\n * A helper to create a set of <option> elements in a <select> block based on a provided dictionary.\n * The provided keys are the option values while the provided values are human-readable labels.\n * This helper supports both single-select as well as multi-select input fields.\n *\n * @param {object} choices A mapping of radio checkbox values to human readable labels\n *\n * @param {object} options Helper options\n *\n * @param {string|string[]} [options.selected] Which key or array of keys that are currently selected?\n *\n * @param {boolean} [options.localize=false] Pass each label through string localization?\n *\n * @param {string} [options.blank] Add a blank option as the first option with this label\n *\n * @param {string} [options.nameAttr] Look up a property in the choice object values to use as the option value\n *\n * @param {string} [options.labelAttr] Look up a property in the choice object values to use as the option label\n *\n * @param {boolean} [options.inverted=false] Use the choice object value as the option value, and the key as the label\n * instead of vice-versa\n *\n * @returns {string} The <options> HTML element(s).\n *\n * @example <caption>The provided input data</caption>\n * let choices = {a: 'Choice A', b: 'Choice B'};\n * let value = 'a';\n *\n * @example <caption>The template HTML structure</caption>\n * <select name=\"importantChoice\">\n * {@html selectOptions(choices { selected: value, localize: true })}\n * </select>\n *\n * @example <caption>The resulting HTML</caption>\n * <select name=\"importantChoice\">\n * <option value=\"a\" selected>Choice A</option>\n * <option value=\"b\">Choice B</option>\n * </select>\n *\n * @example <caption>Using inverted</caption>\n * let choices = {'Choice A': 'a', 'Choice B': 'b'};\n * let value = 'a';\n *\n * @example <caption>The template HTML structure</caption>\n * <select name=\"importantChoice\">\n * {@html selectOptions(choices, { selected: value, inverted: true })}\n * </select>\n *\n * @example <caption>Using nameAttr and labelAttr with objects</caption>\n * let choices = {foo: {key: 'a', label: 'Choice A'}, bar: {key: 'b', label: 'Choice B'}};\n * let value = 'b';\n *\n * @example <caption>The template HTML structure</caption>\n * <select name=\"importantChoice\">\n * {@html selectOptions(choices, { selected: value, nameAttr: 'key', labelAttr: 'label' })}\n * </select>\n *\n * @example <caption>Using nameAttr and labelAttr with arrays</caption>\n * let choices = [{key: 'a', label: 'Choice A'}, {key: 'b', label: 'Choice B'}];\n * let value = 'b';\n *\n * @example <caption>The template HTML structure</caption>\n * <select name=\"importantChoice\">\n * {@html selectOptions(choices, { selected: value, nameAttr: 'key', labelAttr: 'label' })}\n * </select>\n */\nfunction selectOptions(choices, options)\n{\n const { localize = false, blank = null, sort = false, nameAttr, labelAttr, inverted } = options;\n let { selected = null } = options;\n\n selected = selected instanceof Array ? selected.map(String) : [String(selected)];\n\n // Prepare the choices as an array of objects\n const selectChoices = [];\n\n if (choices instanceof Array)\n {\n for (const choice of choices)\n {\n const name = String(choice[nameAttr]);\n let label = choice[labelAttr];\n if (localize) { label = globalThis.game.i18n.localize(label); }\n selectChoices.push({ name, label });\n }\n }\n else\n {\n for (const choice of Object.entries(choices))\n {\n const [key, value] = inverted ? choice.reverse() : choice;\n const name = String(nameAttr ? value[nameAttr] : key);\n let label = labelAttr ? value[labelAttr] : value;\n if (localize) { label = globalThis.game.i18n.localize(label); }\n selectChoices.push({ name, label });\n }\n }\n\n // Sort the array of options\n if (sort) { selectChoices.sort((a, b) => a.label.localeCompare(b.label)); }\n\n // Prepend a blank option\n if (blank !== null)\n {\n const label = localize ? globalThis.game.i18n.localize(blank) : blank;\n selectChoices.unshift({ name: '', label });\n }\n\n // Create the HTML\n let html = '';\n for (const option of selectChoices)\n {\n const label = globalThis.Handlebars.escapeExpression(option.label);\n const isSelected = selected.includes(option.name);\n html += `<option value=\"${option.name}\" ${isSelected ? \"selected\" : \"\"}>${label}</option>`;\n }\n\n return new globalThis.Handlebars.SafeString(html);\n}\n\n/**\n * Localize a string including variable formatting for input arguments. Provide a string ID which defines the localized\n * template. Variables can be included in the template enclosed in braces and will be substituted using those named\n * keys.\n *\n * @param {string} stringId - The string ID to translate.\n *\n * @param {object} [data] - Provided input data.\n *\n * @returns {string} The translated and formatted string\n */\nfunction localize(stringId, data)\n{\n const result = typeof data !== 'object' ? globalThis.game.i18n.localize(stringId) :\n globalThis.game.i18n.format(stringId, data);\n\n return result !== void 0 ? result : '';\n}\n\nexport { localize, radioBoxes, selectOptions };\n//# sourceMappingURL=index.js.map\n","<script>\n /**\n * Provides an app header button conforming to the Foundry {@link ApplicationHeaderButton} type. Additionally, a\n * `title` field is supported to give a tool tip for the button. For backward compatibility `onclick` is supported,\n * but for uniformity across TRL defining an `onPress` function is recommended. If defined it is invoked when\n * the button is clicked or `Enter` key pressed and state is updated accordingly.\n *\n * TRL also supports the following extra button data:\n * - {keyCode='Enter'} keyCode: A string conforming to `KeyboardEvent.code` to activate `onPress` callback.\n * - {keepMinimized=false} keepMinimized: When true the button is not removed when app minimized.\n * - {Function} onContextMenu: Invoked when right mouse button or contextmenu key is pressed.\n * - {Function} onPress: Invoked when left mouse button or `keyCode` key is pressed.\n * - {Record<string, string>} styles: Additional inline styles to apply to button.\n * - {string} title: Tooltip title.\n */\n import { applyStyles } from '@typhonjs-fvtt/runtime/svelte/action';\n import { localize } from '@typhonjs-fvtt/runtime/svelte/helper';\n import { isObject } from '@typhonjs-fvtt/runtime/svelte/util';\n\n export let button = void 0;\n\n const s_REGEX_HTML = /^\\s*<.*>$/;\n\n $: title = isObject(button) && typeof button.title === 'string' ? localize(button.title) : '';\n\n // Handle icon and treat bare strings as the icon class; otherwise assume the icon is fully formed HTML.\n $: icon = isObject(button) && typeof button.icon !== 'string' ? void 0 : s_REGEX_HTML.test(button.icon) ?\n button.icon : `<i class=\"${button.icon}\" title=\"${title}\"></i>`;\n\n $: label = isObject(button) && typeof button.label === 'string' ? localize(button.label) : void 0;\n\n $: keepMinimized = isObject(button) && typeof button.keepMinimized === 'boolean' ? button.keepMinimized : false;\n\n $: keyCode = isObject(button) && typeof button.keyCode === 'string' ? button.keyCode : 'Enter';\n\n $: styles = isObject(button) && isObject(button.styles) ? button.styles : void 0;\n\n function onClick(event)\n {\n // Accept `onPress or `onclick` as the function / data to invoke.\n const invoke = button?.onPress ?? button?.onclick;\n\n if (typeof invoke === 'function')\n {\n invoke.call(button, event);\n button = button; // This provides a reactive update if button data changes.\n }\n }\n\n function onContextMenu(event)\n {\n // Accept `onContextMenu` as the function / data to invoke.\n const invoke = button?.onContextMenu;\n\n if (typeof invoke === 'function')\n {\n invoke.call(button, event);\n button = button; // This provides a reactive update if button data changes.\n }\n }\n\n /**\n * Consume / stop propagation of key down when key codes match.\n *\n * @param {KeyboardEvent} event -\n */\n function onKeydown(event)\n {\n if (event.code === keyCode)\n {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n /**\n * Handle press event if key codes match.\n *\n * @param {KeyboardEvent} event -\n */\n function onKeyup(event)\n {\n if (event.code === keyCode)\n {\n const invoke = button.onPress ?? button.onclick;\n\n if (typeof invoke === 'function')\n {\n invoke.call(button, event);\n button = button; // This provides a reactive update if button data changes.\n }\n\n event.preventDefault();\n event.stopPropagation();\n }\n }\n</script>\n\n<svelte:options accessors={true}/>\n\n<!-- svelte-ignore a11y-missing-attribute -->\n<a on:click|preventDefault|stopPropagation={onClick}\n on:contextmenu|preventDefault|stopPropagation={onContextMenu}\n on:keydown={onKeydown}\n on:keyup={onKeyup}\n use:applyStyles={styles}\n class=\"header-button {button.class}\"\n class:keep-minimized={keepMinimized}\n aria-label={label}\n tabindex=0\n role=button>\n {@html icon}{#if label}<span class:has-icon={icon !== void 0}>{label}</span>{/if}\n</a>\n\n<style>\n a {\n padding: var(--tjs-app-header-button-padding, 0 3px);\n }\n\n a :global(i) {\n padding: var(--tjs-app-header-button-icon-padding, 0);\n }\n\n a:hover {\n text-shadow: var(--tjs-app-header-button-text-shadow-hover, var(--tjs-default-text-shadow-focus-hover, inherit));\n }\n\n a:focus-visible {\n box-shadow: var(--tjs-app-header-button-box-shadow-focus-visible, var(--tjs-default-box-shadow-focus-visible));\n outline: var(--tjs-app-header-button-outline-focus-visible, var(--tjs-default-outline-focus-visible, revert));\n transition: var(--tjs-app-header-button-transition-focus-visible, var(--tjs-default-transition-focus-visible));\n text-shadow: var(--tjs-app-header-button-text-shadow-focus-visible, var(--tjs-default-text-shadow-focus-hover, inherit));\n }\n\n span {\n padding: var(--tjs-app-header-button-label-padding, 0);\n }\n\n span.has-icon {\n padding: var(--tjs-app-header-button-label-padding, 0 0 0 3px);\n }\n</style>\n","<script>\n import { getContext } from 'svelte';\n import { cubicOut } from 'svelte/easing';\n\n import {\n draggable as dragDefault } from '@typhonjs-fvtt/runtime/svelte/action';\n\n import { localize } from '@typhonjs-fvtt/runtime/svelte/helper';\n\n import {\n isObject,\n isSvelteComponent } from '@typhonjs-fvtt/runtime/svelte/util';\n\n import TJSHeaderButton from './TJSHeaderButton.svelte';\n\n export let draggable = void 0;\n export let draggableOptions = void 0;\n\n const { application } = getContext('#external');\n\n // Focus related app options stores.\n const { focusAuto, focusKeep } = application.reactive.storeAppOptions;\n\n const { elementRoot } = getContext('#internal').stores;\n\n const storeTitle = application.reactive.storeAppOptions.title;\n const storeDraggable = application.reactive.storeAppOptions.draggable;\n const storeDragging = application.reactive.storeUIState.dragging;\n const storeHeaderButtons = application.reactive.storeUIState.headerButtons;\n const storeHeaderIcon = application.reactive.storeAppOptions.headerIcon;\n const storeHeaderNoTitleMinimized = application.reactive.storeAppOptions.headerNoTitleMinimized;\n const storeMinimizable = application.reactive.storeAppOptions.minimizable;\n const storeMinimized = application.reactive.storeUIState.minimized;\n\n // These classes in the window header allow dragging.\n const s_DRAG_TARGET_CLASSLIST = Object.freeze(['tjs-app-icon', 'tjs-window-header-spacer',\n 'window-header', 'window-title']);\n\n let dragOptions;\n\n $: draggable = typeof draggable === 'function' ? draggable : dragDefault;\n\n // Combines external options with defaults for TJSApplicationHeader. By default, easing is turned on w/ duration of\n // 0.08 seconds and cubicOut, but can be overridden by any provided `draggableOptions`. `position`, `active`, and\n // `storeDragging` are always overridden by application position / stores.\n $: dragOptions = Object.assign({}, { ease: true, easeOptions: { duration: 0.08, ease: cubicOut } },\n isObject(draggableOptions) ? draggableOptions : {}, { position: application.position, active:\n $storeDraggable, storeDragging, hasTargetClassList: s_DRAG_TARGET_CLASSLIST });\n\n let displayHeaderTitle;\n\n $: displayHeaderTitle = $storeHeaderNoTitleMinimized && $storeMinimized ? 'none' : null;\n\n let buttonsLeft;\n let buttonsRight;\n\n $:\n {\n buttonsLeft = [];\n buttonsRight = [];\n\n for (const button of $storeHeaderButtons)\n {\n const buttonsList = typeof button?.alignLeft === 'boolean' && button?.alignLeft ? buttonsLeft : buttonsRight;\n\n // If the button is a Svelte component set it as the class otherwise use `TJSHeaderButton` w/ button as props.\n buttonsList.push(isSvelteComponent(button) ? { class: button, props: {} } :\n { class: TJSHeaderButton, props: { button } });\n }\n }\n\n function minimizable(node, booleanStore)\n {\n const callback = (event) =>\n {\n // Only toggle minimize state if window title or header is the event target. Also allow toggle state if the\n // event target has 'keep-minimized' class.\n if (event.target.classList.contains('window-title') || event.target.classList.contains('window-header') ||\n event.target.classList.contains('keep-minimized'))\n {\n application._onToggleMinimize(event);\n }\n }\n\n function activateListeners() { node.addEventListener('dblclick', callback); }\n function removeListeners() { node.removeEventListener('dblclick', callback); }\n\n if (booleanStore) { activateListeners(); }\n\n return {\n update: (booleanStore) => // eslint-disable-line no-shadow\n {\n if (booleanStore) { activateListeners(); }\n else { removeListeners(); }\n },\n\n destroy: () => removeListeners()\n };\n }\n\n /**\n * Explicitly focus `elementRoot` if pointer event is not consumed by header buttons / components. This allows\n * keyboard tab navigation to select header buttons.\n *\n * Note: if `focusKeep` app option store is set to true `elementRoot` is only focused if the current browser wide\n * active element is not contained inside the app element.\n */\n function onPointerdown(event)\n {\n const rootEl = $elementRoot;\n\n if ($focusAuto && rootEl instanceof HTMLElement && rootEl?.isConnected)\n {\n if ($focusKeep)\n {\n const focusOutside = document.activeElement instanceof HTMLElement &&\n !rootEl.contains(document.activeElement);\n\n // Only focus the content element if the active element is outside the app; maintaining internal focused\n // element.\n if (focusOutside)\n {\n rootEl.focus();\n }\n else\n {\n event.preventDefault();\n }\n }\n else\n {\n rootEl.focus();\n }\n }\n }\n</script>\n\n{#key draggable}\n <header class=\"window-header flexrow\"\n use:draggable={dragOptions}\n use:minimizable={$storeMinimizable}\n on:pointerdown={onPointerdown}>\n {#if typeof $storeHeaderIcon === 'string'}\n <img class=\"tjs-app-icon keep-minimized\" src={$storeHeaderIcon} alt=icon>\n {/if}\n <h4 class=window-title style:display={displayHeaderTitle}>\n {localize($storeTitle)}\n </h4>\n {#each buttonsLeft as button}\n <svelte:component this={button.class} {...button.props} />\n {/each}\n <span class=\"tjs-window-header-spacer keep-minimized\" />\n {#each buttonsRight as button}\n <svelte:component this={button.class} {...button.props} />\n {/each}\n </header>\n{/key}\n\n<style>\n /**\n * Provides a zero space element that expands to the right creating the gap between window title and left aligned\n * buttons and right aligned buttons. Note the use of a negative left margin to remove the gap between elements.\n */\n .tjs-window-header-spacer {\n flex: 0;\n margin-left: calc(-1 * var(--tjs-app-header-gap, 5px));\n margin-right: auto;\n }\n\n .window-header {\n flex: var(--tjs-app-header-flex, 0 0 30px);\n gap: var(--tjs-app-header-gap, 5px);\n padding: var(--tjs-app-header-padding, 0 4px);\n }\n\n .window-header .tjs-app-icon {\n align-self: center;\n border-radius: var(--tjs-app-header-icon-border-radius, 4px);\n flex: 0 0 var(--tjs-app-header-icon-width, 24px);\n height: var(--tjs-app-header-icon-height, 24px);\n }\n\n .window-title {\n gap: var(--tjs-app-header-gap, 5px);\n max-width: fit-content;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n</style>\n","<script>\n import { A11yHelper } from '@typhonjs-fvtt/runtime/svelte/util';\n\n /** @type {HTMLElement} */\n export let elementRoot = void 0;\n\n /** @type {boolean} */\n export let enabled = true;\n\n let ignoreElements, wrapEl;\n\n $: if (wrapEl) { ignoreElements = new Set([wrapEl]); }\n\n function onFocus()\n {\n // Early out if not enabled.\n if (!enabled) { return; }\n\n if (elementRoot instanceof HTMLElement)\n {\n const firstFocusEl = A11yHelper.getFirstFocusableElement(elementRoot, ignoreElements);\n\n if (firstFocusEl instanceof HTMLElement && firstFocusEl !== wrapEl)\n {\n firstFocusEl.focus();\n }\n else\n {\n // No focus target found, so focus elementRoot.\n elementRoot.focus();\n }\n }\n }\n</script>\n\n<!-- svelte-ignore a11y-no-noninteractive-tabindex -->\n<div bind:this={wrapEl} class=tjs-focus-wrap tabindex=0 on:focus={onFocus} />\n\n<style>\n div {\n width: 0;\n height: 0;\n flex: 0;\n }\n\n div:focus {\n outline: none;\n }\n</style>\n","<script>\n import { getContext } from 'svelte';\n\n export let isResizable = false;\n\n const application = getContext('#external').application;\n\n // Allows retrieval of the element root at runtime.\n const storeElementRoot = getContext('storeElementRoot');\n\n const storeResizable = application.reactive.storeAppOptions.resizable;\n\n const storeMinimized = application.reactive.storeUIState.minimized;\n const storeResizing = application.reactive.storeUIState.resizing;\n\n let elementResize;\n\n $: if (elementResize)\n {\n // Instead of creating a derived store it is easier to use isResizable and the minimized store below.\n elementResize.style.display = isResizable && !$storeMinimized ? 'block' : 'none';\n\n // Add / remove `resizable` class from element root.\n const elementRoot = $storeElementRoot;\n if (elementRoot) { elementRoot.classList[isResizable ? 'add' : 'remove']('resizable'); }\n }\n\n /**\n * Provides an action to handle resizing the application shell based on the resizable app option.\n *\n * @param {HTMLElement} node - The node associated with the action.\n *\n * @param {object} [opts] - Optional parameters.\n *\n * @param {boolean} [opts.active=true] - A boolean value; attached to a readable store.\n *\n * @param {Writable<boolean>} [opts.storeResizing] - A writable store that tracks \"resizing\" state.\n *\n * @returns {{update: Function, destroy: Function}} The action lifecycle methods.\n */\n function resizable(node, { active = true, storeResizing = void 0 } = {})\n {\n /**\n * Duplicate the app / Positionable starting position to track differences.\n *\n * @type {object}\n */\n let position = null;\n\n /**\n * Stores the initial X / Y on drag down.\n *\n * @type {object}\n */\n let initialPosition = {};\n\n /**\n * Stores the current resizing state and gates the move pointer as the resizing store is not\n * set until the first pointer move.\n *\n * @type {boolean}\n */\n let resizing = false;\n\n /**\n * Remember event handlers associated with this action so they may be later unregistered.\n *\n * @type {Object}\n */\n const handlers = {\n resizeDown: ['pointerdown', (e) => onResizePointerDown(e), false],\n resizeMove: ['pointermove', (e) => onResizePointerMove(e), false],\n resizeUp: ['pointerup', (e) => onResizePointerUp(e), false]\n };\n\n /**\n * Activates listeners.\n */\n function activateListeners()\n {\n // Resize handlers\n node.addEventListener(...handlers.resizeDown);\n\n isResizable = true;\n\n node.style.display = 'block';\n }\n\n /**\n * Removes listeners.\n */\n function removeListeners()\n {\n if (typeof storeResizing?.set === 'function') { storeResizing.set(false); }\n\n // Resize handlers\n node.removeEventListener(...handlers.resizeDown);\n node.removeEventListener(...handlers.resizeMove);\n node.removeEventListener(...handlers.resizeUp);\n\n node.style.display = 'none';\n\n isResizable = false;\n }\n\n // On mount if resizable is true then activate listeners otherwise set element display to `none`.\n if (active)\n {\n activateListeners();\n }\n else\n {\n node.style.display = 'none';\n }\n\n /**\n * Handle the initial pointer down that activates resizing capture.\n */\n function onResizePointerDown(event)\n {\n event.preventDefault();\n\n resizing = false;\n\n // Record initial position\n position = application.position.get();\n\n if (position.height === 'auto') { position.height = $storeElementRoot.clientHeight; }\n if (position.width === 'auto') { position.width = $storeElementRoot.clientWidth; }\n\n initialPosition = { x: event.clientX, y: event.clientY };\n\n // Add temporary handlers\n node.addEventListener(...handlers.resizeMove);\n node.addEventListener(...handlers.resizeUp);\n\n node.setPointerCapture(event.pointerId);\n }\n\n /**\n * Sets the width / height of the positionable application.\n */\n function onResizePointerMove(event)\n {\n event.preventDefault();\n\n if (!resizing && typeof storeResizing?.set === 'function')\n {\n resizing = true;\n storeResizing.set(true);\n }\n\n application.position.set({\n width: position.width + (event.clientX - initialPosition.x),\n height: position.height + (event.clientY - initialPosition.y)\n });\n }\n\n /**\n * Conclude the dragging behavior when the pointer is released setting the final position and\n * removing listeners.\n */\n function onResizePointerUp(event)\n {\n resizing = false;\n if (typeof storeResizing?.set === 'function') { storeResizing.set(false); }\n\n event.preventDefault();\n node.removeEventListener(...handlers.resizeMove);\n node.removeEventListener(...handlers.resizeUp);\n\n application._onResize(event);\n }\n\n return {\n update: ({ active }) => // eslint-disable-line no-shadow\n {\n if (active) { activateListeners(); }\n else { removeListeners(); }\n },\n\n destroy: () => removeListeners()\n };\n }\n\n</script>\n\n<div class=\"window-resizable-handle\"\n use:resizable={{active: $storeResizable, storeResizing}}\n bind:this={elementResize}>\n <i class=\"fas fa-arrows-alt-h\"></i>\n</div>\n","<script>\n /**\n * Provides an application shell is a main top level slotted component that provides a reactive\n * outer wrapper and header bar for the main content component.\n */\n\n import {\n getContext,\n onMount,\n setContext } from 'svelte';\n\n import {\n applyStyles,\n resizeObserver } from '@typhonjs-fvtt/runtime/svelte/action';\n\n import {\n A11yHelper,\n isObject } from '@typhonjs-fvtt/runtime/svelte/util';\n\n import { AppShellContextInternal } from './AppShellContextInternal.js';\n import TJSApplicationHeader from './TJSApplicationHeader.svelte';\n import TJSFocusWrap from './TJSFocusWrap.svelte';\n import ResizableHandle from './ResizableHandle.svelte';\n\n import {\n s_DEFAULT_TRANSITION_OPTIONS } from '@typhonjs-fvtt/runtime/svelte/transition';\n\n // Bound to the content and root elements. Can be used by parent components. SvelteApplication will also\n // use 'elementRoot' to set the element of the Application. You can also provide `elementContent` and\n // `elementTarget`. Please see SvelteApplication lifecycle documentation.\n export let elementContent = void 0;\n export let elementRoot = void 0;\n\n // Allows custom draggable implementations to be forwarded to TJSApplicationHeader.\n export let draggable = void 0;\n export let draggableOptions = void 0;\n\n // The children array can be specified by a parent via prop or is read below from the external context.\n // export let children = void 0;\n\n // Explicit style overrides for the main app and content elements. Uses action `applyStyles`.\n export let stylesApp = void 0;\n export let stylesContent = void 0;\n\n // If a parent component binds and sets `appOffsetHeight` to true then a resizeObserver action is enabled on the\n // outer application `div`. Additionally, the SvelteApplication position resizeObserved store is updated.\n export let appOffsetHeight = false;\n export let appOffsetWidth = false;\n\n // Set to `resizeObserver` if either of the above props are truthy otherwise a null operation.\n const appResizeObserver = !!appOffsetHeight || !!appOffsetWidth ? resizeObserver : () => null;\n\n // If a parent component binds and sets `contentOffsetHeight` or `contentOffsetWidth` to true then a\n // resizeObserver action is enabled on the content `section`.\n export let contentOffsetHeight = false;\n export let contentOffsetWidth = false;\n\n // Set to `resizeObserver` if either of the above props are truthy otherwise a null operation.\n const contentResizeObserver = !!contentOffsetHeight || !!contentOffsetWidth ? resizeObserver : () => null;\n\n // Provides the internal context for data / stores of the application shell.\n const internal = new AppShellContextInternal();\n\n // Provides options to `A11yHelper.getFocusableElements` to ignore TJSFocusWrap by CSS class.\n const s_IGNORE_CLASSES = { ignoreClasses: ['tjs-focus-wrap'] };\n\n // Internal context for `elementContent` / `elementRoot` stores.\n setContext('#internal', internal);\n\n // Only update the `elementContent` store if the new `elementContent` is not null or undefined.\n $: if (elementContent !== void 0 && elementContent !== null)\n {\n getContext('#internal').stores.elementContent.set(elementContent);\n }\n\n // Only update the `elementRoot` store if the new `elementRoot` is not null or undefined.\n $: if (elementRoot !== void 0 && elementRoot !== null)\n {\n getContext('#internal').stores.elementRoot.set(elementRoot);\n }\n\n // Store application reference.\n const { application } = getContext('#external');\n\n // Focus related app options stores.\n const { focusAuto, focusKeep, focusTrap } = application.reactive.storeAppOptions;\n\n const { minimized } = application.reactive.storeUIState;\n\n let focusWrapEnabled;\n\n // Enable TJSFocusWrap component when focus trapping app option is true and app is not minimized.\n $: focusWrapEnabled = $focusAuto && $focusTrap && !$minimized;\n\n // ---------------------------------------------------------------------------------------------------------------\n\n // The following block is somewhat complex, but allows transition options to be updated reactively during\n // runtime execution.\n\n // Exports properties to set a transition w/ in / out options.\n export let transition = void 0;\n export let inTransition = void 0;\n export let outTransition = void 0;\n\n // Exports properties to set options for any transitions.\n export let transitionOptions = void 0;\n export let inTransitionOptions = s_DEFAULT_TRANSITION_OPTIONS;\n export let outTransitionOptions = s_DEFAULT_TRANSITION_OPTIONS;\n\n // Tracks last transition state.\n let oldTransition = void 0;\n let oldTransitionOptions = void 0\n\n // Run this reactive block when the last transition state is not equal to the current state.\n $: if (oldTransition !== transition)\n {\n // If transition is defined and not the default transition then set it to both in and out transition otherwise\n // set the default transition to both in & out transitions.\n const newTransition = typeof transition === 'function' ? transition : void 0;\n\n inTransition = newTransition;\n outTransition = newTransition;\n\n oldTransition = newTransition;\n }\n\n // Run this reactive block when the last transition options state is not equal to the current options state.\n $: if (oldTransitionOptions !== transitionOptions)\n {\n const newOptions = transitionOptions !== s_DEFAULT_TRANSITION_OPTIONS && isObject(transitionOptions) ?\n transitionOptions : s_DEFAULT_TRANSITION_OPTIONS;\n\n inTransitionOptions = newOptions;\n outTransitionOptions = newOptions;\n\n oldTransitionOptions = newOptions;\n }\n\n // Handle cases if inTransition is unset; assign noop default transition function.\n $: if (typeof inTransition !== 'function') { inTransition = void 0; }\n\n $:\n {\n // Handle cases if outTransition is unset; assign noop default transition function.\n if (typeof outTransition !== 'function') { outTransition = void 0; }\n\n // Set jquery close animation to either run or not when an out transition is changed.\n if (application && typeof application?.options?.defaultCloseAnimation === 'boolean')\n {\n application.options.defaultCloseAnimation = outTransition === void 0;\n }\n }\n\n // Handle cases if inTransitionOptions is unset; assign empty default transition options.\n $: if (typeof inTransitionOptions !== 'object') { inTransitionOptions = s_DEFAULT_TRANSITION_OPTIONS; }\n\n // Handle cases if outTransitionOptions is unset; assign empty default transition options.\n $: if (typeof outTransitionOptions !== 'object') { outTransitionOptions = s_DEFAULT_TRANSITION_OPTIONS; }\n\n // ---------------------------------------------------------------------------------------------------------------\n\n // Focus `elementRoot` on mount to allow keyboard tab navigation of header buttons.\n onMount(() => elementRoot.focus());\n\n // ---------------------------------------------------------------------------------------------------------------\n\n /**\n * Provides a handler for the custom `close:popup` event fired by `svelte-standard` components like TJSMenu. The\n * intention is to handle focus management of a component that is no longer connected in the DOM. If a target element\n * that is the source of the close event is attached attempt to resolve internal focus to the application.\n *\n * @param {CustomEvent} event - A custom event for `close:popup`.\n */\n function onClosePopup(event)\n {\n // Early out as automatic focus management is not enabled.\n if (!$focusAuto) { return; }\n\n const targetEl = event?.detail?.target;\n\n // Early out if there is no target element.\n if (!(targetEl instanceof HTMLElement)) { return; }\n\n // Early out if the target element is focusable as it will gain focus naturally.\n if (A11yHelper.isFocusable(targetEl)) { return; }\n\n const elementRootContains = elementRoot.contains(targetEl);\n\n // First check for if the target is elementRoot or elementContent then fallback to contains checks.\n if (targetEl === elementRoot)\n {\n elementRoot.focus();\n }\n else if (targetEl === elementContent)\n {\n elementContent.focus();\n }\n else if (elementRootContains)\n {\n if (elementContent.contains(targetEl))\n {\n elementContent.focus();\n }\n else\n {\n elementRoot.focus();\n }\n }\n }\n\n /**\n * Provides focus cycling inside the application capturing `<Shift-Tab>` and if `elementRoot` or `firstFocusEl` is\n * the actively focused element then last focusable element is focused skipping `TJSFocusWrap`.\n *\n * Also, if a popout app all key down events will bring this application to the top such that when focus is trapped\n * the app is top most.\n *\n * @param {KeyboardEvent} event - Keyboard Event.\n */\n function onKeydown(event)\n {\n if (focusWrapEnabled && event.shiftKey && event.code === 'Tab')\n {\n // Collect all focusable elements from `elementRoot` and ignore TJSFocusWrap.\n const allFocusable = A11yHelper.getFocusableElements(elementRoot, s_IGNORE_CLASSES);\n\n // Find first and last focusable elements.\n const firstFocusEl = allFocusable.length > 0 ? allFocusable[0] : void 0;\n const lastFocusEl = allFocusable.length > 0 ? allFocusable[allFocusable.length - 1] : void 0;\n\n // Only cycle focus to the last keyboard focusable app element if `elementRoot` or first focusable element\n // is the active element.\n if (elementRoot === document.activeElement || firstFocusEl === document.activeElement)\n {\n if (lastFocusEl instanceof HTMLElement && firstFocusEl !== lastFocusEl) { lastFocusEl.focus(); }\n\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n // Make sure this application is top most when it receives keyboard events.\n if (typeof application?.options?.popOut === 'boolean' && application.options.popOut &&\n application !== globalThis.ui?.activeWindow)\n {\n application.bringToTop.call(application);\n }\n }\n\n /**\n * If the application is a popOut application then when clicked bring to top if not already the Foundry\n * `activeWindow`.\n */\n function onPointerdownApp()\n {\n if (typeof application?.options?.popOut === 'boolean' && application.options.popOut &&\n application !== globalThis.ui?.activeWindow)\n {\n application.bringToTop.call(application);\n }\n }\n\n /**\n * Focus `elementContent` if the event target is not focusable and `focusAuto` is enabled.\n *\n * Note: `focusAuto` is an app option store. This check is a bit tricky as `section.window-content` has a tabindex\n * of '-1', so it is focusable manually.\n */\n function onPointerdownContent(event)\n {\n const focusable = A11yHelper.isFocusable(event.target);\n\n if (!focusable && $focusAuto)\n {\n if ($focusKeep)\n {\n const focusOutside = document.activeElement instanceof HTMLElement &&\n !elementRoot.contains(document.activeElement);\n\n // Only focus the content element if the active element is outside the app; maintaining internal focused\n // element.\n if (focusOutside)\n {\n elementContent.focus();\n }\n else\n {\n event.preventDefault();\n }\n }\n else\n {\n elementContent.focus();\n }\n }\n }\n\n /**\n * Callback for content resizeObserver action. This is enabled when contentOffsetHeight or contentOffsetWidth is\n * bound.\n *\n * @param {number} offsetWidth - Observed offsetWidth.\n *\n * @param {number} offsetHeight - Observed offsetHeight\n */\n function resizeObservedContent(offsetWidth, offsetHeight)\n {\n contentOffsetWidth = offsetWidth;\n contentOffsetHeight = offsetHeight;\n }\n\n /**\n * Callback for app resizeObserver action. This is enabled when appOffsetHeight or appOffsetWidth is\n * bound. Additionally, the Application position resizeObserved store is updated.\n *\n * @param {number} contentWidth - Observed contentWidth.\n * @param {number} contentHeight - Observed contentHeight\n * @param {number} offsetWidth - Observed offsetWidth.\n * @param {number} offsetHeight - Observed offsetHeight\n */\n function resizeObservedApp(offsetWidth, offsetHeight, contentWidth, contentHeight)\n {\n application.position.stores.resizeObserved.update((object) =>\n {\n object.contentWidth = contentWidth;\n object.contentHeight = contentHeight;\n object.offsetWidth = offsetWidth;\n object.offsetHeight = offsetHeight;\n\n return object;\n });\n\n appOffsetHeight = offsetHeight;\n appOffsetWidth = offsetWidth;\n }\n\n /**\n * Transitions can cause side effects. Work around this issue by using an if conditional.\n * Due to timing issues and the onDestroy / outro transitions can cause elementRoot / elementContent to be set to\n * null when swapped dynamically. There is a feature request to allow transition functions to be undefined:\n *\n * @see: https://github.com/sveltejs/svelte/issues/6942\n */\n</script>\n\n<svelte:options accessors={true}/>\n\n{#if inTransition || outTransition}\n <div id={application.id}\n class=\"app window-app {application.options.classes.join(' ')}\"\n data-appid={application.appId}\n bind:this={elementRoot}\n in:inTransition={inTransitionOptions}\n out:outTransition={outTransitionOptions}\n on:close:popup|preventDefault|stopPropagation={onClosePopup}\n on:keydown|capture={onKeydown}\n on:pointerdown={onPointerdownApp}\n use:applyStyles={stylesApp}\n use:appResizeObserver={resizeObservedApp}\n tabindex=-1>\n <TJSApplicationHeader {draggable} {draggableOptions} />\n <section class=window-content\n bind:this={elementContent}\n on:pointerdown={onPointerdownContent}\n use:applyStyles={stylesContent}\n use:contentResizeObserver={resizeObservedContent}\n tabindex=-1>\n <slot />\n </section>\n <ResizableHandle />\n <TJSFocusWrap {elementRoot} />\n </div>\n{:else}\n <div id={application.id}\n class=\"app window-app {application.options.classes.join(' ')}\"\n data-appid={application.appId}\n bind:this={elementRoot}\n on:close:popup|preventDefault|stopPropagation={onClosePopup}\n on:keydown|capture={onKeydown}\n on:pointerdown={onPointerdownApp}\n use:applyStyles={stylesApp}\n use:appResizeObserver={resizeObservedApp}\n tabindex=-1>\n <TJSApplicationHeader {draggable} {draggableOptions} />\n <section class=window-content\n bind:this={elementContent}\n on:pointerdown={onPointerdownContent}\n use:applyStyles={stylesContent}\n use:contentResizeObserver={resizeObservedContent}\n tabindex=-1>\n <slot />\n </section>\n <ResizableHandle />\n <TJSFocusWrap {elementRoot} enabled={focusWrapEnabled} />\n </div>\n{/if}\n\n<style>\n /* Note: this is different than stock Foundry and allows rounded corners from .app core styles */\n .window-app {\n overflow: var(--tjs-app-overflow, hidden);\n }\n\n .window-app:focus-visible {\n outline: var(--tjs-app-outline-focus-visible, var(--tjs-default-a11y-outline-focus-visible, 2px solid transparent));\n }\n\n .window-content:focus-visible {\n outline: var(--tjs-app-content-outline-focus-visible, var(--tjs-default-a11y-outline-focus-visible, 2px solid transparent));\n }\n\n /* Override Foundry default; adjust --tjs-app-header-gap to change gap size */\n .window-app :global(.window-header a) {\n flex: none;\n margin: 0;\n }\n\n /* Override Foundry default; See TJSHeaderButton for CSS variables */\n .window-app :global(.window-header i[class^=fa]) {\n margin: 0\n }\n</style>\n","import { cssVariables } from './cssVariables.js';\n\nexport { default as TJSComponentShell } from './TJSComponentShell.svelte';\nexport { default as TJSContainer } from './TJSContainer.svelte';\nexport { default as TJSGlassPane } from './TJSGlassPane.svelte';\nexport * from './application/index.js';\nexport * from './dialog/index.js';\n\n/**\n * @typedef {object} TransformData\n *\n * @property {Function} transition - A transition applying to both in & out.\n *\n * @property {Function} inTransition - A transition applying to in.\n *\n * @property {Function} outTransition - A transition applying to out.\n *\n * @property {object} transitionOptions - The options config object for in & out transitions.\n *\n * @property {object} inTransitionOptions - The options config object for in transitions.\n *\n * @property {object} outTransitionOptions - The options config object for out transitions.\n */\n\n/**\n * Provides default CSS variables for core components.\n */\ncssVariables.setProperties({\n // Anchor text shadow / header buttons\n '--tjs-default-text-shadow-focus-hover': '0 0 8px var(--color-shadow-primary)',\n\n // TJSApplicationShell app background.\n '--tjs-app-background': `url(\"${globalThis.foundry.utils.getRoute('/ui/denim075.png')}\")`,\n}, false);\n","import { SvelteApplication } from './SvelteApplication.js';\n\nexport * from './SvelteApplication.js';\nexport * from './TJSDialog.js';\n\n// TODO: temporary\nexport * from './position/Position.js';\n\n// Handle `PopOut!` module hooks to allow applications to popout to their own browser window -------------------------\n\nHooks.on('PopOut:loading', (app) =>\n{\n if (app instanceof SvelteApplication) { app.position.enabled = false; }\n});\n\nHooks.on('PopOut:popin', (app) =>\n{\n if (app instanceof SvelteApplication) { app.position.enabled = true; }\n});\n\nHooks.on('PopOut:close', (app) =>\n{\n if (app instanceof SvelteApplication) { app.position.enabled = true; }\n});\n\n/**\n * @typedef {object} MountedAppShell - Application shell contract for Svelte components.\n *\n * @property {HTMLElement} elementRoot - The root element / exported prop.\n *\n * @property {HTMLElement} [elementContent] - The content element / exported prop.\n *\n * @property {HTMLElement} [elementTarget] - The target element / exported prop.\n */\n\n/**\n * @typedef {ApplicationShell} ApplicationShellExt\n *\n * @property {SvelteReactive} reactive -\n *\n * @property {object} options -\n *\n * @property {Position} position -\n */\n\n/**\n * @typedef {object} StoreAppOptions - Provides a custom readable Svelte store for Application options state.\n *\n * @property {import('svelte/store').Readable<object>} subscribe - Subscribe to all app options updates.\n *\n * @property {import('svelte/store').Writable<boolean>} draggable - Derived store for `draggable` updates.\n *\n * @property {import('svelte/store').Writable<boolean>} focusAuto - Derived store for `focusAuto` updates.\n *\n * @property {import('svelte/store').Writable<boolean>} focusKeep - Derived store for `focusKeep` updates.\n *\n * @property {import('svelte/store').Writable<boolean>} focusTrap - Derived store for `focusTrap` updates.\n *\n * @property {import('svelte/store').Writable<boolean>} headerButtonNoClose - Derived store for `headerButtonNoClose`\n * updates.\n *\n * @property {import('svelte/store').Writable<boolean>} headerButtonNoLabel - Derived store for `headerButtonNoLabel`\n * updates.\n *\n * @property {import('svelte/store').Writable<string>} headerIcon - Derived store for `headerIcon` updates.\n *\n * @property {import('svelte/store').Writable<boolean>} headerNoTitleMinimized - Derived store for\n * `headerNoTitleMinimized` updates.\n *\n * @property {import('svelte/store').Writable<boolean>} minimizable - Derived store for `minimizable` updates.\n *\n * @property {import('svelte/store').Writable<boolean>} popOut - Derived store for `popOut` updates.\n *\n * @property {import('svelte/store').Writable<boolean>} positionable - Derived store for `positionable` updates.\n *\n * @property {import('svelte/store').Writable<boolean>} resizable - Derived store for `resizable` updates.\n *\n * @property {import('svelte/store').Writable<string>} title - Derived store for `title` updates.\n */\n\n/**\n * @typedef {object} StoreUIOptions - Provides a custom readable Svelte store for UI options state.\n *\n * @property {import('svelte/store').Readable.subscribe} subscribe - Subscribe to all UI options updates.\n *\n * @property {import('svelte/store').Writable<boolean>} dragging - Derived store for `dragging` updates.\n *\n * @property {import('svelte/store').Readable<ApplicationHeaderButton[]>} headerButtons - Derived store for\n * `headerButtons` updates.\n *\n * @property {import('svelte/store').Readable<boolean>} minimized - Derived store for `minimized` updates.\n *\n * @property {import('svelte/store').Writable<boolean>} resizing - Derived store for `resizing` updates.\n */\n\n/**\n * @typedef {object} TransformData\n *\n * @property {Function} transition - A transition applying to both in & out.\n *\n * @property {Function} inTransition - A transition applying to in.\n *\n * @property {Function} outTransition - A transition applying to out.\n *\n * @property {object} transitionOptions - The options config object for in & out transitions.\n *\n * @property {object} inTransitionOptions - The options config object for in transitions.\n *\n * @property {object} outTransitionOptions - The options config object for out transitions.\n */\n","import { debug } from \"../lib/lib.js\";\n\nclass loading_bar {\n constructor() {\n this.total = 0;\n this.current = 0;\n this.lastPct = 0;\n }\n\n init(context, total) {\n this.context = context;\n this.total = total;\n this.current = 0;\n this.lastPct = 0;\n SceneNavigation.displayProgressBar({ label: this.context, pct: 1 });\n }\n\n incrementProgress() {\n this.current += 1;\n const pct = Math.round((this.current / this.total) * 100);\n if (pct !== this.lastPct) {\n debug(`${pct}% loaded...`);\n SceneNavigation.displayProgressBar({ label: this.context, pct: pct });\n }\n this.lastPct = pct;\n }\n}\n\nconst LoadingBar = new loading_bar();\n\nexport default LoadingBar;\n","import CONSTANTS from \"../constants.js\";\n\nconst SequencerFileCache = {\n _videos: {},\n _preloadedFiles: new Set(),\n _totalCacheSize: 0,\n _validTypes: [\"video/webm\", \"video/x-webm\", \"application/octet-stream\"],\n\n async loadVideo(inSrc) {\n if (!this._videos[inSrc]) {\n const blob = await fetch(inSrc, {\n mode: \"cors\",\n credentials: \"same-origin\",\n })\n .then((r) => r.blob())\n .catch((err) => {\n console.error(err);\n });\n\n if (this._validTypes.indexOf(blob?.type) === -1) return false;\n\n while (this._totalCacheSize + blob.size > 524288000) {\n const entries = Object.entries(this._videos);\n\n entries.sort((a, b) => {\n return b[1].lastUsed - a[1].lastUsed;\n });\n\n const [oldSrc] = entries[0];\n\n this._preloadedFiles.delete(oldSrc);\n this._totalCacheSize -= this._videos[oldSrc].blob.size;\n delete this._videos[oldSrc];\n }\n\n this._totalCacheSize += blob.size;\n this._preloadedFiles.add(inSrc);\n this._videos[inSrc] = {\n blob,\n lastUsed: +new Date(),\n };\n }\n\n this._videos[inSrc].lastUsed = +new Date();\n return this._videos[inSrc].blob;\n },\n\n srcExists(inSrc) {\n if (this._preloadedFiles.has(inSrc)) {\n return true;\n }\n return srcExists(inSrc);\n },\n\n async loadFile(inSrc, preload = false) {\n if (inSrc.toLowerCase().endsWith(\".webm\")) {\n let blob = await this.loadVideo(inSrc);\n if (!blob) return false;\n this._preloadedFiles.add(inSrc);\n if (preload) return true;\n return get_video_texture(blob);\n } else if (AudioHelper.hasAudioExtension(inSrc)) {\n try {\n const audio = await AudioHelper.preloadSound(inSrc);\n if (audio) {\n this._preloadedFiles.add(inSrc);\n }\n return audio;\n } catch (err) {\n console.error(`Failed to load audio: ${inSrc}`);\n return false;\n }\n }\n\n const texture = await loadTexture(inSrc);\n if (texture) {\n this._preloadedFiles.add(inSrc);\n }\n return texture;\n },\n};\n\nasync function get_video_texture(inBlob) {\n return new Promise(async (resolve) => {\n const video = document.createElement(\"video\");\n video.preload = \"auto\";\n video.crossOrigin = \"anonymous\";\n video.controls = true;\n video.autoplay = false;\n video.autoload = true;\n video.muted = true;\n video.src = URL.createObjectURL(inBlob);\n\n let canplay = true;\n video.oncanplay = async () => {\n if (!canplay) return;\n canplay = false;\n\n video.height = video.videoHeight;\n video.width = video.videoWidth;\n\n const baseTexture = PIXI.BaseTexture.from(video, {\n resourceOptions: { autoPlay: false },\n });\n\n if (game.settings.get(CONSTANTS.MODULE_NAME, \"enable-fix-pixi\")) {\n baseTexture.alphaMode = PIXI.ALPHA_MODES.PREMULTIPLIED_ALPHA;\n }\n\n const texture = new PIXI.Texture(baseTexture);\n\n resolve(texture);\n };\n\n video.onerror = () => {\n URL.revokeObjectURL(video.src);\n reject();\n };\n });\n}\n\nexport default SequencerFileCache;\n","import * as lib from \"../lib/lib.js\";\nimport SequencerFileCache from \"./sequencer-file-cache.js\";\n\nconst flipBookTextureCache = {};\n\nexport class SequencerFileBase {\n static make(inData, inDBPath, inMetadata) {\n const originalFile = inData?.file ?? inData;\n const file = foundry.utils.duplicate(originalFile);\n const isRangeFind =\n typeof file !== \"string\" && !Array.isArray(originalFile)\n ? Object.keys(originalFile).filter((key) => key.endsWith(\"ft\")).length >\n 0\n : false;\n\n return isRangeFind\n ? new SequencerFileRangeFind(inData, inDBPath, inMetadata)\n : new SequencerFile(inData, inDBPath, inMetadata);\n }\n}\n\nexport class SequencerFile extends SequencerFileBase {\n rangeFind = false;\n\n constructor(inData, inDBPath, inMetadata) {\n super();\n inData = foundry.utils.duplicate(inData);\n inMetadata = foundry.utils.duplicate(inMetadata);\n this.originalData = inData;\n this.originalMetadata = inMetadata;\n for (let [key, value] of Object.entries(inMetadata)) {\n this[key] = value;\n }\n this.dbPath = inDBPath;\n this.moduleName = inDBPath.split(\".\")[0];\n this.originalFile = inData?.file ?? inData;\n this.file = foundry.utils.duplicate(this.originalFile);\n this.fileIndex = null;\n\n this.fileTextureMap = Object.fromEntries(\n this.getAllFiles().map((file) => {\n return [file, false];\n })\n );\n\n this.twister = false;\n }\n\n clone() {\n return SequencerFile.make(\n this.originalData,\n this.dbPath,\n this.originalMetadata\n );\n }\n\n async validate() {\n let isValid = true;\n const directories = {};\n const allFiles = this.getAllFiles();\n for (const file of allFiles) {\n let directory = file.split(\"/\");\n directory.pop();\n directory = directory.join(\"/\");\n if (directories[directory] === undefined) {\n directories[directory] = await lib.getFiles(directory);\n }\n }\n for (const file of allFiles) {\n let directory = file.split(\"/\");\n directory.pop();\n directory = directory.join(\"/\");\n\n if (directories[directory].indexOf(file) === -1) {\n console.warn(\n `\"${this.dbPath}\" has an incorrect file path, could not find file. Points to:\\n${file}`\n );\n isValid = false;\n }\n }\n return isValid;\n }\n\n getAllFiles() {\n return [this.file].deepFlatten();\n }\n\n getFile() {\n if (Array.isArray(this.file)) {\n this.fileIndex = lib.is_real_number(this.fileIndex)\n ? this.fileIndex\n : lib.random_array_element(this.file, {\n twister: this.twister,\n index: true,\n });\n return this.file[this.fileIndex];\n }\n return this.file;\n }\n\n getTimestamps() {\n if (Array.isArray(this.originalMetadata?.timestamps)) {\n return (\n this.originalMetadata?.timestamps?.[this.fileIndex] ??\n this.originalMetadata?.timestamps[0]\n );\n }\n return this.originalMetadata?.timestamps;\n }\n\n getPreviewFile(entry) {\n let parts = entry.split(\".\");\n let files = this.getAllFiles();\n if (Array.isArray(files)) {\n if (lib.is_real_number(parts[parts.length - 1])) {\n files = files[parts[parts.length - 1]];\n } else {\n const index = Math.floor(lib.interpolate(0, files.length - 1, 0.5));\n files = files?.[index - 1] ?? files[index];\n }\n }\n return files;\n }\n\n destroy() {\n if (this.originalMetadata?.flipbook) return;\n for (let texture of Object.values(this.fileTextureMap)) {\n if (!texture) continue;\n try {\n texture?.baseTexture?.resource?.source?.removeAttribute(\"src\");\n } catch (err) {}\n try {\n texture?.baseTexture?.resource?.source?.pause();\n } catch (err) {}\n try {\n texture?.baseTexture?.resource?.source?.remove();\n } catch (err) {}\n try {\n texture?.baseTexture?.resource?.source?.load();\n } catch (err) {}\n texture.destroy();\n }\n }\n\n async _getTexture(file) {\n if (this.fileTextureMap[file]) return this.fileTextureMap[file];\n this.fileTextureMap[file] = await SequencerFileCache.loadFile(file);\n return this.fileTextureMap[file];\n }\n\n _adjustScaleForPadding(distance, width) {\n return (\n distance /\n (width - (this.template ? this.template[1] + this.template[2] : 0))\n );\n }\n\n _adjustAnchorForPadding(width) {\n return this.template ? this.template[1] / width : undefined;\n }\n\n async _getFlipBookSheet(filePath) {\n if (!this.originalMetadata?.flipbook) return false;\n if (flipBookTextureCache[filePath]) {\n return flipBookTextureCache[filePath];\n }\n flipBookTextureCache[filePath] = this.file.map((file) => {\n return PIXI.Texture.from(file);\n });\n return flipBookTextureCache[filePath];\n }\n\n async getTexture(distance) {\n const filePath = this.getFile();\n const texture = await this._getTexture(this.getFile());\n const sheet = await this._getFlipBookSheet(filePath);\n return {\n filePath,\n texture,\n sheet,\n spriteScale: this._adjustScaleForPadding(distance, texture.width),\n spriteAnchor: this._adjustAnchorForPadding(texture.width),\n };\n }\n}\n\nexport class SequencerFileRangeFind extends SequencerFile {\n rangeFind = true;\n\n constructor(...args) {\n super(...args);\n this._fileDistanceMap = false;\n }\n\n static get ftToDistanceMap() {\n return {\n \"90ft\": canvas.grid.size * 15,\n \"60ft\": canvas.grid.size * 9,\n \"30ft\": canvas.grid.size * 5,\n \"15ft\": canvas.grid.size * 2,\n \"05ft\": 0,\n };\n }\n\n get _gridSizeDiff() {\n return canvas.grid.size / this.template[0];\n }\n\n getAllFiles() {\n return Object.values(this.file).deepFlatten();\n }\n\n getFile(inFt) {\n if (inFt && this.file[inFt]) {\n if (Array.isArray(this.file[inFt])) {\n const fileIndex = lib.is_real_number(this.fileIndex)\n ? Math.min(this.file[inFt].length - 1, this.fileIndex)\n : lib.random_array_element(this.file[inFt], {\n twister: this.twister,\n index: true,\n });\n return this.file[inFt][fileIndex];\n }\n return this.file[inFt];\n }\n\n return this.file;\n }\n\n getPreviewFile(entry) {\n let parts = entry.split(\".\");\n const ft = parts.find(\n (part) =>\n Object.keys(SequencerFileRangeFind.ftToDistanceMap).indexOf(part) > -1\n );\n if (!ft) {\n return super.getPreviewFile(entry);\n }\n const fileIndex = parts.slice(parts.indexOf(ft) + 1)?.[0];\n if (lib.is_real_number(Number(fileIndex))) {\n this.fileIndex = Number(fileIndex);\n }\n return this.getFile(ft);\n }\n\n async getTexture(distance = 400) {\n const { filePath, texture } = await this._getTextureForDistance(distance);\n return {\n filePath,\n texture,\n spriteScale: this._adjustScaleForPadding(distance, texture.width),\n spriteAnchor: this._adjustAnchorForPadding(texture.width),\n };\n }\n\n _getMatchingDistance(inEntry) {\n return SequencerFileRangeFind.ftToDistanceMap[inEntry] / this._gridSizeDiff;\n }\n\n _rangeFind(inDistance) {\n if (!this._fileDistanceMap) {\n let distances = Object.keys(this.file)\n .filter(\n (entry) =>\n Object.keys(SequencerFileRangeFind.ftToDistanceMap).indexOf(entry) >\n -1\n )\n .map((ft) => {\n return {\n file: this.getFile(ft),\n minDistance: this._getMatchingDistance(ft),\n };\n });\n\n let uniqueDistances = [\n ...new Set(distances.map((item) => item.minDistance)),\n ];\n uniqueDistances.sort((a, b) => a - b);\n\n let max = Math.max(...uniqueDistances);\n let min = Math.min(...uniqueDistances);\n\n this._fileDistanceMap = distances.map((entry) => {\n entry.distances = {\n min: entry.minDistance === min ? 0 : entry.minDistance,\n max:\n entry.minDistance === max\n ? Infinity\n : uniqueDistances[uniqueDistances.indexOf(entry.minDistance) + 1],\n };\n return entry;\n });\n }\n\n const possibleFiles = this._fileDistanceMap\n .filter((entry) => {\n const relativeDistance = inDistance / this._gridSizeDiff;\n return (\n relativeDistance >= entry.distances.min &&\n relativeDistance < entry.distances.max\n );\n })\n .map((entry) => entry.file)\n .flat();\n\n return possibleFiles.length > 1\n ? lib.random_array_element(possibleFiles, { twister: this.twister })\n : possibleFiles[0];\n }\n\n async _getTextureForDistance(distance) {\n const filePath = this._rangeFind(distance);\n const texture = await this._getTexture(filePath);\n return { filePath, texture };\n }\n}\n","import * as lib from \"../lib/lib.js\";\nimport LoadingBar from \"../utils/loadingBar.js\";\nimport { SequencerFile, SequencerFileBase } from \"./sequencer-file.js\";\nimport { writable, get } from \"svelte/store\";\nimport CONSTANTS from \"../constants.js\";\n\nclass Database {\n #entriesStore = writable({});\n\n privateModules = [];\n flattenedEntries = [];\n inverseFlattenedEntries = new Map();\n\n get entries() {\n return get(this.#entriesStore);\n }\n set entries(entries) {\n this.#entriesStore.set(entries);\n }\n get entriesStore() {\n return this.#entriesStore;\n }\n\n get publicModules() {\n return Object.keys(this.entries).filter(\n (module) => !this.privateModules.includes(module)\n );\n }\n\n get publicFlattenedEntries() {\n return this.flattenedEntries.filter((entry) => {\n return this.privateModules.indexOf(entry.split(\".\")[0]) === -1;\n });\n }\n\n get publicFlattenedSimpleEntries() {\n return lib.make_array_unique(\n this.publicFlattenedEntries.map((entry) => {\n return entry.split(CONSTANTS.FEET_REGEX)[0];\n })\n );\n }\n\n /**\n * Retrieves an object of every public entry\n *\n * @return {object}\n */\n get filePathDatabasePaths() {\n const fileDatabaseObject = {};\n Object.entries(this.entries)\n .map((entry) => entry[1])\n .deepFlatten()\n .forEach((sequencerFile) => {\n if (sequencerFile?.rangeFind) {\n Object.entries(sequencerFile.file).forEach((entry) => {\n fileDatabaseObject[entry[1]] =\n sequencerFile.dbPath + \".\" + entry[0];\n });\n } else {\n fileDatabaseObject[sequencerFile.file] = sequencerFile.dbPath;\n }\n });\n return fileDatabaseObject;\n }\n\n /**\n * Registers a set of entries to the database on the given module name\n *\n * @param {string} inModuleName The namespace to assign to the inserted entries\n * @param {object} inEntries The entries to merge into the database\n * @param {boolean} isPrivate Whether to mark these entries as private and not show in Effect Player or Database Viewer\n * @return {boolean}\n */\n registerEntries(inModuleName, inEntries, isPrivate = false) {\n if (inModuleName.includes(\".\"))\n return this._throwError(\n \"registerEntries\",\n \"module name must not contain periods\"\n );\n if (this.entries[inModuleName])\n lib.custom_warning(\n \"Sequencer\",\n `registerEntries | module \"${inModuleName}\" has already been registered to the database! Do you have two similar modules active?`,\n true\n );\n this._flatten(inEntries, inModuleName);\n const processedEntries = this._processEntries(inModuleName, inEntries);\n if (isPrivate) this.privateModules.push(inModuleName);\n this.entries = foundry.utils.mergeObject(this.entries, {\n [inModuleName]: processedEntries,\n });\n lib.debug(\n `Sequencer | Database | Entries for \"${inModuleName}\" registered`\n );\n Hooks.callAll(\"registerSequencerDatabaseEntries\", inModuleName);\n return true;\n }\n\n /**\n * Validates the entries under a certain module name, checking whether paths to assets are correct or not\n *\n * @param {string} inModuleName The namespace to assign to the inserted entries\n * @return {boolean}\n */\n async validateEntries(inModuleName) {\n let entries = this.getEntry(inModuleName);\n if (!Array.isArray(entries)) {\n entries = [entries];\n }\n ui.notifications.info(\n `Validating paths registered to \"${inModuleName}\"...`\n );\n let isValid = true;\n LoadingBar.init(\n `Validating paths registered to \"${inModuleName}\"...`,\n entries.length\n );\n for (let entry of entries) {\n const result = await entry.validate();\n LoadingBar.incrementProgress();\n isValid = !(!result || !isValid);\n }\n if (!isValid) {\n ui.notifications.error(\n `Validation of paths registered to \"${inModuleName}\" failed! Errors logged in console.`\n );\n } else {\n ui.notifications.info(\n `Validation of paths registered to \"${inModuleName}\" complete! No errors found!`\n );\n }\n }\n\n /**\n * Quickly checks if the entry exists in the database\n *\n * @param {string} inString The entry to find in the database\n * @return {boolean} If the entry exists in the database\n */\n entryExists(inString) {\n if (typeof inString !== \"string\")\n return this._throwError(\"entryExists\", \"inString must be of type string\");\n inString = inString.trim();\n if (inString === \"\")\n return this._throwError(\"entryExists\", \"inString cannot be empty\");\n inString = inString.replace(/\\[[0-9]+]$/, \"\");\n return this.flattenedEntries.find((entry) => entry.startsWith(inString));\n }\n\n /**\n * Gets the entry in the database by a dot-notated string\n *\n * @param {string} inString The entry to find in the database\n * @param {boolean} softFail Whether it should soft fail (no error) when no entry was found\n * @return {array|SequencerFile|boolean} The found entry in the database, or false if not found (with warning)\n */\n getEntry(inString, { softFail = false } = {}) {\n if (typeof inString !== \"string\") {\n if (softFail) return false;\n return this._throwError(\"getEntry\", \"inString must be of type string\");\n }\n inString = inString.trim();\n if (inString === \"\") {\n if (softFail) return false;\n return this._throwError(\"getEntry\", \"inString cannot be empty\");\n }\n inString = inString.replace(/\\[[0-9]+]$/, \"\");\n if (!this.entryExists(inString)) {\n if (softFail) return false;\n return this._throwError(\n \"getEntry\",\n `Could not find ${inString} in database`\n );\n }\n\n let ft = false;\n let index = false;\n if (CONSTANTS.FEET_REGEX.test(inString)) {\n ft = inString.match(CONSTANTS.FEET_REGEX)[0];\n const split = inString.split(ft).filter((str) => str !== \"\");\n if (split.length > 1) {\n index = split[1].split(\".\")[0];\n }\n inString = split[0];\n }\n\n const module = inString.split(\".\")[0];\n const exactEntries = this.entries[module].filter((entry) => {\n return entry.dbPath === inString;\n });\n\n let filteredEntries = (\n exactEntries.length\n ? exactEntries\n : this.entries[module].filter((entry) => {\n return entry.dbPath.startsWith(inString);\n })\n ).map((entry) => {\n let foundFile = entry;\n if (ft) foundFile = entry.file?.[ft] ?? foundFile;\n if (index) foundFile = foundFile?.[index] ?? foundFile;\n return foundFile;\n });\n\n if (!filteredEntries.length)\n return this._throwError(\n \"getEntry\",\n `Could not find ${inString} in database`\n );\n\n const foundEntry =\n filteredEntries.length === 1 ? filteredEntries[0] : filteredEntries;\n\n if (index && filteredEntries.length === 1) {\n foundEntry.fileIndex = Number(index);\n }\n\n return foundEntry;\n }\n\n /**\n * Gets all files under a database path\n *\n * @param {string} inDBPath The module to get all files from\n * @return {array|boolean} The found entries in the database under the module's name, or false if not found (with warning)\n */\n getAllFileEntries(inDBPath) {\n if (typeof inDBPath !== \"string\")\n return this._throwError(\n \"getAllFileEntries\",\n \"inDBPath must be of type string\"\n );\n inDBPath = inDBPath.trim();\n if (inDBPath === \"\")\n return this._throwError(\"getAllFileEntries\", \"inDBPath cannot be empty\");\n if (!this.entryExists(inDBPath))\n return this._throwError(\n \"getAllFileEntries\",\n `Could not find ${inDBPath} in database`\n );\n const entries = this._recurseGetFilePaths(inDBPath);\n return lib.make_array_unique(entries.flat());\n }\n\n /**\n * Get all valid entries under a certain path\n *\n * @param {string} inPath The database path to get entries under\n * @return {array|boolean} An array containing the next layer of valid paths\n */\n getPathsUnder(\n inPath,\n {\n ranges = false,\n arrays = false,\n match = false,\n fullyQualified = false,\n } = {}\n ) {\n if (typeof inPath !== \"string\")\n return this._throwError(\"getPathsUnder\", \"inPath must be of type string\");\n inPath = inPath.trim();\n if (inPath === \"\")\n return this._throwError(\"getPathsUnder\", \"inPath cannot be empty\");\n inPath = inPath.replace(/\\[[0-9]+]$/, \"\");\n if (!this.entryExists(inPath))\n return this._throwError(\n \"getPathsUnder\",\n `Could not find ${inPath} in database`\n );\n const entries = this.flattenedEntries.filter((e) => {\n return (\n (e.startsWith(inPath + \".\") || e === inPath) &&\n (!match || (match && e.match(match)))\n );\n });\n if (entries.length === 0) return [];\n return lib.make_array_unique(\n entries\n .map((e) => (!arrays ? e.split(CONSTANTS.ARRAY_REGEX)[0] : e))\n .map((e) => (!ranges ? e.split(CONSTANTS.FEET_REGEX)[0] : e))\n .map((e) => (!fullyQualified ? e.split(inPath)[1] : e))\n .map((e) => (!fullyQualified ? (e ? e.split(\".\")[1] : \"\") : e))\n .filter(Boolean)\n );\n }\n\n /**\n * Get all valid entries under a certain path\n *\n * @param {string} inPath The database path to search for\n * @param {boolean} publicOnly Whether to only search for public modules\n * @return {array|boolean} An array containing potential database paths\n */\n searchFor(inPath, publicOnly = true) {\n const modules = publicOnly ? this.publicModules : Object.keys(this.entries);\n const originalEntries = publicOnly\n ? this.publicFlattenedEntries\n : this.flattenedEntries;\n\n if ((!inPath || inPath === \"\") && !modules.includes(inPath)) return modules;\n\n if (typeof inPath !== \"string\") {\n return this._throwError(\"searchFor\", \"inString must be of type string\");\n }\n\n inPath = inPath.trim();\n\n if (inPath === \"\")\n return this._throwError(\"searchFor\", \"inString cannot be empty\");\n\n inPath = inPath.replace(/\\[[0-9]+]$/, \"\");\n inPath = inPath.trim();\n\n let entries = originalEntries.filter(\n (e) => e.startsWith(inPath) && e !== inPath\n );\n\n if (inPath.endsWith(\".\")) inPath = inPath.substring(0, inPath.length - 1);\n let length = inPath.split(\".\").length + 1;\n let foundEntries = entries.map((e) => {\n let path = e.split(CONSTANTS.FEET_REGEX)[0];\n return path.split(\".\").slice(0, length).join(\".\");\n });\n\n if (foundEntries.length === 0) {\n const regexString = lib\n .str_to_search_regex_str(inPath)\n .replace(/\\s+/g, \"|\");\n const searchParts = regexString.split(\"|\").length;\n const regexSearch = new RegExp(regexString, \"gu\");\n foundEntries = originalEntries\n .filter((e) => {\n return e.match(regexSearch)?.length >= searchParts;\n })\n .map((e) => {\n return e.split(CONSTANTS.FEET_REGEX)[0];\n });\n }\n\n return lib.make_array_unique(foundEntries);\n }\n\n /**\n * Throws an error without THROWING one. Duh.\n *\n * @param inFunctionName\n * @param inError\n * @returns {boolean}\n * @private\n */\n _throwError(inFunctionName, inError) {\n let error = `Sequencer | Database | ${inFunctionName} - ${inError}`;\n ui.notifications.error(error);\n return false;\n }\n\n /**\n * Gets all file paths from the entirety of\n *\n * @param inDBPath\n * @returns {Array}\n * @private\n */\n _recurseGetFilePaths(inDBPath) {\n const module = inDBPath.split(\".\")[0];\n return this.entries[module]\n .filter((entry) => entry.dbPath.startsWith(inDBPath))\n .map((entry) => {\n return entry.getAllFiles();\n })\n .flat();\n }\n\n /**\n * Flattens a given object to just their db path and file path\n *\n * @param entries\n * @param inModule\n * @private\n */\n _flatten(entries, inModule) {\n let flattened = lib.flatten_object(\n foundry.utils.duplicate({ [inModule]: entries })\n );\n this.flattenedEntries = lib.make_array_unique(\n this.flattenedEntries.concat(\n Object.keys(flattened).map((file) => file.split(\".file\")[0])\n )\n );\n this.inverseFlattenedEntries = Object.keys(flattened).reduce(\n (acc, entry) => {\n return acc.set(flattened[entry], entry.split(\".file\")[0]);\n },\n this.inverseFlattenedEntries\n );\n }\n\n /**\n * Processes and recurse into a large object containing file paths at any given depth\n *\n * @param moduleName\n * @param entries\n * @returns {object}\n * @private\n */\n _processEntries(moduleName, entries) {\n const allPaths = new Set(\n this.flattenedEntries\n .filter((e) => e.split(\".\")[0] === moduleName)\n .map((e) => e.split(CONSTANTS.FEET_REGEX)[0])\n );\n\n const allTemplates = foundry.utils.mergeObject(entries?._templates ?? {}, {\n default: [100, 0, 0],\n });\n\n if (entries?._templates) {\n delete entries?._templates;\n }\n\n const moduleEntries = [];\n\n const mediaFileExtensions = Object.keys(CONST.FILE_CATEGORIES.IMAGE)\n .concat(Object.keys(CONST.FILE_CATEGORIES.VIDEO))\n .concat(Object.keys(CONST.FILE_CATEGORIES.AUDIO));\n\n for (let wholeDBPath of allPaths) {\n let metadata = this._getCleanData(entries);\n let dbPath = wholeDBPath.split(\".\");\n dbPath.shift();\n let combinedPath = \"\";\n for (let part of dbPath) {\n combinedPath = combinedPath ? combinedPath + \".\" + part : part;\n const entry = getProperty(entries, combinedPath);\n if (Array.isArray(entry) || typeof entry === \"string\" || entry?.file) {\n metadata = this._getCleanData(entry, { existingData: metadata });\n break;\n }\n metadata = this._getCleanData(entry, { existingData: metadata });\n }\n\n if (!metadata.template) metadata.template = \"default\";\n if (typeof metadata.template === \"string\") {\n metadata.template =\n allTemplates?.[metadata.template] ?? allTemplates?.[\"default\"];\n }\n\n let data = getProperty(entries, dbPath.join(\".\"));\n if (!Array.isArray(data) && !(typeof data === \"string\")) {\n data = this._getCleanData(data, { metadata: false });\n }\n\n if (typeof data === \"string\") {\n const existingEntry = this.entryExists(data);\n const extension = data\n .split(\".\")\n [data.split(\".\").length - 1].toLowerCase();\n\n if (\n !existingEntry &&\n extension &&\n !mediaFileExtensions.includes(extension)\n ) {\n console.warn(\n `Sequencer | Database | registerEntries - failed to register ${wholeDBPath} to ${data}!`\n );\n this.flattenedEntries.splice(\n this.flattenedEntries.indexOf(wholeDBPath),\n 1\n );\n continue;\n } else if (existingEntry) {\n const sequencerFile = this.getEntry(data);\n const clone = sequencerFile.clone();\n clone.dbPath = wholeDBPath;\n clone.metadata = foundry.utils.mergeObject(\n clone.metadata ?? {},\n metadata ?? {}\n );\n moduleEntries.push(clone);\n continue;\n }\n }\n\n moduleEntries.push(SequencerFileBase.make(data, wholeDBPath, metadata));\n }\n\n return moduleEntries;\n }\n\n _getCleanData(data, { existingData = {}, metadata = true } = {}) {\n data = Object.entries(data).filter((entry) => {\n return metadata === entry[0].startsWith(\"_\");\n });\n if (metadata) {\n data = data.map((entry) => [entry[0].slice(1), entry[1]]);\n }\n return foundry.utils.mergeObject(existingData, Object.fromEntries(data));\n }\n}\n\nconst SequencerDatabase = new Database();\n\nexport default SequencerDatabase;\n","<script>\r\n\r\n import { databaseStore } from \"./DatabaseStore.js\";\r\n\r\n export let data;\r\n\r\n const searchRegex = databaseStore.searchRegex;\r\n\r\n let flashFilePath = false;\r\n let flashDBPath = false;\r\n\r\n $: highlight = data.path.replace(\r\n $searchRegex,\r\n \"<mark>$&</mark>\"\r\n );\r\n\r\n</script>\r\n\r\n<div class=\"database-entry\" style=\"margin-left:{data.depth * 15}px;\">\r\n\t<div class=\"database-entry-text-container\">\r\n\t\t{#if data.hasChildren}\r\n\t\t\t<a on:click={(e) => {\r\n\t\t\t\tdatabaseStore.openTreePath(data.fullPath, !data.open, e.ctrlKey);\r\n\t\t\t}}>\r\n\t\t\t\t<i class=\"fas\" class:fa-angle-down={data.open} class:fa-angle-right={!data.open}></i>\r\n\t\t\t</a>\r\n\t\t{/if}\r\n\t\t{#if data.fullPath.includes(\".\")}\r\n\t\t\t{#if !data.hasChildren}\r\n\t\t\t\t<a class=\"database-entry-button\" on:click={(e) => {\r\n\t\t\t\t\tdatabaseStore.copyPath(data.fullPath, true, e.ctrlKey)\r\n\t\t\t\t\tflashFilePath = true;\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tflashFilePath = false\r\n\t\t\t\t\t}, 400);\r\n\t\t\t\t}}>\r\n\t\t\t\t\t<i class=\"fas fa-file\" class:flash-it={flashFilePath}></i>\r\n\t\t\t\t</a>\r\n\t\t\t{/if}\r\n\t\t\t<a class=\"database-entry-button\" on:click={(e) => {\r\n\t\t\t\tdatabaseStore.copyPath(data.fullPath, false, e.ctrlKey)\r\n\t\t\t\tflashDBPath = true;\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tflashDBPath = false\r\n\t\t\t\t}, 400);\r\n\t\t\t}}>\r\n\t\t\t\t<i class=\"fas fa-database\" class:flash-it={flashDBPath}></i>\r\n\t\t\t</a>\r\n\t\t\t<a class=\"database-entry-button\" on:click={() => {\r\n\t\t\t\tdatabaseStore.playFile(data.fullPath)\r\n\t\t\t}}>\r\n\t\t\t\t<i class=\"fas fa-play\"></i>\r\n\t\t\t</a>\r\n\t\t{/if}\r\n\t\t<div class=\"database-entry-text\" title=\"{data.path}\">\r\n\t\t\t<div class=\"database-entry-text-highlight\">{@html highlight}</div>\r\n\t\t\t{data.path}\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<style lang=\"scss\">\r\n\r\n .database-entry {\r\n flex: 1 0 auto;\r\n\r\n .database-entry-text-container {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n\r\n .database-entry-button {\r\n padding: 0 0 0 3px;\r\n font-size: 0.7rem;\r\n line-height: normal;\r\n cursor: pointer;\r\n }\r\n\r\n a {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n max-width: 15px;\r\n }\r\n\r\n a > i {\r\n flex: 0 0 15px;\r\n min-width: 15px;\r\n }\r\n }\r\n }\r\n\r\n .database-entry > button > i {\r\n font-size: 0.7rem;\r\n }\r\n\r\n .sub-leaves {\r\n padding-left: 1rem;\r\n padding-bottom: 0.25rem;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .database-entry-text {\r\n position: relative;\r\n margin-left: 5px;\r\n }\r\n\r\n .database-entry-text-highlight {\r\n pointer-events: none;\r\n color: transparent;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n\r\n .flash-it {\r\n -webkit-animation: flash linear 400ms forwards;\r\n animation: flash linear 400ms forwards;\r\n }\r\n\r\n @keyframes flash {\r\n 0% {\r\n opacity: 1;\r\n }\r\n 25% {\r\n opacity: .1;\r\n }\r\n 50% {\r\n opacity: 1;\r\n }\r\n 75% {\r\n opacity: .1;\r\n }\r\n 100% {\r\n opacity: 1;\r\n }\r\n }\r\n</style>\r\n","<script>\r\n\texport let data;\r\n</script>\r\n\r\n<div style=\"margin-bottom: 0.3rem;\"></div>\r\n","import SequencerDatabase from \"../../modules/sequencer-database.js\";\nimport { SequencerFileBase } from \"../../modules/sequencer-file.js\";\nimport CONSTANTS from \"../../constants.js\";\nimport * as lib from \"../../lib/lib.js\";\nimport { writable, get } from \"svelte/store\";\nimport TreeViewEntry from \"./TreeViewEntry.svelte\";\nimport TreeViewSeparator from \"./TreeViewSeparator.svelte\";\n\nlet lastFile = false;\n\nfunction getFileData(entryText) {\n let entry = SequencerDatabase.getEntry(entryText);\n\n if (Array.isArray(entry)) {\n if (entry.includes(lastFile) && entry.length > 1) {\n entry.splice(entry.indexOf(lastFile), 1);\n }\n entry = lib.random_array_element(entry);\n lastFile = entry;\n }\n\n let previewFile = entry?.file ?? entry;\n if (entry instanceof SequencerFileBase) {\n previewFile = entry.clone().getPreviewFile(entryText);\n }\n\n let lowerCaseEntry = previewFile ? previewFile.toLowerCase() : \"unknown.jpg\";\n\n const isAudio =\n lowerCaseEntry.endsWith(\"ogg\") ||\n lowerCaseEntry.endsWith(\"mp3\") ||\n lowerCaseEntry.endsWith(\"wav\");\n const isImage = !lowerCaseEntry.endsWith(\"webm\") && !isAudio;\n const isVideo = !isAudio && !isImage;\n const icon = previewFile\n ? isVideo\n ? \"fa-film\"\n : isAudio\n ? \"fa-volume-high\"\n : \"fa-image\"\n : \"fa-question-mark\";\n const title = previewFile\n ? isVideo\n ? \"Animated WebM\"\n : isAudio\n ? \"Audio\"\n : \"Image\"\n : \"Unknown\";\n\n return {\n file: previewFile ?? \"unknown.jpg\",\n dbEntry: entry,\n icon,\n title,\n isAudio,\n isImage,\n isVideo,\n };\n}\n\nfunction copyPath(dbPath, getFilepath, quotes = false) {\n const tempInput = document.createElement(\"input\");\n tempInput.value = `${dbPath}`;\n\n let entry;\n if (getFilepath) {\n entry = Sequencer.Database.getEntry(dbPath);\n if (Array.isArray(entry)) {\n entry = lib.random_array_element(entry);\n }\n if (entry instanceof SequencerFileBase) {\n const specificFt = dbPath.match(CONSTANTS.FEET_REGEX);\n if (specificFt) {\n const ft = specificFt[0].replaceAll(\".\", \"\");\n entry = entry.getFile(ft);\n } else {\n const files = entry.getAllFiles();\n if (Array.isArray(files)) {\n const index = Math.floor(lib.interpolate(0, files.length - 1, 0.5));\n entry = files[index];\n }\n }\n }\n\n tempInput.value = `${entry?.file ?? entry}`;\n }\n\n if (quotes) {\n tempInput.value = `\"${tempInput.value}\"`;\n }\n\n document.body.appendChild(tempInput);\n tempInput.select();\n document.execCommand(\"copy\");\n document.body.removeChild(tempInput);\n document.execCommand(\"copy\");\n}\n\nfunction playFile(entry) {\n const { file, isAudio, isImage, isVideo } = getFileData(entry);\n\n databaseStore.elements.audio.classList.toggle(\"hidden\", !isAudio);\n databaseStore.elements.image.classList.toggle(\"hidden\", !isImage);\n databaseStore.elements.player.classList.toggle(\"hidden\", !isVideo);\n\n if (isImage) {\n databaseStore.elements.image.src = file;\n databaseStore.metadata.set({\n type: \"Image\",\n duration: \"n/a\",\n });\n return;\n }\n\n const element = isAudio\n ? databaseStore.elements.audio\n : databaseStore.elements.player;\n\n element.onerror = () => {\n const error = `Sequencer Database Viewer | Could not play file: ${file}`;\n ui.notifications.error(error);\n console.error(error);\n };\n\n element.oncanplay = () => {\n element.play();\n };\n\n element.onloadedmetadata = () => {\n databaseStore.metadata.set({\n type: isVideo ? \"Video\" : isAudio ? \"Audio\" : \"Image\",\n duration: isImage ? \"n/a\" : element.duration * 1000 + \"ms\",\n });\n };\n\n element.src = file;\n}\n\nconst treeStore = writable({});\nconst visibleTreeStore = writable([]);\nlet flattenedEntries = [];\nconst entriesStore = SequencerDatabase.entriesStore;\nconst packStore = writable(SequencerDatabase.publicModules);\nconst selectedPackStore = writable(\"all\");\nconst searchStore = writable(\"\");\nconst cleanSearchStore = writable(\"\");\nconst searchRegexStore = writable(new RegExp(\"\", \"gu\"));\n\nSequencerDatabase.entriesStore.subscribe(() => {\n packStore.set(SequencerDatabase.publicModules);\n});\n\nconst databaseStore = {\n metadata: writable(false),\n allRanges: writable(false),\n subLists: writable(false),\n listView: writable(false),\n packStore: packStore,\n selectedPackStore: selectedPackStore,\n visibleTreeStore: visibleTreeStore,\n search: searchStore,\n cleanSearchStore: cleanSearchStore,\n searchRegex: searchRegexStore,\n elements: {},\n copyPath,\n playFile,\n openTreePath,\n};\n\nentriesStore.subscribe(() => {\n filterFlattenedEntries();\n});\n\ndatabaseStore.allRanges.subscribe(() => {\n filterFlattenedEntries();\n});\n\ndatabaseStore.subLists.subscribe(() => {\n filterFlattenedEntries();\n});\n\ndatabaseStore.selectedPackStore.subscribe(() => {\n filterFlattenedEntries();\n});\n\nsearchStore.subscribe((val) => {\n const cleanSearch = lib.str_to_search_regex_str(val).replace(/\\s+/g, \"|\");\n cleanSearchStore.set(cleanSearch);\n searchRegexStore.set(new RegExp(cleanSearch, \"gu\"));\n updateVisualTree();\n});\n\nfunction filterFlattenedEntries() {\n const selectedPack = get(selectedPackStore);\n const search = get(searchStore);\n const searchRegex = get(searchRegexStore);\n const subLists = get(databaseStore.subLists);\n const allRanges = get(databaseStore.allRanges);\n flattenedEntries = lib.make_array_unique(\n SequencerDatabase.publicFlattenedEntries\n .filter((e) => {\n return (\n (selectedPack === \"all\" || e.startsWith(selectedPack + \".\")) &&\n (!search || e.match(searchRegex))\n );\n })\n .map((e) => (!subLists ? e.split(CONSTANTS.ARRAY_REGEX)[0] : e))\n .map((e) => (!allRanges ? e.split(CONSTANTS.FEET_REGEX)[0] : e))\n );\n treeStore.set(\n flattenedEntries.reduce((acc, entry) => {\n let path = \"\";\n for (const part of entry.split(\".\")) {\n const fullPath = path ? path + \".\" + part : part;\n path = path ? path + \".children.\" + part : part;\n if (!getProperty(acc, path)) {\n setProperty(\n acc,\n path,\n foundry.utils.mergeObject(\n {\n path: part,\n fullPath,\n open: false,\n children: {},\n },\n getProperty(acc, path)\n )\n );\n }\n }\n return acc;\n }, {})\n );\n}\n\nfunction openTreePath(fullPath, open, openAll = false) {\n treeStore.update((tree) => {\n const fullTreePath = fullPath.split(\".\").join(\".children.\");\n const node = getProperty(tree, fullTreePath);\n setProperty(tree, fullTreePath + \".open\", open);\n if ((!open || openAll) && !foundry.utils.isEmpty(node.children)) {\n recurseOpenTree(node.children, open);\n }\n return tree;\n });\n}\n\nfunction recurseOpenTree(children, open) {\n for (const node of Object.values(children)) {\n node.open = open;\n if (!foundry.utils.isEmpty(node.children)) {\n recurseOpenTree(node.children, open);\n }\n }\n}\n\ntreeStore.subscribe(() => {\n updateVisualTree();\n});\n\nfunction updateVisualTree() {\n const tree = get(treeStore);\n const visibleTree = recurseTree(tree)\n .deepFlatten()\n .filter((e) => e.visible);\n visibleTreeStore.set(visibleTree);\n}\n\nfunction recurseTree(tree, path = \"\", depth = 0) {\n const search = get(searchStore);\n const searchRegex = get(searchRegexStore);\n const searchParts = get(cleanSearchStore).split(\"|\");\n return Object.entries(tree).map(([key, data]) => {\n const fullPath = path ? path + \".\" + key : key;\n\n const children = recurseTree(\n data.children,\n fullPath,\n depth + 1\n ).deepFlatten();\n\n const matchParts = lib.make_array_unique(fullPath.match(searchRegex) || []);\n const open =\n data.open ||\n (search &&\n (matchParts.length >= searchParts.length ||\n children.filter((e) => e.visible).length));\n let visible = !search || matchParts.length >= searchParts.length;\n\n if (visible) {\n children.forEach((e) => (e.visible = true));\n } else {\n visible = children.filter((e) => e.visible).length;\n }\n\n const entry = {\n class: TreeViewEntry,\n path: key,\n fullPath: fullPath,\n open,\n visible,\n hasChildren: !foundry.utils.isEmpty(data.children),\n depth,\n };\n\n const leaf = [entry];\n if ((data.open || entry.open) && entry.hasChildren) {\n leaf.push(...children, {\n fullPath: randomID(),\n class: TreeViewSeparator,\n });\n }\n return leaf;\n });\n}\n\nexport { databaseStore };\n","<script>\r\n\r\n\r\n import { createEventDispatcher } from \"svelte\";\r\n import { databaseStore } from \"./DatabaseStore.js\";\r\n\r\n const dispatch = createEventDispatcher();\r\n\r\n\texport let entry;\r\n\r\n const searchRegex = databaseStore.searchRegex;\r\n\r\n let flashFilePath = false;\r\n let flashDBPath = false;\r\n\r\n $: highlight = entry.replace(\r\n $searchRegex,\r\n\t\t\"<mark>$&</mark>\"\r\n\t);\r\n\r\n</script>\r\n\r\n<div\r\n\tclass=\"database-entry\"\r\n\tdata-id=\"{entry}\"\r\n>\r\n\t<button type=\"button\" class=\"btn_play\" on:click={() => {\r\n databaseStore.playFile(entry)\r\n }}>\r\n\t\t<i class=\"fas fa-play\"></i>\r\n\t</button>\r\n\t<button type=\"button\" class=\"btn_copy_filepath\" on:click={(e) => {\r\n databaseStore.copyPath(entry, true, e.ctrlKey)\r\n flashFilePath = true;\r\n setTimeout(() => {\r\n flashFilePath = false\r\n }, 400);\r\n }}>\r\n\t\t<i class:flash-it={flashFilePath} class=\"fas fa-file\"></i>\r\n\t</button>\r\n\t<button type=\"button\" class=\"btn_copy_databasepath\" on:click={(e) => {\r\n databaseStore.copyPath(entry, false, e.ctrlKey)\r\n flashDBPath = true;\r\n setTimeout(() => {\r\n flashDBPath = false\r\n }, 400);\r\n }}>\r\n\t\t<i class:flash-it={flashDBPath} class=\"fas fa-database\"></i>\r\n\t</button>\r\n\r\n\t<div class=\"database-entry-text\" title=\"{entry}\">\r\n\t\t<div class=\"database-entry-text-highlight\">{@html highlight}</div>\r\n\t\t{entry}\r\n\t</div>\r\n</div>\r\n\r\n<style lang=\"scss\">\r\n\r\n .database-entry{\r\n display:flex;\r\n flex: 1 0 auto;\r\n }\r\n\r\n select, input {\r\n color: black !important;\r\n background: rgba(255, 255, 255, 0.5) !important;\r\n margin-right: 0.25rem;\r\n }\r\n\r\n .database-entry > button{\r\n flex: 0;\r\n\t\tpadding: 0 0 0 3px;\r\n font-size: 0.7rem !important;\r\n min-height: 20px;\r\n max-height: 20px;\r\n min-width: 20px;\r\n max-width: 20px;\r\n line-height: normal;\r\n margin-right: 2px !important;\r\n }\r\n\r\n .database-entry > button > i {\r\n font-size: 0.7rem;\r\n }\r\n\r\n .btn_play * {\r\n pointer-events: none;\r\n }\r\n\r\n .btn_copy_filepath, .btn_copy_databasepath{\r\n min-width: 1.5rem;\r\n padding: 0;\r\n }\r\n\r\n .database-entry > div{\r\n flex: 1;\r\n line-height:1.25rem;\r\n }\r\n\r\n .database-entry-text {\r\n position: relative;\r\n\t\tmargin-left: 5px;\r\n }\r\n\r\n .database-entry-text-highlight {\r\n pointer-events: none;\r\n color: transparent;\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n\r\n .flash-it {\r\n -webkit-animation: flash linear 400ms forwards;\r\n animation: flash linear 400ms forwards;\r\n }\r\n\r\n @keyframes flash {\r\n 0% {\r\n opacity: 1;\r\n }\r\n 25% {\r\n opacity: .1;\r\n }\r\n 50% {\r\n opacity: 1;\r\n }\r\n 75% {\r\n opacity: .1;\r\n }\r\n 100% {\r\n opacity: 1;\r\n }\r\n }\r\n\r\n</style>\r\n","/**\r\n * virtual list core calculating center\r\n */\r\n\r\nconst DIRECTION_TYPE = {\r\n FRONT: \"FRONT\", // scroll up or left\r\n BEHIND: \"BEHIND\", // scroll down or right\r\n}\r\nconst CALC_TYPE = {\r\n INIT: \"INIT\",\r\n FIXED: \"FIXED\",\r\n DYNAMIC: \"DYNAMIC\",\r\n}\r\nconst LEADING_BUFFER = 2\r\n\r\nexport default class {\r\n param\r\n callUpdate\r\n firstRangeTotalSize = 0\r\n firstRangeAverageSize = 0\r\n lastCalcIndex = 0\r\n fixedSizeValue = 0\r\n calcType = CALC_TYPE.INIT\r\n offset = 0\r\n direction = \"\"\r\n range\r\n\r\n constructor(param, callUpdate) {\r\n this.init(param, callUpdate)\r\n }\r\n\r\n init(param, callUpdate) {\r\n // param data\r\n this.param = param\r\n this.callUpdate = callUpdate\r\n\r\n // size data\r\n this.sizes = new Map()\r\n this.firstRangeTotalSize = 0\r\n this.firstRangeAverageSize = 0\r\n this.lastCalcIndex = 0\r\n this.fixedSizeValue = 0\r\n this.calcType = CALC_TYPE.INIT\r\n\r\n // scroll data\r\n this.offset = 0\r\n this.direction = \"\"\r\n\r\n // range data\r\n this.range = Object.create(null)\r\n if (param) {\r\n this.checkRange(0, param.keeps - 1)\r\n }\r\n\r\n // benchmark example data\r\n // this.__bsearchCalls = 0\r\n // this.__getIndexOffsetCalls = 0\r\n }\r\n\r\n destroy() {\r\n this.init(null, null)\r\n }\r\n\r\n // return current render range\r\n getRange() {\r\n const range = Object.create(null)\r\n range.start = this.range.start\r\n range.end = this.range.end\r\n range.padFront = this.range.padFront\r\n range.padBehind = this.range.padBehind\r\n return range\r\n }\r\n\r\n isBehind() {\r\n return this.direction === DIRECTION_TYPE.BEHIND\r\n }\r\n\r\n isFront() {\r\n return this.direction === DIRECTION_TYPE.FRONT\r\n }\r\n\r\n // return start index offset\r\n getOffset(start) {\r\n return (start < 1 ? 0 : this.getIndexOffset(start)) + this.param.slotHeaderSize\r\n }\r\n\r\n updateParam(key, value) {\r\n if (this.param && (key in this.param)) {\r\n // if uniqueIds change, find out deleted id and remove from size map\r\n if (key === \"uniqueIds\") {\r\n this.sizes.forEach((v, key) => {\r\n if (!value.includes(key)) {\r\n this.sizes.delete(key)\r\n }\r\n })\r\n }\r\n this.param[key] = value\r\n }\r\n }\r\n\r\n // save each size map by id\r\n saveSize(id, size) {\r\n this.sizes.set(id, size)\r\n\r\n // we assume size type is fixed at the beginning and remember first size value\r\n // if there is no size value different from this at next coming saving\r\n // we think it's a fixed size list, otherwise is dynamic size list\r\n if (this.calcType === CALC_TYPE.INIT) {\r\n this.fixedSizeValue = size\r\n this.calcType = CALC_TYPE.FIXED\r\n } else if (this.calcType === CALC_TYPE.FIXED && this.fixedSizeValue !== size) {\r\n this.calcType = CALC_TYPE.DYNAMIC\r\n // it's no use at all\r\n delete this.fixedSizeValue\r\n }\r\n\r\n // calculate the average size only in the first range\r\n if (this.calcType !== CALC_TYPE.FIXED && typeof this.firstRangeTotalSize !== \"undefined\") {\r\n if (this.sizes.size < Math.min(this.param.keeps, this.param.uniqueIds.length)) {\r\n this.firstRangeTotalSize = [...this.sizes.values()].reduce((acc, val) => acc + val, 0)\r\n this.firstRangeAverageSize = Math.round(this.firstRangeTotalSize / this.sizes.size)\r\n } else {\r\n // it's done using\r\n delete this.firstRangeTotalSize\r\n }\r\n }\r\n }\r\n\r\n // in some special situation (e.g. length change) we need to update in a row\r\n // try going to render next range by a leading buffer according to current direction\r\n handleDataSourcesChange() {\r\n let start = this.range.start\r\n\r\n if (this.isFront()) {\r\n start = start - LEADING_BUFFER\r\n } else if (this.isBehind()) {\r\n start = start + LEADING_BUFFER\r\n }\r\n\r\n start = Math.max(start, 0)\r\n\r\n this.updateRange(this.range.start, this.getEndByStart(start))\r\n }\r\n\r\n // when slot size change, we also need force update\r\n handleSlotSizeChange() {\r\n this.handleDataSourcesChange()\r\n }\r\n\r\n // calculating range on scroll\r\n handleScroll(offset) {\r\n this.direction = offset < this.offset ? DIRECTION_TYPE.FRONT : DIRECTION_TYPE.BEHIND\r\n this.offset = offset\r\n\r\n if (!this.param) {\r\n return\r\n }\r\n\r\n if (this.direction === DIRECTION_TYPE.FRONT) {\r\n this.handleFront()\r\n } else if (this.direction === DIRECTION_TYPE.BEHIND) {\r\n this.handleBehind()\r\n }\r\n }\r\n\r\n // ----------- public method end -----------\r\n\r\n handleFront() {\r\n const overs = this.getScrollOvers()\r\n // should not change range if start doesn't exceed overs\r\n if (overs > this.range.start) {\r\n return\r\n }\r\n\r\n // move up start by a buffer length, and make sure its safety\r\n const start = Math.max(overs - this.param.buffer, 0)\r\n this.checkRange(start, this.getEndByStart(start))\r\n }\r\n\r\n handleBehind() {\r\n const overs = this.getScrollOvers()\r\n // range should not change if scroll overs within buffer\r\n if (overs < this.range.start + this.param.buffer) {\r\n return\r\n }\r\n\r\n this.checkRange(overs, this.getEndByStart(overs))\r\n }\r\n\r\n // return the pass overs according to current scroll offset\r\n getScrollOvers() {\r\n // if slot header exist, we need subtract its size\r\n const offset = this.offset - this.param.slotHeaderSize\r\n if (offset <= 0) {\r\n return 0\r\n }\r\n\r\n // if is fixed type, that can be easily\r\n if (this.isFixedType()) {\r\n return Math.floor(offset / this.fixedSizeValue)\r\n }\r\n\r\n let low = 0\r\n let middle = 0\r\n let middleOffset = 0\r\n let high = this.param.uniqueIds.length\r\n\r\n while (low <= high) {\r\n // this.__bsearchCalls++\r\n middle = low + Math.floor((high - low) / 2)\r\n middleOffset = this.getIndexOffset(middle)\r\n\r\n if (middleOffset === offset) {\r\n return middle\r\n } else if (middleOffset < offset) {\r\n low = middle + 1\r\n } else if (middleOffset > offset) {\r\n high = middle - 1\r\n }\r\n }\r\n\r\n return low > 0 ? --low : 0\r\n }\r\n\r\n // return a scroll offset from given index, can efficiency be improved more here?\r\n // although the call frequency is very high, its only a superposition of numbers\r\n getIndexOffset(givenIndex) {\r\n if (!givenIndex) {\r\n return 0\r\n }\r\n\r\n let offset = 0\r\n let indexSize = 0\r\n for (let index = 0; index < givenIndex; index++) {\r\n // this.__getIndexOffsetCalls++\r\n indexSize = this.sizes.get(this.param.uniqueIds[index])\r\n offset = offset + (typeof indexSize === \"number\" ? indexSize : this.getEstimateSize())\r\n }\r\n\r\n // remember last calculate index\r\n this.lastCalcIndex = Math.max(this.lastCalcIndex, givenIndex - 1)\r\n this.lastCalcIndex = Math.min(this.lastCalcIndex, this.getLastIndex())\r\n\r\n return offset\r\n }\r\n\r\n // is fixed size type\r\n isFixedType() {\r\n return this.calcType === CALC_TYPE.FIXED\r\n }\r\n\r\n // return the real last index\r\n getLastIndex() {\r\n return this.param.uniqueIds.length - 1\r\n }\r\n\r\n // in some conditions range is broke, we need correct it\r\n // and then decide whether need update to next range\r\n checkRange(start, end) {\r\n const keeps = this.param.keeps\r\n const total = this.param.uniqueIds.length\r\n\r\n // data less than keeps, render all\r\n if (total <= keeps) {\r\n start = 0\r\n end = this.getLastIndex()\r\n } else if (end - start < keeps - 1) {\r\n // if range length is less than keeps, correct it base on end\r\n start = end - keeps + 1\r\n }\r\n\r\n if (this.range.start !== start) {\r\n this.updateRange(start, end)\r\n }\r\n }\r\n\r\n // setting to a new range and rerender\r\n updateRange(start, end) {\r\n this.range.start = start\r\n this.range.end = end\r\n this.range.padFront = this.getPadFront()\r\n this.range.padBehind = this.getPadBehind()\r\n this.callUpdate(this.getRange())\r\n }\r\n\r\n // return end base on start\r\n getEndByStart(start) {\r\n const theoryEnd = start + this.param.keeps - 1\r\n const truelyEnd = Math.min(theoryEnd, this.getLastIndex())\r\n return truelyEnd\r\n }\r\n\r\n // return total front offset\r\n getPadFront() {\r\n if (this.isFixedType()) {\r\n return this.fixedSizeValue * this.range.start\r\n } else {\r\n return this.getIndexOffset(this.range.start)\r\n }\r\n }\r\n\r\n // return total behind offset\r\n getPadBehind() {\r\n const end = this.range.end\r\n const lastIndex = this.getLastIndex()\r\n\r\n if (this.isFixedType()) {\r\n return (lastIndex - end) * this.fixedSizeValue\r\n }\r\n\r\n // if it's all calculated, return the exactly offset\r\n if (this.lastCalcIndex === lastIndex) {\r\n return this.getIndexOffset(lastIndex) - this.getIndexOffset(end)\r\n } else {\r\n // if not, use a estimated value\r\n return (lastIndex - end) * this.getEstimateSize()\r\n }\r\n }\r\n\r\n // get the item estimate size\r\n getEstimateSize() {\r\n return this.isFixedType() ? this.fixedSizeValue : (this.firstRangeAverageSize || this.param.estimateSize)\r\n }\r\n}\r\n","<script>\r\n import {afterUpdate, createEventDispatcher, onDestroy, onMount} from \"svelte\"\r\n\r\n export let horizontal = false\r\n export let uniqueKey\r\n export let type = \"item\"\r\n\r\n let resizeObserver\r\n let itemDiv\r\n let previousSize\r\n\r\n const dispatch = createEventDispatcher()\r\n const shapeKey = horizontal ? \"offsetWidth\" : \"offsetHeight\"\r\n\r\n onMount(() => {\r\n if (typeof ResizeObserver !== \"undefined\") {\r\n resizeObserver = new ResizeObserver(dispatchSizeChange)\r\n resizeObserver.observe(itemDiv)\r\n }\r\n })\r\n afterUpdate(dispatchSizeChange)\r\n onDestroy(() => {\r\n if (resizeObserver) {\r\n resizeObserver.disconnect()\r\n resizeObserver = null\r\n }\r\n })\r\n\r\n function dispatchSizeChange() {\r\n const size = itemDiv ? itemDiv[shapeKey] : 0\r\n if (size === previousSize) return\r\n previousSize = size\r\n dispatch(\"resize\", {id: uniqueKey, size, type})\r\n }\r\n</script>\r\n\r\n<div bind:this={itemDiv} class=\"virtual-scroll-item\">\r\n <slot/>\r\n</div>\r\n","<script>\r\n import Virtual from \"./virtual\"\r\n import Item from \"./Item.svelte\"\r\n import {createEventDispatcher, onDestroy, onMount} from \"svelte\"\r\n\r\n /**\r\n * Unique key for getting data from `data`\r\n * @type {string}\r\n */\r\n export let key = \"id\"\r\n /**\r\n * Source for list\r\n * @type {Array<any>}\r\n */\r\n export let data\r\n /**\r\n * Count of rendered items\r\n * @type {number}\r\n */\r\n export let keeps = 30\r\n /**\r\n * Estimate size of each item, needs for smooth scrollbar\r\n * @type {number}\r\n */\r\n export let estimateSize = 50\r\n /**\r\n * Scroll direction\r\n * @type {boolean}\r\n */\r\n export let isHorizontal = false\r\n /**\r\n * scroll position start index\r\n */\r\n export let start = 0\r\n /**\r\n * scroll position offset\r\n */\r\n export let offset = 0\r\n /**\r\n * Let virtual list using global document to scroll through the list\r\n * @type {boolean}\r\n */\r\n export let pageMode = false\r\n /**\r\n * The threshold to emit `top` event, attention to multiple calls.\r\n * @type {number}\r\n */\r\n export let topThreshold = 0\r\n /**\r\n * The threshold to emit `bottom` event, attention to multiple calls.\r\n * @type {number}\r\n */\r\n export let bottomThreshold = 0\r\n\r\n let displayItems = []\r\n let paddingStyle\r\n let directionKey = isHorizontal ? \"scrollLeft\" : \"scrollTop\"\r\n let range = null\r\n let virtual = new Virtual({\r\n slotHeaderSize: 0,\r\n slotFooterSize: 0,\r\n keeps: keeps,\r\n estimateSize: estimateSize,\r\n buffer: Math.round(keeps / 3), // recommend for a third of keeps\r\n uniqueIds: getUniqueIdFromDataSources(),\r\n }, onRangeChanged)\r\n let root\r\n let shepherd\r\n const dispatch = createEventDispatcher()\r\n\r\n /**\r\n * @type {(id: number) => number}\r\n */\r\n export function getSize(id) {\r\n return virtual.sizes.get(id)\r\n }\r\n\r\n /**\r\n * Count of items\r\n * @type {() => number}\r\n */\r\n export function getSizes() {\r\n return virtual.sizes.size\r\n }\r\n\r\n /**\r\n * @type {() => number}\r\n */\r\n export function getOffset() {\r\n if (pageMode) {\r\n return document.documentElement[directionKey] || document.body[directionKey]\r\n } else {\r\n return root ? Math.ceil(root[directionKey]) : 0\r\n }\r\n }\r\n\r\n /**\r\n * @type {() => number}\r\n */\r\n export function getClientSize() {\r\n const key = isHorizontal ? \"clientWidth\" : \"clientHeight\"\r\n if (pageMode) {\r\n return document.documentElement[key] || document.body[key]\r\n } else {\r\n return root ? Math.ceil(root[key]) : 0\r\n }\r\n }\r\n\r\n /**\r\n * @type {() => number}\r\n */\r\n export function getScrollSize() {\r\n const key = isHorizontal ? \"scrollWidth\" : \"scrollHeight\"\r\n if (pageMode) {\r\n return document.documentElement[key] || document.body[key]\r\n } else {\r\n return root ? Math.ceil(root[key]) : 0\r\n }\r\n }\r\n\r\n /**\r\n * @type {() => void}\r\n */\r\n export function updatePageModeFront() {\r\n if (root) {\r\n const rect = root.getBoundingClientRect()\r\n const {defaultView} = root.ownerDocument\r\n const offsetFront = isHorizontal ? (rect.left + defaultView.pageXOffset) : (rect.top + defaultView.pageYOffset)\r\n virtual.updateParam(\"slotHeaderSize\", offsetFront)\r\n }\r\n }\r\n\r\n /**\r\n * @type {(offset: number) => number}\r\n */\r\n export function scrollToOffset(offset) {\r\n if (pageMode) {\r\n document.body[directionKey] = offset\r\n document.documentElement[directionKey] = offset\r\n } else if (root) {\r\n root[directionKey] = offset\r\n }\r\n }\r\n\r\n /**\r\n * @type {(index: number) => void}\r\n */\r\n export function scrollToIndex(index) {\r\n if (index >= data.length - 1) {\r\n scrollToBottom()\r\n } else {\r\n const offset = virtual.getOffset(index)\r\n scrollToOffset(offset)\r\n }\r\n }\r\n\r\n /**\r\n * @type {() => void}\r\n */\r\n export function scrollToBottom() {\r\n if (shepherd) {\r\n const offset = shepherd[isHorizontal ? \"offsetLeft\" : \"offsetTop\"]\r\n scrollToOffset(offset)\r\n\r\n // check if it's really scrolled to the bottom\r\n // maybe list doesn't render and calculate to last range,\r\n // so we need retry in next event loop until it really at bottom\r\n setTimeout(() => {\r\n if (getOffset() + getClientSize() + 1 < getScrollSize()) {\r\n scrollToBottom()\r\n }\r\n }, 3)\r\n }\r\n }\r\n\r\n onMount(() => {\r\n if (start) {\r\n scrollToIndex(start)\r\n } else if (offset) {\r\n scrollToOffset(offset)\r\n }\r\n\r\n if (pageMode) {\r\n updatePageModeFront()\r\n\r\n document.addEventListener(\"scroll\", onScroll, {\r\n passive: false,\r\n })\r\n }\r\n })\r\n\r\n onDestroy(() => {\r\n virtual.destroy()\r\n if (pageMode) {\r\n document.removeEventListener(\"scroll\", onScroll)\r\n }\r\n })\r\n\r\n function getUniqueIdFromDataSources() {\r\n return data.map((dataSource) => dataSource[key])\r\n }\r\n\r\n function onItemResized(event) {\r\n const {id, size, type} = event.detail\r\n if (type === \"item\")\r\n virtual.saveSize(id, size)\r\n else if (type === \"slot\") {\r\n if (id === \"header\")\r\n virtual.updateParam(\"slotHeaderSize\", size)\r\n else if (id === \"footer\")\r\n virtual.updateParam(\"slotFooterSize\", size)\r\n\r\n // virtual.handleSlotSizeChange()\r\n }\r\n }\r\n\r\n function onRangeChanged(range_) {\r\n range = range_\r\n paddingStyle = paddingStyle = isHorizontal ? `0px ${range.padBehind}px 0px ${range.padFront}px` : `${range.padFront}px 0px ${range.padBehind}px`\r\n displayItems = data.slice(range.start, range.end + 1)\r\n }\r\n\r\n function onScroll(event) {\r\n const offset = getOffset()\r\n const clientSize = getClientSize()\r\n const scrollSize = getScrollSize()\r\n\r\n // \biOS scroll-spring-back behavior will make direction mistake\r\n if (offset < 0 || (offset + clientSize > scrollSize) || !scrollSize) {\r\n return\r\n }\r\n\r\n virtual.handleScroll(offset)\r\n emitEvent(offset, clientSize, scrollSize, event)\r\n }\r\n\r\n function emitEvent(offset, clientSize, scrollSize, event) {\r\n dispatch(\"scroll\", {event, range: virtual.getRange()})\r\n\r\n if (virtual.isFront() && !!data.length && (offset - topThreshold <= 0)) {\r\n dispatch(\"top\")\r\n } else if (virtual.isBehind() && (offset + clientSize + bottomThreshold >= scrollSize)) {\r\n dispatch(\"bottom\")\r\n }\r\n }\r\n\r\n $: scrollToOffset(offset)\r\n $: scrollToIndex(start)\r\n $: handleKeepsChange(keeps)\r\n\r\n function handleKeepsChange(keeps) {\r\n virtual.updateParam(\"keeps\", keeps)\r\n virtual.handleSlotSizeChange()\r\n }\r\n\r\n $: handleDataSourcesChange(data)\r\n\r\n async function handleDataSourcesChange(data) {\r\n virtual.updateParam(\"uniqueIds\", getUniqueIdFromDataSources())\r\n virtual.handleDataSourcesChange()\r\n }\r\n</script>\r\n\r\n<div bind:this={root} on:scroll={onScroll} style=\"overflow-y: auto; height: inherit\">\r\n {#if $$slots.header}\r\n <Item on:resize={onItemResized} type=\"slot\" uniqueKey=\"header\">\r\n <slot name=\"header\"/>\r\n </Item>\r\n {/if}\r\n <div style=\"padding: {paddingStyle}\">\r\n {#each displayItems as dataItem (dataItem[key])}\r\n <Item\r\n on:resize={onItemResized}\r\n uniqueKey={dataItem[key]}\r\n horizontal={isHorizontal}\r\n type=\"item\">\r\n <slot data={dataItem}/>\r\n </Item>\r\n {/each}\r\n </div>\r\n {#if $$slots.footer}\r\n <Item on:resize={onItemResized} type=\"slot\" uniqueKey=\"footer\">\r\n <slot name=\"footer\"/>\r\n </Item>\r\n {/if}\r\n <div bind:this={shepherd} class=\"shepherd\"\r\n style=\"width: {isHorizontal ? '0px' : '100%'};height: {isHorizontal ? '100%' : '0px'}\"></div>\r\n</div>\r\n","<script>\r\n\r\n import { ApplicationShell } from \"@typhonjs-fvtt/runtime/svelte/component/core\";\r\n import { localize } from '@typhonjs-fvtt/runtime/svelte/helper';\r\n import { getContext } from \"svelte\";\r\n\r\n import DatabaseEntry from \"./DatabaseEntry.svelte\";\r\n import VirtualScroll from \"svelte-virtual-scroll-list\"\r\n\r\n import SequencerDatabase from \"../../modules/sequencer-database.js\";\r\n import { databaseStore } from \"./DatabaseStore.js\";\r\n import * as lib from \"../../lib/lib.js\";\r\n import CONSTANTS from \"../../constants.js\";\r\n\r\n const { application } = getContext(\"#external\");\r\n\r\n export let elementRoot;\r\n\r\n let entries = [];\r\n\r\n let filteredEntries = [];\r\n\r\n const selectedPackStore = databaseStore.selectedPackStore;\r\n const packStore = databaseStore.packStore;\r\n const metadata = databaseStore.metadata;\r\n const allRanges = databaseStore.allRanges;\r\n const subLists = databaseStore.subLists;\r\n const listView = databaseStore.listView;\r\n const visibleTreeStore = databaseStore.visibleTreeStore;\r\n const search = databaseStore.search;\r\n const cleanSearchStore = databaseStore.cleanSearchStore;\r\n const searchRegex = databaseStore.searchRegex;\r\n const entriesStore = SequencerDatabase.entriesStore;\r\n\r\n listView.set(game.settings.get(CONSTANTS.MODULE_NAME, \"db-list-view\"));\r\n\r\n $: game.settings.set(CONSTANTS.MODULE_NAME, \"db-list-view\", $listView);\r\n\r\n $: {\r\n $entriesStore;\r\n const specificRanges = $allRanges\r\n ? Sequencer.Database.publicFlattenedEntries\r\n : Sequencer.Database.publicFlattenedSimpleEntries;\r\n entries = specificRanges.map(\r\n (entry) => {\r\n return {\r\n pack: entry.split(\".\")[0],\r\n entry: entry\r\n };\r\n }\r\n );\r\n }\r\n\r\n $: {\r\n const searchParts = $cleanSearchStore.split('|');\r\n filteredEntries = entries.filter((part) => {\r\n const matchParts = lib.make_array_unique(part.entry.match($searchRegex) || []);\r\n return (\r\n ($selectedPackStore === \"all\" || $selectedPackStore === part.pack) &&\r\n ($search === \"\" || matchParts.length >= searchParts.length)\r\n );\r\n });\r\n }\r\n\r\n</script>\r\n\r\n<svelte:options accessors={true}/>\r\n\r\n<ApplicationShell bind:elementRoot>\r\n\r\n\t<div class=\"sequencer-database-content\">\r\n\r\n\t\t<div class=\"sequencer-database-header\">\r\n\t\t\t<select bind:value={$selectedPackStore} name=\"pack-select\">\r\n\t\t\t\t<option value=\"all\">{localize(\"SEQUENCER.Database.AllPacks\")}</option>\r\n\t\t\t\t{#each $packStore as pack, index}\r\n\t\t\t\t\t<option>{ pack }</option>\r\n\t\t\t\t{/each}\r\n\t\t\t</select>\r\n\t\t\t<input bind:value={$search} class=\"ml-2\" placeholder='{localize(\"SEQUENCER.Database.Search\")}' type=\"text\">\r\n\t\t\t<input bind:checked={$allRanges} class=\"ml-2\" id=\"database-all-ranges\" type=\"checkbox\">\r\n\t\t\t<label class=\"all-ranges-label\" for=\"database-all-ranges\">{localize(\"SEQUENCER.Database.ShowAllRanges\")}</label>\r\n\t\t\t<input bind:checked={$subLists} class=\"ml-2\" id=\"include-sub-lists\" type=\"checkbox\">\r\n\t\t\t<label class=\"all-ranges-label\" for=\"include-sub-lists\">{localize(\"SEQUENCER.Database.ShowSubLists\")}</label>\r\n\t\t\t<input bind:checked={$listView} class=\"ml-2\" id=\"treeview\" type=\"checkbox\">\r\n\t\t\t<label class=\"all-ranges-label\" for=\"treeview\">{localize(\"SEQUENCER.Database.ListView\")}</label>\r\n\t\t</div>\r\n\r\n\t\t<div class=\"sequencer-database-entries-container\">\r\n\r\n\t\t\t{#if $listView}\r\n <div class=\"sequencer-database-entries\">\r\n <VirtualScroll\r\n data={filteredEntries}\r\n key=\"entry\"\r\n let:data\r\n >\r\n <DatabaseEntry entry={data.entry}/>\r\n </VirtualScroll>\r\n </div>\r\n\t\t\t{:else}\r\n <div class=\"sequencer-database-entries-tree\">\r\n <VirtualScroll\r\n data={$visibleTreeStore}\r\n key=\"fullPath\"\r\n let:data\r\n >\r\n <svelte:component this={data.class} {data}/>\r\n </VirtualScroll>\r\n </div>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<div class=\"sequencer-database-player-container\">\r\n\t\t\t\t<video autoplay bind:this={databaseStore.elements.player} class=\"database-player\" height=\"335\" loop\r\n\t\t\t\t\t\t\t on:mouseenter={() => { databaseStore.elements.player.controls = true; }}\r\n\t\t\t\t\t\t\t on:mouseleave={() => { databaseStore.elements.player.controls = false; }}\r\n\t\t\t\t\t\t\t preload\r\n\t\t\t\t\t\t\t width=\"335\"\r\n\t\t\t\t>\r\n\t\t\t\t</video>\r\n\t\t\t\t<img bind:this={databaseStore.elements.image} class=\"database-image hidden\">\r\n\t\t\t\t<audio bind:this={databaseStore.elements.audio} class=\"database-audio hidden\"\r\n\t\t\t\t\t\t\t on:mouseenter={() => { databaseStore.elements.audio.controls = true; }}\r\n\t\t\t\t\t\t\t on:mouseleave={() => { databaseStore.elements.audio.controls = false; }}\r\n\t\t\t\t>\r\n\t\t\t\t\t<source type=\"audio/ogg\">\r\n\t\t\t\t</audio>\r\n\t\t\t\t<div class=\"sequencer-database-metadata-container\">\r\n\t\t\t\t\t{#if $metadata}\r\n\t\t\t\t\t\tType: {$metadata.type} | Duration: {$metadata.duration}\r\n\t\t\t\t\t{:else}\r\n\t\t\t\t\t\tNo file loaded...\r\n\t\t\t\t\t{/if}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\r\n\t\t</div>\r\n\r\n\t</div>\r\n\r\n</ApplicationShell>\r\n\r\n<style lang=\"scss\">\r\n\r\n .sequencer-database {\r\n &-content {\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n &-header {\r\n display: flex;\r\n align-items: center;\r\n flex-direction: row;\r\n\r\n > select {\r\n\t\t\t\tflex: 0 1 auto;\r\n border-radius: 5px 0 0 5px;\r\n border-right: 0;\r\n height: 28px;\r\n }\r\n\r\n > input[type=\"text\"] {\r\n border-radius: 0 5px 5px 0;\r\n padding-left: 0.5rem;\r\n height: 28px;\r\n }\r\n\r\n\t\t\t> label {\r\n\t\t\t\tflex: 1 0 auto;\r\n padding-right: 0.25rem;\r\n\t\t\t}\r\n }\r\n\r\n &-entries-container {\r\n padding-top: 0.5rem;\r\n max-height: calc(420px - 5rem);\r\n display: flex;\r\n }\r\n\r\n &-entries {\r\n height: 339px;\r\n flex: 1;\r\n margin-right: 0.5rem;\r\n\r\n\t\t\t& :global(.virtual-scroll-item) {\r\n padding: 2px;\r\n margin-right: 5px;\r\n border-radius: 4px;\r\n }\r\n\r\n & :global(.virtual-scroll-item):nth-child(odd) {\r\n background-color: rgba(0, 0, 0, 0.1);\r\n }\r\n }\r\n\r\n &-entries-tree {\r\n height: 339px;\r\n flex: 1;\r\n margin-right: 0.5rem;\r\n\r\n & :global(.virtual-scroll-item) {\r\n padding: 2px;\r\n margin-right: 5px;\r\n border-radius: 4px;\r\n min-height: 0px;\r\n max-height: 17px;\r\n height: auto;\r\n }\r\n }\r\n\r\n &-player-container {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n width: 335px;\r\n height: 335px;\r\n\r\n & > * {\r\n width: 320px;\r\n height: 320px;\r\n border-radius: 5px;\r\n }\r\n }\r\n\r\n &-metadata-container {\r\n text-align: center;\r\n margin-top: 5px;\r\n flex: 0;\r\n }\r\n }\r\n\r\n .hidden {\r\n display: none;\r\n }\r\n\r\n .database-player-container {\r\n padding: 5px;\r\n width: 355px;\r\n height: 355px;\r\n }\r\n\r\n .database-player {\r\n background-color: #999999;\r\n padding: 10px;\r\n max-width: 320px;\r\n height: 320px;\r\n max-height: 320px;\r\n\t\tmin-height: 320px;\r\n }\r\n\r\n .database-image {\r\n max-width: 320px;\r\n height: 320px;\r\n max-height: 320px;\r\n min-height: 320px;\r\n }\r\n\r\n .database-audio {\r\n max-width: 320px;\r\n height: 320px;\r\n max-height: 320px;\r\n min-height: 320px;\r\n position: absolute;\r\n bottom: 0;\r\n }\r\n\r\n</style>\r\n","import { SvelteApplication } from \"@typhonjs-fvtt/runtime/svelte/application\";\nimport DatabaseShell from \"./database-shell.svelte\";\n\nexport class DatabaseViewerApp extends SvelteApplication {\n static get defaultOptions() {\n return foundry.utils.mergeObject(super.defaultOptions, {\n title: game.i18n.localize(\"SEQUENCER.Database.Title\"),\n classes: [\"dialog\"],\n width: 900,\n height: 425,\n svelte: {\n class: DatabaseShell,\n target: document.body,\n },\n });\n }\n\n static getActiveApp() {\n return Object.values(ui.windows).find((app) => {\n return (\n app instanceof this && app._state > Application.RENDER_STATES.CLOSED\n );\n });\n }\n\n static async show(options = {}) {\n const existingApp = this.getActiveApp();\n if (existingApp) return existingApp.render(false, { focus: true });\n return new Promise((resolve) => {\n options.resolve = resolve;\n new this(options).render(true, { focus: true });\n });\n }\n}\n","<script>\r\n import { localize } from '@typhonjs-fvtt/runtime/svelte/helper';\r\n import * as lib from \"/lib/lib.js\"\r\n\r\n async function openSettings(){\r\n\r\n const settings = new SettingsConfig();\r\n\r\n await settings.render(true)\r\n\r\n await lib.wait(75);\r\n\r\n const focusElement = settings.element.find('select[name=\"sequencer.permissions-effect-create\"]');\r\n\r\n settings.element.find(\"div.scrollable\").scrollTop(focusElement.offset().top)\r\n\r\n await lib.wait(250);\r\n\r\n focusElement.css(\"box-shadow\", \"rgba(200, 64, 67, 0.75) inset 0 0 10px\");\r\n\r\n await lib.wait(5000);\r\n\r\n focusElement.css(\"box-shadow\", \"none\");\r\n\r\n }\r\n\r\n</script>\r\n\r\n<div class=\"howto-container\">\r\n\t<p>{@html localize(\"SEQUENCER.HowTo.Welcome\")}</p>\r\n\t<p>{@html localize(\"SEQUENCER.HowTo.Explanation\")}</p>\r\n\t{#if game.user.isGM}\r\n\t\t<p>{@html localize(\"SEQUENCER.HowTo.PermissionsExplanation\")}</p>\r\n\t\t<button type=\"button\" class=\"w-100 open-module-settings\" on:click={openSettings}>\r\n\t\t\t<i class=\"fas fa-plug\"></i> {@html localize(\"SEQUENCER.HowTo.OpenModuleSettings\")}\r\n\t\t</button>\r\n\t{/if}\r\n\t<p>{@html localize(\"SEQUENCER.HowTo.PlayerExplanation\")}</p>\r\n\t<p>{@html localize(\"SEQUENCER.HowTo.LayerExplanation\")}</p>\r\n\t<ol>\r\n\t\t<li>\r\n\t\t\t<strong>{@html localize(\"SEQUENCER.HowTo.Click\")}</strong><br>\r\n\t\t\t{@html localize(\"SEQUENCER.HowTo.ClickLabel\")}\r\n\t\t</li>\r\n\t\t<li>\r\n\t\t\t<strong>{@html localize(\"SEQUENCER.HowTo.ClickDrag\")}</strong><br>\r\n\t\t\t{@html localize(\"SEQUENCER.HowTo.ClickDragLabel\")}\r\n\t\t</li>\r\n\t\t<li>\r\n\t\t\t<strong>{@html localize(\"SEQUENCER.HowTo.Shift\")}</strong><br>\r\n\t\t\t{@html localize(\"SEQUENCER.HowTo.ShiftLabel\")}\r\n\t\t</li>\r\n\t\t<li>\r\n\t\t\t<strong>{@html localize(\"SEQUENCER.HowTo.ShiftControl\")}</strong><br>\r\n\t\t\t{@html localize(\"SEQUENCER.HowTo.ShiftControlLabel\")}\r\n\t\t</li>\r\n\t\t<li>\r\n\t\t\t<strong>{@html localize(\"SEQUENCER.HowTo.MoreToCome\")}</strong>\r\n\t\t</li>\r\n\t</ol>\r\n</div>\r\n\r\n<style lang=\"scss\">\r\n\r\n .howto-container{\r\n min-width: 320px;\r\n max-width: 320px;\r\n min-height: 563px;\r\n\r\n li{\r\n list-style: none;\r\n margin-bottom: 0.5rem;\r\n }\r\n }\r\n\r\n</style>\r\n","<script>\r\n import { localize } from '@typhonjs-fvtt/runtime/svelte/helper';\r\n\r\n export let activeTab;\r\n export let tabs;\r\n export let underscore = false;\r\n export let separateElements = false;\r\n\r\n</script>\r\n\r\n<nav class=\"tabs\" data-group=\"primary\" style={$$props.style}>\r\n\t{#each tabs.filter(tab => !tab.hidden) as tab, index (tab.value)}\r\n\t\t{#if separateElements && index > 0}\r\n\t\t\t<div style=\"border-right: 1px solid rgba(0,0,0,0.5); margin: 0 10px;\"></div>\r\n\t\t{/if}\r\n\t\t<div on:click={() => { activeTab = tab.value}}\r\n\t\t\t\t class=\"item item-piles-flexrow item-piles-clickable-link\"\r\n\t\t\t\t class:underscore={underscore}\r\n\t\t\t\t class:active={activeTab === tab.value}\r\n\t\t\t\t data-tab=\"rest\">\r\n\t\t\t{#if tab.icon} <i class=\"icon {tab.icon}\"></i> {/if}\r\n\t\t\t{localize(tab.label)}\r\n\t\t</div>\r\n\t{/each}\r\n</nav>\r\n\r\n\r\n<style lang=\"scss\">\r\n\r\n .tabs {\r\n\t\tflex: 0;\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.25);\r\n margin-bottom: 0.5rem;\r\n padding-bottom: 0.5rem;\r\n }\r\n\r\n .item {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n border-bottom: 2px solid transparent;\r\n\r\n &.active {\r\n text-shadow: 0 0 10px rgba(255,0,0,1);\r\n\r\n &.underscore {\r\n text-shadow: none;\r\n border-bottom: 2px solid rgba(125, 0, 0, 0.5);\r\n }\r\n }\r\n }\r\n\r\n .icon {\r\n margin-right: 0.25rem;\r\n }\r\n\r\n</style>\r\n","import { get, writable } from \"svelte/store\";\nimport CONSTANTS from \"../constants.js\";\n\nconst SequenceManager = {\n VisibleEffects: writable({}),\n RunningSounds: writable({}),\n RunningSequences: writable({}),\n};\n\n/* ------------------ Effects ------------------ */\nSequenceManager.VisibleEffects.get = (id) => {\n return get(SequenceManager.VisibleEffects)[id];\n};\n\nSequenceManager.VisibleEffects.add = (id, data) => {\n SequenceManager.VisibleEffects.update((effects) => {\n effects[id] = data;\n return effects;\n });\n};\n\nSequenceManager.VisibleEffects.delete = (id) => {\n SequenceManager.VisibleEffects.update((effects) => {\n delete effects[id];\n return effects;\n });\n};\n\nSequenceManager.VisibleEffects.values = () => {\n return Object.values(get(SequenceManager.VisibleEffects));\n};\n\n/* ------------------ Sounds ------------------ */\nSequenceManager.RunningSounds.get = (id) => {\n return get(SequenceManager.RunningSounds)[id];\n};\n\nSequenceManager.RunningSounds.add = (id, data) => {\n SequenceManager.RunningSounds.update((effects) => {\n effects[id] = data;\n return effects;\n });\n};\n\nSequenceManager.RunningSounds.delete = (id) => {\n SequenceManager.RunningSounds.update((effects) => {\n delete effects[id];\n return effects;\n });\n};\n\nSequenceManager.RunningSounds.values = () => {\n return Object.values(get(SequenceManager.RunningSounds));\n};\n\nSequenceManager.RunningSounds.keys = () => {\n return Object.keys(get(SequenceManager.RunningSounds));\n};\n\n/* ----------------- Sequences ------------------ */\nSequenceManager.RunningSequences.get = (id) => {\n return get(SequenceManager.RunningSequences)[id];\n};\n\nSequenceManager.RunningSequences.add = (id, sequence) => {\n SequenceManager.RunningSequences.update((sequences) => {\n sequences[id] = sequence;\n return sequences;\n });\n};\n\nSequenceManager.RunningSequences.delete = (id) => {\n SequenceManager.RunningSequences.update((sequences) => {\n delete sequences[id];\n return sequences;\n });\n};\n\nSequenceManager.RunningSequences.clearFinishedSequences = () => {\n SequenceManager.RunningSequences.update((sequences) => {\n for (const sequence of Object.values(sequences)) {\n if (\n get(sequence.status) === CONSTANTS.STATUS.COMPLETE ||\n get(sequence.status) === CONSTANTS.STATUS.ABORTED\n ) {\n delete sequences[sequence.id];\n }\n }\n return sequences;\n });\n};\n\nSequenceManager.RunningSequences.stopAll = () => {\n SequenceManager.RunningSequences.update((sequences) => {\n for (const sequence of Object.values(sequences)) {\n sequence._abort();\n }\n return sequences;\n });\n};\n\nSequenceManager.RunningSequences.values = () => {\n return Object.values(get(SequenceManager.RunningSequences));\n};\n\nexport default SequenceManager;\n","export default class ColorMatrixFilter extends globalThis.PIXI.filters\n .ColorMatrixFilter {\n /**\n * Properties & default values:\n * - hue [false]\n * - brightness [1]\n * - contrast [1]\n * - saturate [1]\n */\n constructor(inData) {\n super();\n this.isValid = true;\n this.values = {};\n for (let [key, value] of Object.entries(inData)) {\n this.setValue(key, value);\n if (!this.isValid) break;\n }\n }\n\n setValue(key, value) {\n try {\n this.values[key] = value;\n this[key](value, true);\n } catch (err) {\n ui.notifications.warn(\n `Sequencer | ${this.constructor.name} | Could not set property ${key}`\n );\n }\n }\n}\n","export default class BlurFilter extends globalThis.PIXI.filters.BlurFilter {\n /**\n * Properties & default values:\n * - strength [8]\n * - blur [2]\n * - blurX [2]\n * - blurY [2]\n * - quality [4]\n * - resolution [PIXI.settings.FILTER_RESOLUTION]\n * - kernelSize [5]\n */\n constructor(inData = {}) {\n inData = foundry.utils.mergeObject(\n {\n strength: 1,\n quality: 4,\n resolution: PIXI.settings.FILTER_RESOLUTION,\n kernelSize: 5,\n },\n inData\n );\n\n super(...Object.values(inData));\n\n this.isValid = true;\n for (let [key, value] of Object.entries(inData)) {\n try {\n this[key] = value;\n } catch (err) {\n ui.notifications.warn(\n `Sequencer | ${this.constructor.name} | Could not set property ${key}`\n );\n this.isValid = false;\n }\n }\n }\n}\n","export default class NoiseFilter extends globalThis.PIXI.filters.NoiseFilter {\n /**\n * Properties & default values:\n * - noise [0.5]\n * - seed [Math.random()]\n */\n constructor(inData = {}) {\n super();\n\n inData = foundry.utils.mergeObject(\n {\n noise: 0.5,\n seed: Math.random(),\n },\n inData\n );\n\n this.isValid = true;\n for (let [key, value] of Object.entries(inData)) {\n try {\n this[key] = value;\n } catch (err) {\n ui.notifications.warn(\n `Sequencer | ${this.constructor.name} | Could not set property ${key}`\n );\n this.isValid = false;\n }\n }\n }\n}\n","export default class GlowFilter extends globalThis.PIXI.filters.GlowFilter {\n /**\n * Properties & default values:\n * - distance [10]\n * - outerStrength [4]\n * - innerStrength [0]\n * - color [0xffffff]\n * - quality [0.1]\n * - knockout [false]\n */\n constructor(inData = {}) {\n inData = foundry.utils.mergeObject(\n {\n distance: 10,\n outerStrength: 4,\n innerStrength: 0,\n color: 0xffffff,\n quality: 0.1,\n knockout: false,\n },\n inData\n );\n\n super(inData);\n\n this.isValid = true;\n }\n}\n","let shader = `\nuniform sampler2D uSampler;\nvarying vec2 vTextureCoord;\nfloat alpha;\n\nvoid main() {\n vec4 pixel = texture2D(uSampler, vTextureCoord);\n alpha = smoothstep(0.6,1.0,pixel.a);\n gl_FragColor = vec4(alpha, alpha, alpha, pixel.a);\n}\n`;\n\nexport default class ClipFilter extends PIXI.Filter {\n constructor() {\n super(null, shader);\n }\n}\n","import ColorMatrixFilter from \"./filters/color-matrix-filter.js\";\nimport BlurFilter from \"./filters/blur-filter.js\";\nimport NoiseFilter from \"./filters/noise-filter.js\";\nimport GlowFilter from \"./filters/glow-filter.js\";\nimport ClipFilter from \"./filters/clip-filter.js\";\n\nconst filters = {\n ColorMatrix: ColorMatrixFilter,\n Blur: BlurFilter,\n Noise: NoiseFilter,\n Glow: GlowFilter,\n Clip: ClipFilter,\n};\n\nexport default filters;\n","import * as lib from \"../lib/lib.js\";\n\nconst SequencerAnimationEngine = {\n _animations: [],\n _debug: undefined,\n _deltas: [],\n\n ticker: false,\n dt: 0,\n\n isRunning: false,\n\n addAnimation(origin, attributes = [], timeDifference = 0) {\n if (!Array.isArray(attributes)) attributes = [attributes];\n\n return new Promise((resolve) => {\n this._animations.push({\n origin,\n attributes: attributes.map((attribute) => {\n attribute.targetId =\n lib.get_object_identifier(attribute.target) +\n \"-\" +\n attribute.propertyName;\n attribute.started = false;\n attribute.initialized = false;\n attribute.finishing = false;\n attribute.complete = false;\n attribute.progress = 0;\n attribute.value = 0;\n\n attribute.duration = attribute.duration ?? 0;\n attribute.durationDone = timeDifference ?? 0;\n\n if (attribute?.looping) {\n attribute.loopDuration =\n attribute.loopDuration ?? attribute.duration ?? 0;\n attribute.loopDurationDone =\n timeDifference % attribute.loopDuration ?? 0;\n attribute.loops = attribute.loops ?? 0;\n attribute.loopsDone = Math.floor(\n attribute.durationDone / attribute.duration\n );\n attribute.index = attribute.loopsDone % attribute.values.length;\n attribute.nextIndex =\n (attribute.loopsDone + 1) % attribute.values.length;\n if (!attribute.pingPong && attribute.nextIndex === 0) {\n attribute.index = 0;\n attribute.nextIndex = 1;\n }\n }\n return attribute;\n }),\n complete: false,\n totalDt: timeDifference,\n resolve: resolve,\n });\n if (!this.ticker || !this.ticker.started) {\n this.start();\n }\n lib.debug(`Added animations to Animation Engine`);\n });\n },\n\n endAnimations(target) {\n this._animations = this._animations.filter(\n (animation) => animation.origin !== target\n );\n },\n\n start() {\n lib.debug(`Animation Engine Started`);\n if (!this.ticker) {\n this.ticker = new PIXI.Ticker();\n this.ticker.add(this.nextFrame.bind(this));\n }\n this.ticker.start();\n },\n\n nextFrame() {\n if (this._animations.length === 0) {\n lib.debug(`Animation Engine Paused`);\n this.ticker.stop();\n this._startingValues = {};\n return;\n }\n\n this._animations.forEach((animation) => this._animate(animation));\n this._animations = this._animations.filter(\n (animation) => !animation.complete\n );\n this._applyDeltas();\n for (const targetId of Object.keys(this._startingValues)) {\n if (\n !this._animations.some((_a) =>\n _a.attributes.some((_b) => _b.targetId === targetId)\n )\n ) {\n delete this._startingValues[targetId];\n }\n }\n },\n\n _startingValues: {},\n\n _applyDeltas() {\n const deltas = [];\n\n for (const animation of this._animations) {\n for (const attribute of animation.attributes) {\n if (!attribute.started || attribute.complete) continue;\n\n if (attribute.finishing) {\n attribute.complete = true;\n }\n\n let delta = deltas.find(\n (delta) =>\n attribute.targetId === delta.targetId &&\n attribute.setPropertyName === delta.setPropertyName\n );\n\n if (!delta) {\n delta = {\n targetId: attribute.targetId,\n target: attribute.target,\n getPropertyName:\n attribute.getPropertyName ?? attribute.propertyName,\n setPropertyName: attribute.propertyName,\n value: 0,\n };\n\n if (attribute.target instanceof PIXI.filters.ColorMatrixFilter) {\n delta.value = attribute.previousValue;\n }\n\n deltas.push(delta);\n }\n\n delta.value += attribute.delta;\n }\n }\n\n for (let delta of deltas) {\n const finalValue =\n lib.deep_get(delta.target, delta.getPropertyName) + delta.value;\n\n try {\n lib.deep_set(delta.target, delta.setPropertyName, finalValue);\n } catch (err) {\n //console.log(err)\n }\n }\n },\n\n _animate(animation) {\n animation.totalDt += this.ticker.elapsedMS;\n\n animation.attributes\n .filter((attribute) => !attribute.complete)\n .forEach((attribute) =>\n this._animateAttribute(animation.totalDt, attribute)\n );\n\n animation.complete =\n animation.attributes.filter((attribute) => !attribute.complete).length ===\n 0;\n\n if (animation.complete) {\n animation.resolve();\n }\n },\n\n _animateAttribute(totalDt, attribute) {\n if (totalDt < attribute.delay) return;\n\n if (!attribute.started) {\n const funkyProperty =\n attribute.propertyName.includes(\"scale\") ||\n attribute.propertyName.includes(\"alpha\");\n\n if (\n this._startingValues[attribute.targetId] === undefined ||\n attribute.absolute\n ) {\n const getProperty = funkyProperty || attribute.from === undefined;\n\n this._startingValues[attribute.targetId] = getProperty\n ? lib.deep_get(\n attribute.target,\n attribute.getPropertyName ?? attribute.propertyName\n )\n : attribute.from;\n\n if (!attribute.propertyName.includes(\"scale\")) {\n lib.deep_set(\n attribute.target,\n attribute.propertyName,\n this._startingValues[attribute.targetId]\n );\n }\n }\n\n attribute.previousValue = this._startingValues[attribute.targetId];\n\n if (attribute?.looping) {\n attribute.values = attribute.values.map((value) => {\n return value + attribute.previousValue - (funkyProperty ? 1.0 : 0);\n });\n } else if (attribute.from === undefined) {\n attribute.from = attribute.previousValue;\n }\n }\n\n attribute.started = true;\n\n if (attribute?.looping && attribute?.indefinite) {\n this._handleIndefiniteLoop(attribute);\n } else if (attribute?.looping) {\n this._handleLoops(attribute);\n } else {\n this._handleDefault(attribute);\n }\n\n attribute.delta = attribute.value - attribute.previousValue;\n\n attribute.previousValue = attribute.value;\n },\n\n _handleBaseLoop(attribute) {\n if (!attribute.initialized) {\n if (attribute.values.length === 1) {\n attribute.values.unshift(\n lib.deep_get(attribute.target, attribute.propertyName)\n );\n }\n attribute.initialized = true;\n }\n\n attribute.loopDurationDone += this.ticker.deltaMS;\n attribute.progress = attribute.loopDurationDone / attribute.loopDuration;\n\n attribute.value = lib.interpolate(\n attribute.values[attribute.index],\n attribute.values[attribute.nextIndex],\n attribute.progress,\n attribute.ease\n );\n\n if (attribute.progress >= 1.0) {\n attribute.loopDurationDone -= attribute.loopDuration;\n\n attribute.index = (attribute.index + 1) % attribute.values.length;\n attribute.nextIndex = (attribute.nextIndex + 1) % attribute.values.length;\n\n if (!attribute.pingPong && attribute.nextIndex === 0) {\n attribute.index = 0;\n attribute.nextIndex = 1;\n }\n\n attribute.loopsDone++;\n\n attribute.value = lib.interpolate(\n attribute.values[attribute.index],\n attribute.values[attribute.nextIndex],\n attribute.progress % 1.0,\n attribute.ease\n );\n }\n },\n\n _handleIndefiniteLoop(attribute) {\n return this._handleBaseLoop(attribute);\n },\n\n _handleLoops(attribute) {\n this._handleBaseLoop(attribute);\n\n attribute.durationDone += this.ticker.deltaMS;\n attribute.overallProgress = attribute.durationDone / attribute.duration;\n\n if (\n attribute.progress >= 1.0 &&\n attribute.loopsDone === attribute.loops * 2\n ) {\n attribute.finishing = true;\n attribute.value = attribute.values[attribute.index];\n }\n\n if (attribute.overallProgress >= 1.0) {\n attribute.finishing = true;\n }\n },\n\n _handleDefault(attribute) {\n attribute.durationDone += this.ticker.deltaMS;\n attribute.progress = attribute.durationDone / attribute.duration;\n\n attribute.value = lib.interpolate(\n attribute.from,\n attribute.to,\n attribute.progress,\n attribute.ease\n );\n\n if (attribute.progress >= 1.0) {\n attribute.value = attribute.to;\n attribute.finishing = true;\n }\n },\n};\n\nexport default SequencerAnimationEngine;\n","import { sequencerSocket, SOCKET_HANDLERS } from \"../sockets.js\";\nimport SequencerAnimationEngine from \"./sequencer-animation-engine.js\";\nimport * as lib from \"../lib/lib.js\";\nimport SequenceManager from \"./sequence-manager.js\";\n\nexport default class SequencerAudioHelper {\n /**\n * Play an audio file.\n *\n * @param {{src: string, loop?: boolean, volume?: number, _fadeIn?: {duration: number}, _fadeOut?: {duration: number}, duration?: number}} data The data that describes the audio to play.\n * @param {boolean} [push=false] A flag indicating whether or not to make other clients play the audio, too.\n * @returns {Number} A promise that resolves when the audio file has finished playing.\n */\n static async play(data, push = true) {\n if (push)\n sequencerSocket.executeForOthers(SOCKET_HANDLERS.PLAY_SOUND, data);\n return this._play(data);\n }\n\n /**\n * @param {{src: string, loop?: boolean, volume: number, _fadeIn?: {duration: number}, _fadeOut?: {duration: number}, duration?: number}} data\n * @returns {Number}\n * @private\n */\n static async _play(data) {\n if (\n !game.settings.get(\"sequencer\", \"soundsEnabled\") ||\n game.user.viewedScene !== data.sceneId ||\n (data?.users?.length && !data?.users?.includes(game.userId))\n ) {\n return new Promise((resolve) => setTimeout(resolve, data.duration));\n }\n\n Hooks.callAll(\"createSequencerSound\", data);\n\n lib.debug(`Playing sound:`, data);\n\n data.volume =\n (data.volume ?? 0.8) * game.settings.get(\"core\", \"globalInterfaceVolume\");\n\n const sound = await game.audio.play(data.src, {\n volume: data.fadeIn ? 0 : data.volume,\n loop: data.loop,\n offset: data.startTime,\n });\n\n SequenceManager.RunningSounds.add(data.id, sound);\n\n if (data.fadeIn) {\n SequencerAnimationEngine.addAnimation(data.id, {\n target: sound,\n propertyName: \"volume\",\n from: 0.0,\n to: data.volume,\n duration: Math.min(data.fadeIn.duration, data.duration),\n ease: data.fadeIn.ease,\n delay: Math.min(data.fadeIn.delay, data.duration),\n });\n }\n\n if (data.fadeOut) {\n SequencerAnimationEngine.addAnimation(data.id, {\n target: sound,\n propertyName: \"volume\",\n from: data.volume,\n to: 0.0,\n duration: Math.min(data.fadeOut.duration, data.duration),\n ease: data.fadeOut.ease,\n delay: Math.max(\n data.duration - data.fadeOut.duration + data.fadeOut.delay,\n 0\n ),\n });\n }\n\n if (data.duration) {\n setTimeout(() => {\n sound.stop();\n }, data.duration);\n }\n\n new Promise((resolve) => {\n sound.on(\"stop\", resolve);\n sound.on(\"end\", resolve);\n }).then(() => {\n SequenceManager.RunningSounds.delete(data.id);\n Hooks.callAll(\"endedSequencerSound\", data);\n });\n\n return data.duration;\n }\n\n static stop(ids, push = true) {\n if (push && game.user.isGM)\n sequencerSocket.executeForOthers(SOCKET_HANDLERS.STOP_SOUNDS, ids);\n return this._stop(ids);\n }\n\n static _stop(ids) {\n for (const id of ids) {\n const sound = SequenceManager.RunningSounds.get(id);\n if (sound) {\n sound.stop();\n }\n }\n }\n}\n","import * as lib from \"../lib/lib.js\";\nimport * as canvaslib from \"../lib/canvas-lib.js\";\nimport { sequencerSocket, SOCKET_HANDLERS } from \"../sockets.js\";\n\nlet lockedView = false;\n\nexport default class SequencerFoundryReplicator {\n static registerHooks() {\n Hooks.on(\"canvasPan\", () => {\n if (!lockedView) return;\n canvas.stage.pivot.set(lockedView.x, lockedView.y);\n canvas.stage.scale.set(lockedView.scale, lockedView.scale);\n canvas.updateBlur(lockedView.scale);\n canvas.controls._onCanvasPan();\n canvas.hud.align();\n });\n }\n\n static _validateObject(inObject, sceneId) {\n if (lib.is_UUID(inObject) || !canvaslib.is_object_canvas_data(inObject)) {\n inObject = lib.get_object_from_scene(inObject, sceneId);\n }\n return inObject?._object ?? inObject;\n }\n\n static _getPositionFromData(data) {\n const source = this._validateObject(data.source, data.sceneId);\n\n const position =\n source instanceof PlaceableObject\n ? canvaslib.get_object_position(source)\n : source?.worldPosition || source?.center || source;\n\n const multiplier = data.randomOffset;\n const twister = new MersenneTwister(data.seed);\n\n if (source && multiplier) {\n let randomOffset = canvaslib.get_random_offset(\n source,\n multiplier,\n twister\n );\n position.x -= randomOffset.x;\n position.y -= randomOffset.y;\n }\n\n let extraOffset = data.offset;\n if (extraOffset) {\n let newOffset = {\n x: extraOffset.x,\n y: extraOffset.y,\n };\n if (extraOffset.gridUnits) {\n newOffset.x *= canvas.grid.size;\n newOffset.y *= canvas.grid.size;\n }\n if (extraOffset.local) {\n newOffset = canvaslib.rotateAroundPoint(\n 0,\n 0,\n newOffset.x,\n newOffset.y,\n source?.rotation ?? 0\n );\n }\n position.x -= newOffset.x;\n position.y -= newOffset.y;\n }\n\n return position;\n }\n\n static playScrollingText(data, push = true) {\n if (push) {\n sequencerSocket.executeForOthers(\n SOCKET_HANDLERS.CREATE_SCROLLING_TEXT,\n data\n );\n }\n return this._playScrollingText(data);\n }\n\n static _playScrollingText(data) {\n if (game.user.viewedScene !== data.sceneId) return;\n if (data.users.length && !data.users.includes(game.userId)) return;\n\n canvas.interface.createScrollingText(\n this._getPositionFromData(data),\n data.content,\n data.options\n );\n\n return data.options?.duration ?? 2000;\n }\n\n static panCanvas(data, push = true) {\n if (push) {\n sequencerSocket.executeForOthers(SOCKET_HANDLERS.PAN_CANVAS, data);\n }\n\n return this._panCanvas(data);\n }\n\n static _panCanvas(data) {\n if (game.user.viewedScene !== data.sceneId) return;\n if (data.users.length && !data.users.includes(game.userId)) return;\n\n if (data.source) {\n const position = this._getPositionFromData(data);\n\n canvas.animatePan({\n x: position.x,\n y: position.y,\n scale: data.scale,\n duration: data.duration,\n speed: data.speed,\n });\n\n if (data.speed) {\n let ray = new Ray(canvas.stage.pivot, {\n x: position.x,\n y: position.y,\n });\n data.duration = Math.round((ray.distance * 1000) / data.speed);\n }\n\n if (data.lockView > 0) {\n setTimeout(() => {\n lockedView = {\n x: position.x,\n y: position.y,\n scale: data.scale,\n };\n }, data.duration);\n setTimeout(() => {\n lockedView = false;\n }, data.lockView + data.duration);\n }\n } else {\n data.duration = 0;\n }\n\n if (data.shake) {\n setTimeout(() => {\n this._shake(data.shake);\n }, data.duration);\n }\n\n return (\n data.duration + Math.max(data.lockView ?? 0, data.shake?.duration ?? 0)\n );\n }\n\n static _shake(shakeData) {\n let x = lib.random_float_between(-1, 1);\n let y = lib.random_float_between(-1, 1);\n let rot = shakeData.rotation ? lib.random_float_between(-1, 1) : 0;\n let positions = [{ x, y, rot }];\n\n for (\n let index = 0;\n index < Math.floor(shakeData.duration / shakeData.frequency);\n index++\n ) {\n x = lib.flip_negate(x, Math.random());\n y = lib.flip_negate(y, Math.random());\n rot = shakeData.rotation ? lib.flip_negate(rot, Math.random()) : 0;\n positions.push({ x, y, rot });\n }\n\n let currentDuration = 0;\n positions = positions.map((pos) => {\n let fadeStrength = 1;\n if (\n shakeData.fadeInDuration &&\n currentDuration <= shakeData.fadeInDuration\n ) {\n fadeStrength = Math.max(\n 0,\n Math.min(1, currentDuration / shakeData.fadeInDuration)\n );\n }\n if (\n shakeData.fadeOutDuration &&\n currentDuration >= shakeData.duration - shakeData.fadeOutDuration\n ) {\n fadeStrength = Math.max(\n 0,\n Math.min(\n 1,\n (shakeData.duration - currentDuration) / shakeData.fadeOutDuration\n )\n );\n }\n pos.x *= shakeData.strength * fadeStrength;\n pos.y *= shakeData.strength * fadeStrength;\n if (shakeData.rotation) {\n pos.rot *= (shakeData.strength / 7.5) * fadeStrength;\n } else {\n pos.rot = 0;\n }\n currentDuration += shakeData.frequency;\n return {\n transform: `translate(${pos.x}px, ${pos.y}px) rotate(${pos.rot}deg)`,\n };\n });\n\n document.getElementById(\"board\").animate(positions, {\n duration: shakeData.duration,\n });\n }\n}\n","import SequencerAudioHelper from \"./modules/sequencer-audio-helper.js\";\nimport CONSTANTS from \"./constants.js\";\nimport FlagManager from \"./utils/flag-manager.js\";\nimport SequencerFoundryReplicator from \"./modules/sequencer-foundry-replicator.js\";\nimport * as lib from \"./lib/lib.js\";\n\nexport const SOCKET_HANDLERS = {\n PLAY_EFFECT: \"playEffect\",\n END_EFFECTS: \"endEffects\",\n UPDATE_EFFECT: \"updateEffects\",\n ADD_EFFECT_ANIMATIONS: \"addEffectAnimations\",\n PLAY_SOUND: \"playSound\",\n STOP_SOUNDS: \"stopSounds\",\n PRELOAD: \"preload\",\n PRELOAD_RESPONSE: \"preloadResponse\",\n PRELOAD_DONE: \"preloadDone\",\n UPDATE_DOCUMENT: \"updateDocument\",\n ADD_FLAGS: \"addFlags\",\n REMOVE_FLAGS: \"removeFlags\",\n UPDATE_POSITION: \"updatePosition\",\n CREATE_SCROLLING_TEXT: \"createScrollingText\",\n PAN_CANVAS: \"panCanvas\",\n RUN_SEQUENCE_LOCALLY: \"runSequenceLocally\",\n};\n\nexport let sequencerSocket;\n\nexport function registerSocket() {\n if (sequencerSocket) return;\n sequencerSocket = socketlib.registerModule(CONSTANTS.MODULE_NAME);\n sequencerSocket.register(SOCKET_HANDLERS.PLAY_EFFECT, (...args) =>\n Sequencer.EffectManager._playEffect(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.END_EFFECTS, (...args) =>\n Sequencer.EffectManager._endManyEffects(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.UPDATE_EFFECT, (...args) =>\n Sequencer.EffectManager._updateEffect(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.ADD_EFFECT_ANIMATIONS, (...args) =>\n Sequencer.EffectManager._addEffectAnimations(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.PLAY_SOUND, (...args) =>\n SequencerAudioHelper._play(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.STOP_SOUNDS, (...args) =>\n SequencerAudioHelper._stop(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.PRELOAD, (...args) =>\n Sequencer.Preloader.respond(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.PRELOAD_RESPONSE, (...args) =>\n Sequencer.Preloader.handleResponse(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.UPDATE_DOCUMENT, (...args) =>\n updateDocument(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.ADD_FLAGS, (...args) =>\n FlagManager._addFlags(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.REMOVE_FLAGS, (...args) =>\n FlagManager._removeFlags(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.UPDATE_POSITION, (...args) =>\n Sequencer.EffectManager._updatePosition(...args)\n );\n sequencerSocket.register(SOCKET_HANDLERS.CREATE_SCROLLING_TEXT, (data) =>\n SequencerFoundryReplicator._playScrollingText(data)\n );\n sequencerSocket.register(SOCKET_HANDLERS.PAN_CANVAS, (data) =>\n SequencerFoundryReplicator._panCanvas(data)\n );\n sequencerSocket.register(SOCKET_HANDLERS.RUN_SEQUENCE_LOCALLY, (data) => {\n lib.debug(\"Playing remote Sequence\");\n new Sequence().fromJSON(data).play();\n });\n}\n\nasync function updateDocument(documentUuid, updates, animate) {\n const document = await fromUuid(documentUuid);\n return document.update(updates, animate);\n}\n","import * as lib from \"../lib/lib.js\";\nimport * as canvaslib from \"../lib/canvas-lib.js\";\nimport { sequencerSocket, SOCKET_HANDLERS } from \"../sockets.js\";\nimport CONSTANTS from \"../constants.js\";\n\nconst flagManager = {\n flagAddBuffer: new Map(),\n flagRemoveBuffer: new Map(),\n _latestFlagVersion: false,\n\n get latestFlagVersion() {\n if (!this._latestFlagVersion) {\n const versions = Object.keys(this.migrations);\n versions.sort((a, b) => {\n return isNewerVersion(a, b) ? -1 : 1;\n });\n this._latestFlagVersion = versions[0];\n }\n return this._latestFlagVersion;\n },\n\n /**\n * Sanitizes the effect data, accounting for changes to the structure in previous versions\n *\n * @param inDocument\n * @returns {array}\n */\n getFlags(inDocument) {\n let effects = getProperty(inDocument, CONSTANTS.EFFECTS_FLAG);\n\n if (!effects?.length) return [];\n\n effects = foundry.utils.deepClone(effects);\n\n const changes = [];\n for (let [effectId, effectData] of effects) {\n let effectVersion = effectData?.flagVersion ?? \"1.0.0\";\n\n if (effectData.flagVersion === this.latestFlagVersion) continue;\n\n for (let [version, migration] of Object.entries(this.migrations)) {\n if (!isNewerVersion(version, effectVersion)) continue;\n\n effectData = migration(inDocument, effectData);\n }\n\n lib.debug(\n `Migrated effect with ID ${effectId} from version ${effectVersion} to version ${this.latestFlagVersion}`\n );\n\n effectData.flagVersion = this.latestFlagVersion;\n\n changes.push(effectData);\n }\n\n if (changes.length) {\n flagManager.addFlags(inDocument.uuid, changes);\n }\n\n return effects;\n },\n\n migrations: {\n \"2.0.0\": (inDocument, effectData) => {\n effectData._id = effectData.id;\n effectData.creationTimestamp = effectData.timestamp;\n\n if (effectData.template) {\n effectData.template = {\n gridSize: effectData.template[0],\n startPoint: effectData.template[1],\n endPoint: effectData.template[2],\n };\n }\n\n if (effectData.attachTo) {\n effectData.attachTo = {\n active: true,\n align: \"center\",\n rotation: true,\n bindVisibility: true,\n bindAlpha: true,\n };\n effectData.source = inDocument.uuid;\n const objectSize = canvaslib.get_object_dimensions(inDocument, true);\n effectData.offset = {\n x: effectData.position.x - objectSize.width,\n y: effectData.position.y - objectSize.height,\n };\n } else if (effectData.position) {\n effectData.source = effectData.position;\n }\n\n if (effectData.reachTowards) {\n effectData.stretchTo = {\n attachTo: false,\n onlyX: false,\n };\n }\n\n if (effectData.filters) {\n effectData.filters = Object.entries(effectData.filters).map((entry) => {\n return {\n className: entry[0],\n ...entry[1],\n };\n });\n }\n\n effectData.moveSpeed = effectData.speed;\n\n effectData.target = null;\n effectData.forcedIndex = null;\n effectData.flipX = false;\n effectData.flipY = false;\n effectData.nameOffsetMap = {};\n effectData.sequenceId = 0;\n\n delete effectData.id;\n delete effectData.timestamp;\n delete effectData.position;\n delete effectData.reachTowards;\n delete effectData.speed;\n delete effectData.audioVolume;\n delete effectData.gridSizeDifference;\n delete effectData.template;\n\n if (effectData.animatedProperties) {\n delete effectData.animatedProperties.fadeInAudio;\n delete effectData.animatedProperties.fadeOutAudio;\n }\n\n effectData = foundry.utils.mergeObject(\n effectData,\n effectData.animatedProperties\n );\n\n delete effectData.animatedProperties;\n\n return effectData;\n },\n\n \"2.0.6\": (inDocument, effectData) => {\n effectData.private = null;\n\n return effectData;\n },\n\n \"2.0.8\": (inDocument, effectData) => {\n if (effectData.stretchTo) {\n effectData.stretchTo.tiling = false;\n }\n\n return effectData;\n },\n\n \"2.0.9\": (inDocument, effectData) => {\n effectData.tilingTexture = false;\n\n if (effectData.stretchTo?.tiling !== undefined) {\n if (effectData.stretchTo.tiling) {\n effectData.tilingTexture = {\n scale: { x: 1, y: 1 },\n position: { x: 0, y: 0 },\n };\n }\n delete effectData.stretchTo.tiling;\n }\n\n return effectData;\n },\n\n \"2.1.0\": (inDocument, effectData) => {\n if (effectData.randomOffset) {\n effectData.randomOffset = {\n source: !effectData.target ? effectData.randomOffset : false,\n target: !!effectData.target ? effectData.randomOffset : false,\n };\n }\n\n if (effectData.nameOffsetMap) {\n Object.values(effectData.nameOffsetMap).forEach((offsetMap) => {\n if (offsetMap.randomOffset) {\n offsetMap.randomOffset = {\n source: !offsetMap.target ? offsetMap.randomOffset : false,\n target: !!offsetMap.target ? offsetMap.randomOffset : false,\n };\n }\n });\n }\n\n return effectData;\n },\n },\n\n /**\n * Adds effects to a given document\n *\n * @param inObjectUUID\n * @param inEffects\n */\n addFlags: (inObjectUUID, inEffects) => {\n if (!Array.isArray(inEffects)) inEffects = [inEffects];\n sequencerSocket.executeAsGM(\n SOCKET_HANDLERS.ADD_FLAGS,\n inObjectUUID,\n inEffects\n );\n },\n\n /**\n * Removes effects from a given document\n *\n * @param inObjectUUID\n * @param inEffects\n * @param removeAll\n */\n removeFlags: (inObjectUUID, inEffects, removeAll = false) => {\n sequencerSocket.executeAsGM(\n SOCKET_HANDLERS.REMOVE_FLAGS,\n inObjectUUID,\n inEffects,\n removeAll\n );\n },\n\n _addFlags: (inObjectUUID, inEffects) => {\n if (!Array.isArray(inEffects)) inEffects = [inEffects];\n\n let flagsToSet = flagManager.flagAddBuffer.get(inObjectUUID) ?? {\n effects: [],\n };\n\n flagsToSet.effects.push(...inEffects);\n\n flagManager.flagAddBuffer.set(inObjectUUID, flagsToSet);\n\n flagManager.updateFlags();\n },\n\n _removeFlags: (inObjectUUID, inEffects, removeAll = false) => {\n if (inEffects && !Array.isArray(inEffects)) inEffects = [inEffects];\n\n let flagsToSet = flagManager.flagRemoveBuffer.get(inObjectUUID) ?? {\n effects: [],\n removeAll: removeAll,\n };\n\n if (inEffects) flagsToSet.effects.push(...inEffects);\n\n flagManager.flagRemoveBuffer.set(inObjectUUID, flagsToSet);\n\n flagManager.updateFlags();\n },\n\n updateFlags: debounce(async () => {\n let flagsToAdd = Array.from(flagManager.flagAddBuffer);\n let flagsToRemove = Array.from(flagManager.flagRemoveBuffer);\n\n flagManager.flagAddBuffer.clear();\n flagManager.flagRemoveBuffer.clear();\n\n flagsToAdd.forEach((entry) => (entry[1].original = true));\n flagsToRemove.forEach((entry) => (entry[1].original = true));\n\n const objects = new Set([\n ...flagsToAdd.map((effect) => effect[0]).filter(Boolean),\n ...flagsToRemove.map((effect) => effect[0]).filter(Boolean),\n ]);\n\n flagsToAdd = new Map(flagsToAdd);\n flagsToRemove = new Map(flagsToRemove);\n\n const actorUpdates = {};\n const sceneObjectsToUpdate = {};\n\n for (let objectUUID of objects) {\n let object = fromUuidSync(objectUUID);\n\n if (!object) {\n lib.debug(\n `Failed to set flags on non-existent object with UUID: ${objectUUID}`\n );\n continue;\n }\n\n let toAdd = flagsToAdd.get(objectUUID) ?? { effects: [] };\n let toRemove = flagsToRemove.get(objectUUID) ?? {\n effects: [],\n removeAll: false,\n };\n\n const existingFlags = new Map(\n getProperty(object, CONSTANTS.EFFECTS_FLAG) ?? []\n );\n\n if (toRemove?.removeAll) {\n toRemove.effects = Array.from(existingFlags).map((entry) => entry[0]);\n }\n\n for (let effect of toAdd.effects) {\n if (typeof effect === \"string\") {\n effect = existingFlags.get(effect);\n if (!effect) continue;\n }\n existingFlags.set(effect._id, effect);\n }\n\n for (let effect of toRemove.effects) {\n if (typeof effect === \"string\") {\n effect = existingFlags.get(effect);\n if (!effect) continue;\n }\n existingFlags.delete(effect._id);\n }\n\n let flagsToSet = Array.from(existingFlags);\n const options = {};\n\n const isLinkedToken = object instanceof TokenDocument && object.actorLink;\n const isLinkedActor =\n object instanceof Actor && object.prototypeToken.actorLink;\n\n if (\n (isLinkedToken || isLinkedActor) &&\n (toAdd.original || toRemove.original)\n ) {\n const actor = isLinkedActor ? object : object.actor;\n actorUpdates[actor.id] = flagsToSet.filter(\n (effect) => effect[1]?.persistOptions?.persistTokenPrototype\n );\n flagsToSet = flagsToSet.filter(\n (effect) => !effect[1]?.persistOptions?.persistTokenPrototype\n );\n if (\n isLinkedToken &&\n game.modules.get(\"multilevel-tokens\")?.active &&\n getProperty(object, \"flags.multilevel-tokens.stoken\")\n ) {\n options[\"mlt_bypass\"] = true;\n }\n }\n\n if (object?.documentName === \"Scene\") {\n const sceneId = object.id;\n sceneObjectsToUpdate[sceneId] = sceneObjectsToUpdate[sceneId] ?? {\n updates: {},\n documents: {},\n };\n sceneObjectsToUpdate[sceneId].updates[CONSTANTS.EFFECTS_FLAG] =\n flagsToSet;\n } else if (!(object instanceof Actor)) {\n const sceneId = object.parent.id;\n const docName = object.documentName;\n sceneObjectsToUpdate[sceneId] = sceneObjectsToUpdate[sceneId] ?? {\n updates: {},\n documents: {},\n };\n sceneObjectsToUpdate[sceneId].documents[docName] = sceneObjectsToUpdate[\n sceneId\n ].documents[docName] ?? {\n options: {},\n updates: [],\n };\n sceneObjectsToUpdate[sceneId].documents[docName].options = options;\n sceneObjectsToUpdate[sceneId].documents[docName].updates.push({\n _id: object.id,\n [CONSTANTS.EFFECTS_FLAG]: flagsToSet,\n });\n }\n }\n\n for (const [sceneId, sceneData] of Object.entries(sceneObjectsToUpdate)) {\n const scene = game.scenes.get(sceneId);\n if (!foundry.utils.isEmpty(sceneData.updates)) {\n await scene.update(sceneData.updates);\n }\n for (const [documentType, documentData] of Object.entries(\n sceneData.documents\n )) {\n await scene.updateEmbeddedDocuments(\n documentType,\n documentData.updates,\n documentData.options\n );\n lib.debug(\n `Flags set for documents of type \"${documentType}\" in scene with ID \"${sceneId}\"`\n );\n }\n }\n\n await Actor.updateDocuments(\n Object.entries(actorUpdates).map(([actorId, effects]) => ({\n _id: actorId,\n [CONSTANTS.EFFECTS_FLAG]: effects,\n }))\n );\n }, 250),\n};\n\nexport default flagManager;\n","import CanvasEffect from \"../canvas-effects/canvas-effect.js\";\nimport { sequencerSocket, SOCKET_HANDLERS } from \"../sockets.js\";\nimport * as lib from \"../lib/lib.js\";\nimport flagManager from \"../utils/flag-manager.js\";\nimport CONSTANTS from \"../constants.js\";\nimport SequenceManager from \"./sequence-manager.js\";\nimport { EffectsUIApp } from \"../formapplications/effects-ui/effects-ui-app.js\";\n\nconst PositionContainer = new Map();\nconst TemporaryPositionsContainer = new Map();\n\nexport default class SequencerEffectManager {\n /**\n * Returns all of the currently running effects on the canvas\n *\n * @returns {Array}\n */\n static get effects() {\n return Array.from(SequenceManager.VisibleEffects.values());\n }\n\n static _updatePosition(uuid, position) {\n TemporaryPositionsContainer.set(uuid, position);\n }\n\n static getPositionForUUID(uuid) {\n return TemporaryPositionsContainer.get(uuid);\n }\n\n /**\n * Opens the Sequencer Effects UI with the effects tab open\n */\n static show() {\n return EffectsUIApp.show({ tab: \"manager\" });\n }\n\n /**\n * Play an effect on the canvas.\n *\n * @param {object} data The data that describes the audio to play\n * @param {boolean} [push=true] A flag indicating whether or not to make other clients play the effect\n * @returns {CanvasEffect} A CanvasEffect object\n */\n static async play(data, push = true) {\n if (!lib.user_can_do(\"permissions-effect-create\")) {\n lib.custom_warning(\n \"Sequencer\",\n \"EffectManager | play | Players do not have permissions to play effects. This can be configured in Sequencer's module settings.\"\n );\n return;\n }\n if (push)\n sequencerSocket.executeForOthers(SOCKET_HANDLERS.PLAY_EFFECT, data);\n if (data?.persistOptions?.persistTokenPrototype) {\n this._playPrototypeTokenEffects(data, push);\n }\n return this._playEffect(data);\n }\n\n /**\n * Get effects that are playing on the canvas based on a set of filters\n *\n * @param {object} inFilter An object containing filters that determine which effects to return\n * - object: An ID or a PlaceableObject\n * - name: The name of the effect\n * - sceneId: the ID of the scene to search within\n * @returns {Array} An array containing effects that match the given filter\n */\n static getEffects(inFilter = {}) {\n const filters = this._validateFilters(inFilter);\n if (!inFilter)\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | getEffects | Incorrect or incomplete parameters provided\"\n );\n return this._filterEffects(filters);\n }\n\n /**\n * Updates effects based on a set of filters\n *\n * @param {object} inFilter An object containing filters that determine which effects to return\n * - object: An ID or a PlaceableObject\n * - name: The name of the effect\n * - sceneId: the ID of the scene to search within\n * - effects: a single CanvasEffect or its ID, or an array of such\n * @param {object} inUpdates\n * @returns {promise}\n */\n static updateEffects(inFilter, inUpdates) {\n inFilter = this._validateFilters(inFilter);\n if (!inFilter)\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | updateEffects | Incorrect or incomplete parameters provided\"\n );\n\n CanvasEffect.validateUpdate(inUpdates);\n\n const effectsToUpdate = this._filterEffects(inFilter).filter(\n (effect) => effect.userCanUpdate\n );\n\n return Promise.allSettled(\n effectsToUpdate.map((effect) => effect.update(inUpdates))\n );\n }\n\n /**\n * End effects that are playing on the canvas based on a set of filters\n *\n * @param {object} inFilter An object containing filters that determine which effects to end\n * - object: An ID or a PlaceableObject\n * - name: The name of the effect\n * - sceneId: the ID of the scene to search within\n * - effects: a single CanvasEffect or its ID, or an array of such\n * @param {boolean} [push=true] A flag indicating whether or not to make other clients end the effects\n * @returns {promise} A promise that resolves when the effects have ended\n */\n static async endEffects(inFilter = {}, push = true) {\n inFilter = this._validateFilters(inFilter);\n if (!inFilter)\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | endEffects | Incorrect or incomplete parameters provided\"\n );\n const effectsToEnd = this._getEffectsByFilter(inFilter);\n if (!effectsToEnd.length) return;\n if (push)\n sequencerSocket.executeForOthers(\n SOCKET_HANDLERS.END_EFFECTS,\n effectsToEnd\n );\n return this._endManyEffects(effectsToEnd);\n }\n\n /**\n * End all effects that are playing on the canvas\n *\n * @param {string} [inSceneId] A parameter which determines which scene to end all effects on, defaults to current viewed scene\n * @param {boolean} [push=true] A flag indicating whether or not to make other clients end all effects\n * @returns {promise} A promise that resolves when all of the effects have _ended\n */\n static async endAllEffects(inSceneId = game.user.viewedScene, push = true) {\n const inFilter = this._validateFilters({ sceneId: inSceneId });\n if (!inFilter)\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | endAllEffects | Incorrect or incomplete parameters provided\"\n );\n const effectsToEnd = this._getEffectsByFilter(inFilter);\n if (!effectsToEnd.length) return;\n if (push)\n sequencerSocket.executeForOthers(\n SOCKET_HANDLERS.END_EFFECTS,\n effectsToEnd\n );\n return this._endManyEffects(effectsToEnd);\n }\n\n static _getEffectsByFilter(inFilter) {\n return lib.make_array_unique(\n this._filterEffects(inFilter)\n .filter((effect) => effect.userCanDelete)\n .map((effect) => {\n return effect.data?.persistOptions?.persistTokenPrototype\n ? effect.data?.persistOptions?.id ?? effect.id\n : effect.id;\n })\n );\n }\n\n /**\n * If an effect has been named its position will be cached, which can be retrieved with this method\n *\n * @param {string} inName\n * @returns {object|boolean}\n * @private\n */\n static getEffectPositionByName(inName) {\n if (!(typeof inName === \"string\"))\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | getEffectPositionByName | inName must be of type string\"\n );\n return PositionContainer.get(inName) ?? false;\n }\n\n /**\n * Filters the existing effects based on the given filter\n *\n * @param inFilter\n * @returns {array}\n * @private\n */\n static _filterEffects(inFilter) {\n if (inFilter.name) {\n inFilter.name = new RegExp(\n lib.str_to_search_regex_str(lib.safe_str(inFilter.name)),\n \"gu\"\n );\n }\n let effects = this.effects;\n if (inFilter.sceneId && inFilter.sceneId !== canvas.scene.id) {\n effects = lib\n .get_all_documents_from_scene(inFilter.sceneId)\n .map((doc) => {\n return getProperty(doc, CONSTANTS.EFFECTS_FLAG);\n })\n .filter((flags) => !!flags)\n .map((flags) => {\n return flags.map((flag) => CanvasEffect.make(flag[1]));\n })\n .deepFlatten();\n }\n return effects.filter((effect) => {\n return (\n (!inFilter.effects || inFilter.effects.includes(effect.id)) &&\n (!inFilter.name ||\n (effect.data.name &&\n effect.data.name.match(inFilter.name)?.length)) &&\n (!inFilter.source || inFilter.source === effect.data.source) &&\n (!inFilter.target || inFilter.target === effect.data.target) &&\n (!inFilter.origin || inFilter.origin === effect.data.origin)\n );\n });\n }\n\n /**\n * Validates an object actually exists, and gets its UUID\n *\n * @param object\n * @param sceneId\n * @returns {string}\n * @private\n */\n static _validateObject(object, sceneId) {\n if (\n !(\n object instanceof foundry.abstract.Document ||\n object instanceof PlaceableObject ||\n typeof object === \"string\"\n )\n ) {\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | object must be instance of PlaceableObject or of type string\"\n );\n } else if (\n object instanceof PlaceableObject ||\n object instanceof foundry.abstract.Document\n ) {\n object = lib.get_object_identifier(object?.document ?? object);\n } else if (typeof object === \"string\") {\n const actualObject = lib.get_object_from_scene(object, sceneId);\n if (!actualObject) {\n throw lib.custom_error(\n \"Sequencer\",\n `EffectManager | could not find object with ID: ${object}`\n );\n }\n const uuid = lib.get_object_identifier(actualObject);\n if (!uuid) {\n throw lib.custom_error(\n \"Sequencer\",\n `EffectManager | could could not establish identifier of object with ID: ${object}`\n );\n }\n object = uuid;\n }\n\n return object;\n }\n\n /**\n * Validates the filter given to any of the above public methods\n *\n * @param inFilter\n * @returns {boolean}\n * @private\n */\n static _validateFilters(inFilter) {\n if (inFilter?.sceneId) {\n if (typeof inFilter.sceneId !== \"string\")\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | inFilter.sceneId must be of type string\"\n );\n if (!game.scenes.get(inFilter.sceneId))\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | inFilter.sceneId must be a valid scene id (could not find scene)\"\n );\n } else {\n inFilter.sceneId = game.user.viewedScene;\n }\n\n if (inFilter?.object) {\n inFilter.source = this._validateObject(inFilter.object, inFilter.sceneId);\n delete inFilter.object;\n }\n\n if (inFilter?.source) {\n inFilter.source = this._validateObject(inFilter.source, inFilter.sceneId);\n }\n\n if (inFilter?.target) {\n inFilter.target = this._validateObject(inFilter.target, inFilter.sceneId);\n }\n\n if (inFilter?.name && typeof inFilter?.name !== \"string\")\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | inFilter.name must be of type string\"\n );\n if (inFilter?.origin && typeof inFilter?.origin !== \"string\")\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | inFilter.origin must be of type string\"\n );\n\n if (inFilter?.effects) {\n if (!Array.isArray(inFilter.effects))\n inFilter.effects = [inFilter.effects];\n inFilter.effects = inFilter.effects.map((effect) => {\n if (!(typeof effect === \"string\" || effect instanceof CanvasEffect))\n throw lib.custom_error(\n \"Sequencer\",\n \"EffectManager | collections in inFilter.effects must be of type string or CanvasEffect\"\n );\n if (effect instanceof CanvasEffect) return effect.id;\n return effect;\n });\n }\n\n if (\n !inFilter.name &&\n !inFilter.origin &&\n !inFilter.target &&\n !inFilter.sceneId &&\n !inFilter.effects &&\n !inFilter.origin\n )\n return false;\n\n return foundry.utils.mergeObject(\n {\n effects: false,\n name: false,\n source: false,\n target: false,\n sceneId: false,\n origin: false,\n },\n inFilter\n );\n }\n\n /**\n * Actually plays the effect on the canvas\n *\n * @param data\n * @param setFlags\n * @returns {Promise<{duration: Promise<number>, promise: Promise<void>}>}\n * @private\n */\n static async _playEffect(data, setFlags = true) {\n const effect = CanvasEffect.make(data);\n\n if (\n data.persist &&\n setFlags &&\n effect.context &&\n effect.owner &&\n !data.temporary &&\n !data.remote\n ) {\n flagManager.addFlags(effect.context.uuid, effect.data);\n }\n\n if (!effect.shouldPlay) return;\n\n const playData = effect.play();\n\n SequenceManager.VisibleEffects.add(effect.id, effect);\n if (effect.data.name) {\n effect._ticker.add(() => {\n if (effect.isDestroyed) return;\n PositionContainer.set(effect.data.name, {\n start: effect.sourcePosition,\n end: effect.targetPosition,\n });\n });\n }\n\n if (data.temporary && effect.owner) {\n let lastSourcePosition = {};\n let lastTargetPosition = {};\n effect._ticker.add(() => {\n if (effect.source && !effect.isSourceDestroyed) {\n const sourceData = effect.getSourceData();\n if (JSON.stringify(sourceData) !== lastSourcePosition) {\n sequencerSocket.executeForOthers(\n SOCKET_HANDLERS.UPDATE_POSITION,\n data.source,\n sourceData\n );\n lastSourcePosition = JSON.stringify(sourceData);\n }\n }\n if (effect.target && !effect.isTargetDestroyed) {\n const targetData = effect.getTargetData();\n if (JSON.stringify(targetData) !== lastTargetPosition) {\n sequencerSocket.executeForOthers(\n SOCKET_HANDLERS.UPDATE_POSITION,\n data.target,\n targetData\n );\n lastTargetPosition = JSON.stringify(targetData);\n }\n }\n });\n }\n\n if (!data.persist) {\n playData.promise.then(() => this._removeEffect(effect));\n }\n\n return playData;\n }\n\n /**\n * Updates a single effect with the given data\n *\n * @param inEffectId\n * @param inUpdates\n * @returns {promise|boolean}\n * @private\n */\n static _updateEffect(inEffectId, inUpdates) {\n const effect = SequenceManager.VisibleEffects.get(inEffectId);\n if (!effect) return false;\n return effect._update(inUpdates);\n }\n\n /**\n * Updates a single effect with new animations\n *\n * @param inEffectId\n * @param inAnimations\n * @param inLoopingAnimations\n * @returns {promise|boolean}\n * @private\n */\n static _addEffectAnimations(inEffectId, inAnimations, inLoopingAnimations) {\n const effect = SequenceManager.VisibleEffects.get(inEffectId);\n if (!effect) return false;\n return effect._addAnimations(inAnimations, inLoopingAnimations);\n }\n\n /**\n * Sets up persisting effects when the scene is first loaded\n *\n * @returns {promise}\n */\n static async initializePersistentEffects() {\n await this.tearDownPersists();\n const allObjects = lib.get_all_documents_from_scene();\n allObjects.push(canvas.scene);\n const docEffectsMap = allObjects.reduce((acc, doc) => {\n let effects = flagManager.getFlags(doc);\n effects.forEach((e) => {\n if (lib.is_UUID(e[1].source) && e[1].source !== doc.uuid) {\n e[1].delete = true;\n }\n });\n if (doc instanceof TokenDocument && doc?.actorLink) {\n const actorEffects = flagManager.getFlags(doc?.actor);\n actorEffects.forEach((e) => {\n e[1]._id = randomID();\n e[1].source = doc.uuid;\n e[1].sceneId = doc.parent.id;\n });\n effects = effects.concat(actorEffects);\n }\n if (effects.length) {\n acc[doc.uuid] = effects;\n }\n return acc;\n }, {});\n const promises = Object.entries(docEffectsMap)\n .map(([uuid, effects]) => {\n return this._playEffectMap(effects, fromUuidSync(uuid));\n })\n .flat();\n return Promise.all(promises).then(() => {\n Hooks.callAll(\"sequencerEffectManagerReady\");\n });\n }\n\n /**\n * Tears down persisting effects when the scene is unloaded\n */\n static tearDownPersists() {\n return Promise.allSettled(\n this.effects.map((effect) => {\n SequenceManager.VisibleEffects.delete(effect.id);\n return effect.destroy();\n })\n );\n }\n\n static setup() {\n Hooks.on(\"preCreateToken\", this._patchCreationData.bind(this));\n Hooks.on(\"preCreateDrawing\", this._patchCreationData.bind(this));\n Hooks.on(\"preCreateTile\", this._patchCreationData.bind(this));\n Hooks.on(\"preCreateMeasuredTemplate\", this._patchCreationData.bind(this));\n Hooks.on(\"createToken\", this._documentCreated.bind(this));\n Hooks.on(\"createDrawing\", this._documentCreated.bind(this));\n Hooks.on(\"createTile\", this._documentCreated.bind(this));\n Hooks.on(\"createMeasuredTemplate\", this._documentCreated.bind(this));\n }\n\n /**\n * Patches an object's creation data before it's created so that the effect plays on it correctly\n *\n * @param inDocument\n * @param data\n * @param options\n * @returns {*}\n */\n static async _patchCreationData(inDocument, data, options) {\n const effects = flagManager.getFlags(inDocument);\n\n if (!effects?.length) return;\n\n const updates = {};\n\n let documentUuid;\n if (!inDocument._id) {\n const documentId = randomID();\n documentUuid = inDocument.uuid + documentId;\n updates[\"_id\"] = documentId;\n options.keepId = true;\n } else {\n documentUuid = inDocument.uuid;\n }\n\n updates[CONSTANTS.EFFECTS_FLAG] = this._patchEffectDataForDocument(\n documentUuid,\n effects\n );\n\n return inDocument.updateSource(updates);\n }\n\n static _patchEffectDataForDocument(inDocumentUuid, effects) {\n return effects.map((effect) => {\n effect[0] = randomID();\n const effectData = effect[1];\n effectData._id = effect[0];\n if (lib.is_UUID(effectData.source)) {\n if (effectData.masks.includes(effectData.source)) {\n const index = effectData.masks.indexOf(effectData.source);\n effectData.masks[index] = inDocumentUuid;\n }\n effectData.source = inDocumentUuid;\n }\n effectData.sceneId = inDocumentUuid.split(\".\")[1];\n return effect;\n });\n }\n\n /**\n * Plays the effects of a given document on creation\n *\n * @param inDocument\n * @returns {*}\n */\n static async _documentCreated(inDocument) {\n let effects = flagManager.getFlags(inDocument);\n if (inDocument instanceof TokenDocument && inDocument?.actorLink) {\n let actorEffects = flagManager.getFlags(inDocument.actor);\n if (actorEffects.length) {\n actorEffects = this._patchEffectDataForDocument(\n inDocument.uuid,\n actorEffects\n );\n }\n effects = effects.concat(actorEffects);\n }\n if (!effects?.length) return;\n return this._playEffectMap(effects, inDocument);\n }\n\n /**\n * Plays multiple effects at the same time\n *\n * @param inEffects\n * @param inDocument\n * @returns {Promise<{duration: Promise<number>, promise: Promise<void>}[]>}\n * @private\n */\n static _playEffectMap(inEffects, inDocument) {\n if (inEffects instanceof Map) inEffects = Array.from(inEffects);\n return Promise.all(\n inEffects.map((effect) => {\n if (!CanvasEffect.checkValid(effect[1])) {\n if (!game.user.isGM) return;\n lib.custom_warning(\n `Sequencer`,\n `Removed effect from ${inDocument.uuid} as it no longer had a valid source or target`\n );\n return flagManager.removeFlags(inDocument.uuid, effect);\n }\n return this._playEffect(effect[1], false)\n .then((result) => {\n if (!result) {\n lib.debug(\"Error playing effect\");\n }\n })\n .catch((err) => {\n lib.debug(\"Error playing effect:\", err);\n });\n })\n );\n }\n\n /**\n * Ends one or many effects at the same time, returning a promise that resolves once every effect has fully ended\n *\n * @param inEffectIds\n * @returns {Promise}\n * @private\n */\n static async _endManyEffects(inEffectIds = false) {\n const actorEffectsToEnd = this.effects.filter((effect) => {\n return (\n effect.context?.actorLink &&\n inEffectIds.includes(effect.data?.persistOptions?.id)\n );\n });\n const effectsByActorUuid = Object.values(\n lib.group_by(actorEffectsToEnd, \"context.actor.uuid\")\n );\n\n const regularEffectsToEnd = this.effects.filter((effect) => {\n return (\n inEffectIds.includes(effect.id) ||\n (!effect.context?.actorLink &&\n inEffectIds.includes(effect.data?.persistOptions?.id))\n );\n });\n const effectsByContextUuid = Object.values(\n lib.group_by(regularEffectsToEnd, \"context.uuid\")\n );\n\n effectsByContextUuid.forEach((effects) => {\n effects = effects.filter(\n (effect) => effect.data.persist && !effect.data.temporary\n );\n if (!effects.length) return;\n const effectData = effects.map((effect) => effect.data);\n flagManager.removeFlags(\n effects[0].context.uuid,\n effectData,\n !inEffectIds\n );\n });\n\n effectsByActorUuid.forEach((effects) => {\n effects = effects.filter(\n (effect) => effect.data.persist && !effect.data.temporary\n );\n if (!effects.length) return;\n\n const effectContext = effects[0].context;\n const effectData = effects.map((effect) => effect.data);\n\n if (\n !(\n effectContext instanceof TokenDocument &&\n effectContext.actorLink &&\n effectContext.actor.prototypeToken.actorLink\n )\n ) {\n return;\n }\n\n const persistentEffectData = effectData.filter(\n (data) => data?.persistOptions?.persistTokenPrototype\n );\n if (!persistentEffectData.length) return;\n\n const actorEffects = flagManager.getFlags(effectContext.actor);\n const applicableActorEffects = actorEffects\n .filter((effect) => {\n return (\n effect[1]?.persistOptions?.persistTokenPrototype &&\n persistentEffectData.some(\n (persistentEffect) =>\n persistentEffect.persistOptions.id ===\n effect[1]?.persistOptions?.id\n )\n );\n })\n .map((e) => e[0]);\n\n flagManager.removeFlags(\n effectContext.actor.uuid,\n applicableActorEffects,\n !inEffectIds\n );\n });\n\n const effectsToEnd = effectsByContextUuid\n .concat(effectsByActorUuid)\n .deepFlatten();\n\n return Promise.allSettled(\n effectsToEnd.map((effect) => this._removeEffect(effect))\n );\n }\n\n static _effectContextFilter(inUUID, effectData) {\n return (\n effectData?.source === inUUID ||\n effectData?.target === inUUID ||\n (effectData?.tiedDocuments ?? []).indexOf(inUUID) > -1\n );\n }\n\n /**\n * Handles the deletion of objects that effects are attached to\n *\n * @param inUUID\n * @returns {Promise}\n */\n static objectDeleted(inUUID) {\n const documentsToCheck = game.scenes\n .filter((scene) => scene.id !== game.user.viewedScene)\n .map((scene) => [scene, ...lib.get_all_documents_from_scene(scene.id)])\n .deepFlatten();\n\n const documentEffectsToEnd = documentsToCheck\n .map((obj) => {\n const objEffects = flagManager.getFlags(obj);\n const effectsToEnd = objEffects.filter(([effectId, effectData]) =>\n this._effectContextFilter(inUUID, effectData)\n );\n return {\n document: obj,\n effects: effectsToEnd.map((effect) => effect[0]),\n };\n })\n .filter((obj) => obj.effects.length);\n\n const visibleEffectsToEnd = this.effects\n .filter((effect) => this._effectContextFilter(inUUID, effect.data))\n .map((e) => e.id);\n\n return Promise.allSettled([\n this._endManyEffects(visibleEffectsToEnd),\n ...documentEffectsToEnd.map((obj) => {\n return flagManager.removeFlags(obj.document.uuid, obj.effects);\n }),\n ]);\n }\n\n /**\n * Removes the effect from the manager and ends it, returning a promise that resolves once the effect has fully _ended\n *\n * @param effect\n * @returns {Promise}\n * @private\n */\n static _removeEffect(effect) {\n SequenceManager.VisibleEffects.delete(effect.id);\n TemporaryPositionsContainer.delete(effect.data.source);\n TemporaryPositionsContainer.delete(effect.data.target);\n return effect.endEffect();\n }\n\n static async _playPrototypeTokenEffects(data, push) {\n if (!lib.is_UUID(data.source)) return;\n\n const object = fromUuidSync(data.source);\n\n if (!(object instanceof TokenDocument)) return;\n\n const tokenEffectsToPlay = game.scenes\n .map((scene) =>\n scene.tokens.filter((token) => {\n return (\n token.actorLink && token.actor === object.actor && token !== object\n );\n })\n )\n .deepFlatten();\n\n for (const tokenDocument of tokenEffectsToPlay) {\n const duplicatedData = foundry.utils.deepClone(data);\n duplicatedData._id = randomID();\n duplicatedData.sceneId = tokenDocument.uuid.split(\".\")[1];\n duplicatedData.masks = duplicatedData.masks\n .map((uuid) => uuid.replace(duplicatedData.source, tokenDocument.uuid))\n .filter((uuid) => uuid.includes(duplicatedData.sceneId));\n duplicatedData.source = tokenDocument.uuid;\n if (CanvasEffect.checkValid(duplicatedData)) {\n if (push)\n sequencerSocket.executeForOthers(\n SOCKET_HANDLERS.PLAY_EFFECT,\n duplicatedData\n );\n if (duplicatedData.sceneId === game.user.viewedScene) {\n await this._playEffect(duplicatedData, false);\n }\n }\n }\n }\n}\n","import {\n EffectPlayer,\n InteractionManager,\n SelectionManager,\n} from \"../modules/sequencer-interaction-manager.js\";\nimport * as canvaslib from \"../lib/canvas-lib.js\";\nimport CONSTANTS from \"../constants.js\";\n\nexport class BaseEffectsLayer extends InteractionLayer {\n static get layerOptions() {\n return foundry.utils.mergeObject(super.layerOptions, {\n elevation: 100000000,\n name: \"sequencerEffects\",\n });\n }\n}\n\nexport class SequencerInterfaceLayer extends InteractionLayer {\n constructor(...args) {\n super(...args);\n }\n\n static get layerOptions() {\n return foundry.utils.mergeObject(super.layerOptions, {\n elevation: 100000000,\n name: \"sequencerInterfaceEffects\",\n });\n }\n\n deactivate() {\n super.deactivate();\n if (!this.active) return;\n this._clearChildren();\n this.active = false;\n InteractionManager.tearDown();\n }\n\n _setup() {\n if (!this.UIContainer || this.UIContainer._destroyed) {\n this.UIContainer = new PIXI.Container();\n this.UIContainer.sortableChildren = true;\n this.UIContainer.parentName = \"sequencerUIContainer\";\n this.UIContainer.zIndex = 10000000000000;\n this.addChild(this.UIContainer);\n\n this.linePoint = this.UIContainer.addChild(new PIXI.Graphics());\n this.line = this.UIContainer.addChild(new PIXI.Graphics());\n this.lineHead = this.UIContainer.addChild(new PIXI.Graphics());\n this.suggestionPoint = this.UIContainer.addChild(new PIXI.Graphics());\n this.effectHoverBoxes = this.UIContainer.addChild(new PIXI.Graphics());\n this.effectSelectionBorder = this.UIContainer.addChild(\n new PIXI.Graphics()\n );\n this.effectSourcePosition = this.UIContainer.addChild(\n new PIXI.Graphics()\n );\n this.effectTargetPosition = this.UIContainer.addChild(\n new PIXI.Graphics()\n );\n\n this.suggestionPoint.filters = [new PIXI.filters.AlphaFilter(0.75)];\n this.effectSourcePosition.filters = [new PIXI.filters.AlphaFilter(0.75)];\n this.effectTargetPosition.filters = [new PIXI.filters.AlphaFilter(0.75)];\n\n this.effectSelectionBorder.zIndex = 1;\n\n this.effectSourcePosition.interactive = true;\n this.effectSourcePosition.on(\"mousedown\", () => {\n SelectionManager.sourcePointSelected();\n });\n\n this.effectTargetPosition.interactive = true;\n this.effectTargetPosition.on(\"mousedown\", () => {\n SelectionManager.targetPointSelected();\n });\n }\n }\n\n async _draw(...args) {}\n\n render(...args) {\n super.render(...args);\n this._setup();\n this._clearChildren();\n this._drawHoveredEffectElements();\n if (!this.active) return;\n this._drawLine();\n this._drawPoints();\n this._drawSelectedEffectElements();\n this._drawSuggestionPoint();\n }\n\n _clearChildren() {\n if (!this.UIContainer) return;\n this.UIContainer.children.forEach((child) => {\n child.clear();\n });\n }\n\n _drawLine() {\n if (\n !EffectPlayer.startPos ||\n !EffectPlayer.endPos ||\n game?.activeTool !== \"play-effect\"\n )\n return;\n\n this.line.lineStyle(3, CONSTANTS.COLOR.PRIMARY, 1);\n // If line already present then set its position only\n this.line.moveTo(EffectPlayer.startPos.x, EffectPlayer.startPos.y);\n this.line.lineTo(EffectPlayer.endPos.x, EffectPlayer.endPos.y);\n }\n\n _drawPoints() {\n if (game?.activeTool !== \"play-effect\") return;\n\n const startPos = EffectPlayer.startPos || EffectPlayer.cursorPos;\n\n this.linePoint.beginFill(CONSTANTS.COLOR.PRIMARY);\n this.linePoint.drawCircle(startPos.x, startPos.y, 5);\n\n if (EffectPlayer.sourceAttachFound) {\n this._drawCrossAtLocation(this.linePoint, startPos);\n }\n\n if (!EffectPlayer.endPos) return;\n\n const angle = new Ray(startPos, EffectPlayer.endPos).angle;\n\n this.lineHead.beginFill(CONSTANTS.COLOR.PRIMARY);\n this.lineHead.moveTo(0, -5);\n this.lineHead.lineTo(-15, 30);\n this.lineHead.lineTo(15, 30);\n this.lineHead.endFill();\n this.lineHead.rotation = angle + Math.PI / 2;\n this.lineHead.position.set(EffectPlayer.endPos.x, EffectPlayer.endPos.y);\n\n if (EffectPlayer.targetAttachFound) {\n this.linePoint.beginFill(CONSTANTS.COLOR.SECONDARY);\n this._drawCrossAtLocation(this.linePoint, EffectPlayer.endPos);\n }\n }\n\n _drawHoveredEffectElements() {\n const effects = new Set(SelectionManager.hoveredEffects);\n if (SelectionManager.hoveredEffectUI)\n effects.add(SelectionManager.hoveredEffectUI);\n for (const effect of effects) {\n if (\n !effect ||\n effect === SelectionManager.selectedEffect ||\n effect.data.screenSpace ||\n effect._isEnding\n )\n continue;\n this._drawBoxAroundEffect(this.effectHoverBoxes, effect);\n }\n }\n\n _drawSelectedEffectElements() {\n if (!SelectionManager.selectedEffect) return;\n this._drawBoxAroundEffect(\n this.effectSelectionBorder,\n SelectionManager.selectedEffect,\n true\n );\n this._drawEffectStartEndPoints(SelectionManager.selectedEffect);\n }\n\n _drawBoxAroundEffect(graphic, effect, selected = false) {\n if (\n !effect ||\n effect._destroyed ||\n !effect.spriteContainer ||\n !effect.ready\n )\n return;\n\n graphic.lineStyle(3, selected ? CONSTANTS.COLOR.PRIMARY : 0xffffff, 0.9);\n\n let boundingBox = effect.sprite.getLocalBounds();\n let dimensions = {\n x: effect.position.x + boundingBox.x * effect.sprite.scale.x,\n y: effect.position.y + boundingBox.y * effect.sprite.scale.y,\n width: boundingBox.width * effect.sprite.scale.x,\n height: boundingBox.height * effect.sprite.scale.y,\n };\n\n if (effect.data.shapes.length) {\n for (const shape of Object.values(effect.shapes)) {\n boundingBox = shape.getLocalBounds();\n dimensions = {\n x: Math.min(\n dimensions.x,\n effect.position.x + boundingBox.x * shape.scale.x\n ),\n y: Math.min(\n dimensions.y,\n effect.position.y + boundingBox.y * shape.scale.y\n ),\n width: Math.max(dimensions.width, boundingBox.width * shape.scale.x),\n height: Math.max(\n dimensions.height,\n boundingBox.height * shape.scale.y\n ),\n };\n }\n }\n\n const rotation = Math.normalizeRadians(\n effect.rotationContainer.rotation +\n effect.spriteContainer.rotation +\n effect.sprite.rotation\n );\n\n this._drawRectangle(graphic, effect.position, rotation, dimensions);\n }\n\n _drawRectangle(graphic, position, rotation, dimensions) {\n graphic.moveTo(\n ...canvaslib.rotate_coordinate(\n position,\n {\n x: dimensions.x,\n y: dimensions.y,\n },\n -rotation\n )\n );\n\n graphic.lineTo(\n ...canvaslib.rotate_coordinate(\n position,\n {\n x: dimensions.x + dimensions.width,\n y: dimensions.y,\n },\n -rotation\n )\n );\n\n graphic.lineTo(\n ...canvaslib.rotate_coordinate(\n position,\n {\n x: dimensions.x + dimensions.width,\n y: dimensions.y + dimensions.height,\n },\n -rotation\n )\n );\n\n graphic.lineTo(\n ...canvaslib.rotate_coordinate(\n position,\n {\n x: dimensions.x,\n y: dimensions.y + dimensions.height,\n },\n -rotation\n )\n );\n\n graphic.lineTo(\n ...canvaslib.rotate_coordinate(\n position,\n {\n x: dimensions.x,\n y: dimensions.y,\n },\n -rotation\n )\n );\n\n graphic.lineTo(\n ...canvaslib.rotate_coordinate(\n position,\n {\n x: dimensions.x + dimensions.width,\n y: dimensions.y,\n },\n -rotation\n )\n );\n }\n\n /**\n * Draws the start/end point circles\n * @private\n */\n _drawEffectStartEndPoints(effect) {\n if (!effect || effect._destroyed || !effect.spriteContainer) return;\n\n if (\n !effect.data.stretchTo ||\n !effect.sourcePosition ||\n !effect.targetPosition\n )\n return;\n\n this.effectSourcePosition.beginFill(CONSTANTS.COLOR.PRIMARY);\n this.effectSourcePosition.drawCircle(\n effect.sourcePosition.x,\n effect.sourcePosition.y,\n canvas.grid.size * 0.25\n );\n\n if (typeof effect.data.source === \"string\") {\n this._drawCrossAtLocation(\n this.effectSourcePosition,\n effect.sourcePosition\n );\n }\n\n this.effectTargetPosition.beginFill(CONSTANTS.COLOR.SECONDARY);\n this.effectTargetPosition.drawCircle(\n effect.targetPosition.x,\n effect.targetPosition.y,\n canvas.grid.size * 0.25\n );\n this.effectTargetPosition.alpha = 0.75;\n\n if (typeof effect.data.target === \"string\") {\n this._drawCrossAtLocation(\n this.effectTargetPosition,\n effect.targetPosition\n );\n }\n }\n\n _drawSuggestionPoint() {\n if (\n !SelectionManager.suggestedProperties ||\n !SelectionManager.selectedEffect\n )\n return;\n\n const effect = SelectionManager.selectedEffect;\n const suggestion = SelectionManager.suggestedProperties;\n\n this.suggestionPoint.position.set(0, 0);\n this.suggestionPoint.rotation = 0;\n\n if (effect.data.stretchTo) {\n this.suggestionPoint.beginFill(suggestion.color);\n this.suggestionPoint.drawCircle(\n suggestion.position.x,\n suggestion.position.y,\n canvas.grid.size * 0.25\n );\n if (suggestion.showCursor) {\n this._drawCrossAtLocation(this.suggestionPoint, suggestion.position);\n }\n return;\n }\n\n const boundingBox = effect.spriteContainer.getLocalBounds();\n\n const dimensions = {\n x: boundingBox.x * effect.scale.x,\n y: boundingBox.y * effect.scale.y,\n width: boundingBox.width * effect.scale.x,\n height: boundingBox.height * effect.scale.y,\n };\n\n this.suggestionPoint.lineStyle(3, CONSTANTS.COLOR.PRIMARY, 0.9);\n this.suggestionPoint.position.set(\n suggestion.position.x,\n suggestion.position.y\n );\n this._drawRectangle(\n this.suggestionPoint,\n suggestion.position,\n effect.rotation,\n dimensions,\n true\n );\n\n if (suggestion.showCursor) {\n this.suggestionPoint.beginFill(CONSTANTS.COLOR.SECONDARY);\n this._drawCrossAtLocation(this.suggestionPoint);\n }\n\n if (suggestion.showPoint) {\n this.suggestionPoint.drawCircle(0, 0, canvas.grid.size * 0.2);\n }\n }\n\n _drawCrossAtLocation(inElement, inPosition = { x: 0, y: 0 }) {\n inElement.drawRect(\n inPosition.x + canvas.grid.size * -0.05,\n inPosition.y + canvas.grid.size * -0.5,\n canvas.grid.size * 0.1,\n canvas.grid.size\n );\n inElement.drawRect(\n inPosition.x + canvas.grid.size * -0.5,\n inPosition.y + canvas.grid.size * -0.05,\n canvas.grid.size,\n canvas.grid.size * 0.1\n );\n }\n}\n\nexport class UIEffectsLayer extends InteractionLayer {\n static get layerOptions() {\n return foundry.utils.mergeObject(super.layerOptions, {\n zIndex: 999999999999999,\n name: \"sequencerEffectsAboveEverything\",\n });\n }\n\n updateTransform() {\n if (this.sortableChildren && this.sortDirty) {\n this.sortChildren();\n }\n\n this._boundsID++;\n\n this.transform.updateTransform(PIXI.Transform.IDENTITY);\n this.worldAlpha = this.alpha;\n\n for (let child of this.children) {\n if (child.visible) {\n child.updateTransform();\n }\n }\n }\n}\n\nlet layer = false;\n\nexport class SequencerAboveUILayer {\n constructor(name, zIndex = 0.1) {\n this.canvas = document.createElement(\"canvas\");\n this.canvas.id = name;\n\n this.canvas.style.cssText = `\n position:absolute;\n touch-action: none;\n pointer-events: none;\n width:100%;\n height:100%;\n z-index:${zIndex};\n padding: 0;\n margin: 0;\n `;\n\n document.body.appendChild(this.canvas);\n\n this.app = new PIXI.Application({\n width: window.innerWidth,\n height: window.innerHeight,\n view: this.canvas,\n antialias: true,\n backgroundAlpha: 0.0,\n sharedTicker: true,\n });\n\n this.app.resizeTo = window;\n this.app.stage.renderable = false;\n }\n\n static setup() {\n if (!game.settings.get(\"sequencer\", \"enable-above-ui-screenspace\")) return;\n layer = new this(\"sequencerUILayerAbove\", 10000);\n }\n\n static getLayer() {\n return layer ? layer.app.stage : canvas.uiEffectsLayer;\n }\n\n static addChild(...args) {\n const result = this.getLayer().addChild(...args);\n layer.app.stage.renderable = layer.app.stage.children.length > 0;\n return result;\n }\n\n static sortChildren() {\n return this.getLayer().sortChildren();\n }\n\n static removeContainerByEffect(inEffect) {\n const child = this.getLayer().children.find((child) => child === inEffect);\n if (!child) return;\n this.getLayer().removeChild(child);\n layer.app.stage.renderable = layer.app.stage.children.length > 0;\n }\n\n updateTransform() {\n if (this.app.stage.sortableChildren && this.app.stage.sortDirty) {\n this.app.stage.sortChildren();\n }\n\n this.app.stage._boundsID++;\n\n this.app.stage.transform.updateTransform(PIXI.Transform.IDENTITY);\n this.app.stage.worldAlpha = this.app.stage.alpha;\n\n for (let child of this.app.stage.children) {\n if (child.visible) {\n child.updateTransform();\n }\n }\n }\n}\n","export default class VisionSamplerShader extends BaseSamplerShader {\n /** @override */\n static classPluginName = null;\n\n /** @inheritdoc */\n static vertexShader = `\n precision ${PIXI.settings.PRECISION_VERTEX} float;\n attribute vec2 aVertexPosition;\n attribute vec2 aTextureCoord;\n uniform mat3 projectionMatrix;\n uniform vec2 screenDimensions;\n varying vec2 vUvsMask;\n varying vec2 vUvs;\n void main() {\n vUvs = aTextureCoord;\n vUvsMask = aVertexPosition / screenDimensions;\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n }\n `;\n\n /** @inheritdoc */\n static fragmentShader = `\n precision ${PIXI.settings.PRECISION_FRAGMENT} float;\n varying vec2 vUvs;\n varying vec2 vUvsMask;\n uniform vec4 tintAlpha;\n uniform sampler2D sampler;\n uniform sampler2D maskSampler;\n uniform bool enableVisionMasking;\n void main() {\n float mask = enableVisionMasking ? texture2D(maskSampler, vUvsMask).r : 1.0;\n gl_FragColor = texture2D(sampler, vUvs) * tintAlpha * mask;\n }\n `;\n\n /** @inheritdoc */\n static defaultUniforms = {\n tintAlpha: [1, 1, 1, 1],\n sampler: 0,\n maskSampler: 0,\n screenDimensions: [1, 1],\n enableVisionMasking: false,\n };\n\n /** @override */\n _preRender(mesh) {\n super._preRender(mesh);\n this.uniforms.maskSampler = canvas.masks.vision.renderTexture;\n this.uniforms.screenDimensions = canvas.screenDimensions;\n this.uniforms.enableVisionMasking = canvas.effects.visibility.visible;\n }\n}\n","export default class MaskFilter extends AbstractBaseFilter {\n /** @override */\n static fragmentShader = `\\\n varying vec2 vTextureCoord;\n\n uniform sampler2D uSampler;\n uniform sampler2D uMaskSampler;\n\n void main(void) {\n gl_FragColor = texture2D(uSampler, vTextureCoord)\n * texture2D(uMaskSampler, vTextureCoord).a;\n }`;\n\n /** @override */\n static defaultUniforms = { uMaskSampler: null };\n\n /** @type {DisplayObject[]|null} */\n masks = [];\n\n /** @override */\n apply(filterManager, input, output, clearMode, currentState) {\n const maskFilterTexture = filterManager.getFilterTexture();\n const originalFilterTexture = this.#push(\n filterManager,\n currentState,\n maskFilterTexture\n );\n const renderer = filterManager.renderer;\n\n for (const mask of this.masks) {\n if (mask?.obj?.destroyed) continue;\n const renderable = mask.renderable;\n mask.renderable = true;\n mask.render(renderer);\n mask.renderable = renderable;\n }\n\n renderer.batch.flush();\n\n this.#pop(filterManager, currentState, originalFilterTexture);\n this.uniforms.uMaskSampler = maskFilterTexture;\n filterManager.applyFilter(this, input, output, clearMode);\n filterManager.returnFilterTexture(maskFilterTexture);\n }\n\n #push(filterManager, currentState, maskFilterTexture) {\n const originalFilterTexture = currentState.renderTexture;\n\n currentState.renderTexture = maskFilterTexture;\n filterManager.defaultFilterStack.push(currentState);\n filterManager.bindAndClear(maskFilterTexture);\n\n return originalFilterTexture;\n }\n\n #pop(filterManager, currentState, originalFilterTexture) {\n currentState.renderTexture = originalFilterTexture;\n filterManager.defaultFilterStack.pop();\n\n if (filterManager.activeState === currentState) {\n return;\n }\n\n filterManager.activeState = currentState;\n\n const globalUniforms = filterManager.globalUniforms.uniforms;\n\n globalUniforms.outputFrame = currentState.sourceFrame;\n globalUniforms.resolution = currentState.resolution;\n\n const inputSize = globalUniforms.inputSize;\n const inputPixel = globalUniforms.inputPixel;\n const inputClamp = globalUniforms.inputClamp;\n\n inputSize[0] = currentState.destinationFrame.width;\n inputSize[1] = currentState.destinationFrame.height;\n inputSize[2] = 1.0 / inputSize[0];\n inputSize[3] = 1.0 / inputSize[1];\n\n inputPixel[0] = Math.round(inputSize[0] * currentState.resolution);\n inputPixel[1] = Math.round(inputSize[1] * currentState.resolution);\n inputPixel[2] = 1.0 / inputPixel[0];\n inputPixel[3] = 1.0 / inputPixel[1];\n\n inputClamp[0] = 0.5 * inputPixel[2];\n inputClamp[1] = 0.5 * inputPixel[3];\n inputClamp[2] =\n currentState.sourceFrame.width * inputSize[2] - 0.5 * inputPixel[2];\n inputClamp[3] =\n currentState.sourceFrame.height * inputSize[3] - 0.5 * inputPixel[3];\n\n if (currentState.legacy) {\n const filterArea = globalUniforms.filterArea;\n\n filterArea[0] = currentState.destinationFrame.width;\n filterArea[1] = currentState.destinationFrame.height;\n filterArea[2] = currentState.sourceFrame.x;\n filterArea[3] = currentState.sourceFrame.y;\n\n globalUniforms.filterClamp = globalUniforms.inputClamp;\n }\n\n filterManager.globalUniforms.update();\n }\n}\n","import CONSTANTS from \"../constants.js\";\nimport filters from \"../lib/filters.js\";\nimport * as lib from \"../lib/lib.js\";\nimport * as canvaslib from \"../lib/canvas-lib.js\";\nimport { SequencerFileBase } from \"../modules/sequencer-file.js\";\nimport SequencerAnimationEngine from \"../modules/sequencer-animation-engine.js\";\nimport SequencerFileCache from \"../modules/sequencer-file-cache.js\";\nimport flagManager from \"../utils/flag-manager.js\";\nimport { sequencerSocket, SOCKET_HANDLERS } from \"../sockets.js\";\nimport SequencerEffectManager from \"../modules/sequencer-effect-manager.js\";\nimport { SequencerAboveUILayer } from \"./effects-layer.js\";\nimport VisionSamplerShader from \"../lib/filters/vision-mask-filter.js\";\nimport MaskFilter from \"../lib/filters/mask-filter.js\";\n\nconst hooksManager = {\n _hooks: new Map(),\n _hooksRegistered: new Set(),\n\n addHook(effectUuid, hookName, callable, callNow = false) {\n if (!this._hooksRegistered.has(hookName)) {\n lib.debug(\"registering hook for: \" + hookName);\n this._hooksRegistered.add(hookName);\n Hooks.on(hookName, (...args) => {\n this._hookCalled(hookName, ...args);\n });\n }\n\n const key = hookName + \"-\" + effectUuid;\n\n if (!this._hooks.has(key)) {\n this._hooks.set(key, []);\n }\n\n this._hooks.get(key).push(callable);\n\n if (callNow) {\n setTimeout(() => {\n callable();\n }, 20);\n }\n },\n\n _hookCalled(hookName, ...args) {\n Array.from(this._hooks)\n .filter((entry) => entry[0].startsWith(hookName + \"-\"))\n .map((hooks) => hooks[1])\n .deepFlatten()\n .forEach((callback) => callback(...args));\n },\n\n removeHooks(effectUuid) {\n Array.from(this._hooks)\n .filter((entry) => entry[0].endsWith(\"-\" + effectUuid))\n .forEach((entry) => this._hooks.delete(entry[0]));\n },\n};\n\nexport default class CanvasEffect extends PIXI.Container {\n #elevation = 0;\n #sort = 0;\n\n constructor(inData) {\n super();\n\n this.sortableChildren = true;\n\n // Set default values\n this.actualCreationTime = +new Date();\n this.data = inData;\n\n this._resolve = null;\n this._durationResolve = null;\n\n this.ready = false;\n this._ended = false;\n this._isEnding = false;\n\n this._cachedSourceData = {};\n this._cachedTargetData = {};\n\n this.uuid = false;\n }\n\n static get protectedValues() {\n return [\n \"_id\",\n \"sequenceId\",\n \"creationTimestamp\",\n \"creatorUserId\",\n \"moduleName\",\n \"index\",\n \"repetition\",\n \"moves\",\n \"fadeIn\",\n \"fadeOut\",\n \"scaleIn\",\n \"scaleOut\",\n \"rotateIn\",\n \"rotateOut\",\n \"fadeInAudio\",\n \"fadeOutAudio\",\n \"animations\",\n \"nameOffsetMap\",\n \"persist\",\n ];\n }\n\n /** @type {number} */\n get elevation() {\n return this.#elevation;\n }\n\n set elevation(value) {\n this.#elevation = value;\n }\n\n /** @type {number} */\n get sort() {\n return this.#sort;\n }\n\n set sort(value) {\n this.#sort = value;\n }\n\n get context() {\n return this.data.attachTo?.active && this.sourceDocument\n ? this.sourceDocument\n : game.scenes.get(this.data.sceneId);\n }\n\n get isIsometricActive() {\n const sceneIsIsometric = getProperty(\n game.scenes.get(this.data.sceneId),\n CONSTANTS.INTEGRATIONS.ISOMETRIC.SCENE_ENABLED\n );\n return CONSTANTS.INTEGRATIONS.ISOMETRIC.ACTIVE && sceneIsIsometric;\n }\n\n /**\n * The ID of the effect\n *\n * @returns {string}\n */\n get id() {\n return this.data._id;\n }\n\n /**\n * Whether this effect is destroyed or is in the process of being destroyed\n */\n get isDestroyed() {\n return (\n (this.source && this.isSourceDestroyed) ||\n (this.target && this.isTargetDestroyed)\n );\n }\n\n /**\n * Whether the source of this effect is temporary\n *\n * @returns {boolean}\n */\n get isSourceTemporary() {\n return (\n this.data.attachTo?.active &&\n this.sourceDocument &&\n !lib.is_UUID(this.sourceDocument?.uuid)\n );\n }\n\n /**\n * Whether the source of this effect has been destroyed\n *\n * @returns {boolean}\n */\n get isSourceDestroyed() {\n return (\n this.source && (this.source?.destroyed || !this.sourceDocument?.object)\n );\n }\n\n /**\n * Whether the target of this effect is temporary\n *\n * @returns {boolean}\n */\n get isTargetTemporary() {\n return (\n (this.data.stretchTo?.attachTo || this.data.rotateTowards?.attachTo) &&\n this.targetDocument &&\n !lib.is_UUID(this.targetDocument.uuid)\n );\n }\n\n /**\n * Whether the target of this effect has been destroyed\n *\n * @returns {boolean}\n */\n get isTargetDestroyed() {\n return (\n this.target && (this.target?.destroyed || !this.targetDocument?.object)\n );\n }\n\n /**\n * The source object (or source location) of the effect\n *\n * @returns {boolean|object}\n */\n get source() {\n if (!this._source && this.data.source) {\n this._source = this._getObjectByID(this.data.source);\n this._source = this._source?._object ?? this._source;\n }\n return this._source;\n }\n\n /**\n * Retrieves the source document\n *\n * @returns {Document|PlaceableObject}\n */\n get sourceDocument() {\n return this.source?.document ?? this.source;\n }\n\n /**\n * Retrieves the PIXI object for the source object\n *\n * @returns {*|PIXI.Sprite|TileHUD<Application.Options>}\n */\n get sourceMesh() {\n return this.source?.mesh ?? this.source?.template;\n }\n\n /**\n * The source position with the relevant offsets calculated\n *\n * @returns {{x: number, y: number}}\n */\n get sourcePosition() {\n let position = this.getSourceData().position;\n let offset = this._getOffset(this.data.source, true);\n\n return {\n x: position.x - offset.x,\n y: position.y - offset.y,\n };\n }\n\n /**\n * The target object (or target location) of the effect\n *\n * @returns {boolean|object}\n */\n get target() {\n if (!this._target && this.data.target) {\n this._target = this._getObjectByID(this.data.target);\n this._target = this._target?._object ?? this._target;\n }\n return this._target;\n }\n\n /**\n * Retrieves the document of the target\n *\n * @returns {Document|PlaceableObject}\n */\n get targetDocument() {\n return this.target?.document ?? this.target;\n }\n\n /**\n * Retrieves the PIXI object for the target object\n *\n * @returns {*|PIXI.Sprite|TileHUD<Application.Options>}\n */\n get targetMesh() {\n return this.target?.mesh ?? this.target?.template;\n }\n\n /**\n * The target position with the relevant offsets calculated\n *\n * @returns {{x: number, y: number}}\n */\n get targetPosition() {\n const position = this.getTargetData().position;\n const offset = this._getOffset(this.data.target);\n\n return {\n x: position.x - offset.x,\n y: position.y - offset.y,\n };\n }\n\n /**\n * Returns this effect's world position\n *\n * @returns {{x: number, y: number}}\n */\n get worldPosition() {\n const t = canvas.stage.worldTransform;\n return {\n x: (this.sprite.worldTransform.tx - t.tx) / canvas.stage.scale.x,\n y: (this.sprite.worldTransform.ty - t.ty) / canvas.stage.scale.y,\n };\n }\n\n /**\n * Whether the current user is the owner of this effect\n *\n * @returns {boolean}\n */\n get owner() {\n return this.data.creatorUserId === game.user.id;\n }\n\n /**\n * Whether the current user can update this effect\n *\n * @returns {boolean}\n */\n get userCanUpdate() {\n return (\n game.user.isGM ||\n this.owner ||\n (this.data.attachTo?.active &&\n this.sourceDocument.canUserModify(game.user, \"update\"))\n );\n }\n\n /**\n * Whether the current user can delete this effect\n *\n * @returns {boolean}\n */\n get userCanDelete() {\n return this.userCanUpdate || lib.user_can_do(\"permissions-effect-delete\");\n }\n\n /**\n * Whether this effect is on the current scene\n *\n * @returns {boolean}\n */\n get onCurrentScene() {\n return this.data.sceneId === game.user.viewedScene;\n }\n\n /**\n * Whether this effect should be shown as faded or not - effects created by users for other users should be shown\n * for all\n *\n * @returns {boolean}\n */\n get shouldShowFadedVersion() {\n // If the user has not set the opacity user-specific effects to 0\n // And it is not an effect that is only played for the user who created the effect\n // And if the effect is going to be played for a subset of users\n // And the users does not contain this user\n return (\n this.data.users &&\n this.data.users.length &&\n !(\n this.data.users.length === 1 &&\n this.data.users.includes(this.data.creatorUserId)\n ) &&\n !this.data.users.includes(game.userId)\n );\n }\n\n /**\n * Getter for the current playing video of the effect\n *\n * @returns {null|*}\n */\n get video() {\n return this._video;\n }\n\n /**\n * Setter for the current playing video of the effect\n */\n set video(inVideo) {\n if (!inVideo) return;\n\n inVideo.playbackRate = this.data.playbackRate\n ? this.data.playbackRate\n : 1.0;\n inVideo.muted = !this.data.volume;\n inVideo.volume =\n (this.data.volume ?? 0) *\n game.settings.get(\"core\", \"globalInterfaceVolume\");\n\n if (!this._video) {\n this._video = inVideo;\n return;\n }\n\n const isLooping = this._video?.loop;\n const currentTime = this._video.currentTime;\n\n this._video = inVideo;\n\n this._video.currentTime = this.playNaturally\n ? 0\n : Math.min(currentTime, this._video.duration);\n this._video.loop = isLooping;\n\n this.updateTexture();\n }\n\n async playMedia() {\n if (this.animatedSprite) {\n await this.sprite.play();\n } else if (this.video) {\n try {\n await this.video.play().then(() => {\n this.updateTexture();\n });\n } catch (err) {}\n }\n this._setupTimestampHook(this.mediaCurrentTime * 1000);\n }\n\n updateTexture() {\n if (this._texture.valid) {\n this._texture.update();\n }\n }\n\n async pauseMedia() {\n if (this.animatedSprite) {\n return this.sprite.stop();\n } else if (this.video) {\n return this.video.pause();\n }\n }\n\n get mediaLooping() {\n if (this.animatedSprite) {\n return this.sprite.loop;\n }\n return this.video?.loop ?? false;\n }\n\n set mediaLooping(looping) {\n if (this.animatedSprite) {\n this.sprite.loop = looping;\n return;\n }\n if (this.video) {\n this.video.loop = looping;\n }\n }\n\n get mediaIsPlaying() {\n if (this.animatedSprite) {\n return this.sprite.playing;\n }\n return this.video;\n }\n\n get mediaCurrentTime() {\n if (this.animatedSprite) {\n return (\n (this.sprite.currentFrame / this.sprite.totalFrames) *\n (this.sprite.totalFrames / 24)\n );\n }\n return this.video?.currentTime ?? null;\n }\n\n get mediaPlaybackRate() {\n if (this.animatedSprite) {\n return this.sprite.animationSpeed;\n } else if (this.video) {\n return this.video.playbackRate;\n }\n }\n\n set mediaPlaybackRate(inPlaybackRate) {\n if (this.animatedSprite) {\n this.sprite.animationSpeed = 0.4 * inPlaybackRate;\n } else if (this.video) {\n this.video.playbackRate = inPlaybackRate;\n }\n }\n\n set mediaCurrentTime(newTime) {\n if (this.animatedSprite) {\n const newFrame = Math.floor(newTime * this.sprite.totalFrames);\n const clampedFrame = Math.max(\n 0,\n Math.min(newFrame, this.sprite.totalFrames)\n );\n if (this.mediaIsPlaying) {\n this.sprite.gotoAndPlay(clampedFrame);\n } else {\n this.sprite.gotoAndStop(clampedFrame);\n }\n } else if (this.video) {\n this.video.currentTime = newTime;\n }\n }\n\n get mediaDuration() {\n if (this.animatedSprite) {\n return (\n this.sprite.totalFrames /\n this.sprite.animationSpeed /\n PIXI.Ticker.shared.FPS\n );\n } else if (this.video) {\n return this.video?.duration / this.mediaPlaybackRate;\n }\n return 1;\n }\n\n get hasAnimatedMedia() {\n return !!(this.video || this.animatedSprite);\n }\n\n /**\n * The template of the effect, determining the effect's internal grid size, and start/end padding\n *\n * @returns {object}\n */\n get template() {\n return foundry.utils.mergeObject(\n {\n gridSize: 100,\n startPoint: 0,\n endPoint: 0,\n },\n this._template ?? {}\n );\n }\n\n /**\n * The grid size difference between the internal effect's grid vs the grid on the canvas. If the effect is in screen space, we ignore this.\n *\n * @returns {number}\n */\n get gridSizeDifference() {\n return canvas.grid.size / this.template.gridSize;\n }\n\n /**\n * Whether the effect should be flipped on any given axis\n *\n * @returns {number}\n */\n get flipX() {\n return this.data.flipX ? -1 : 1;\n }\n\n get flipY() {\n return this.data.flipY ? -1 : 1;\n }\n\n /**\n * Whether this effect should play at all, depending on a multitude of factors\n *\n * @returns {boolean}\n */\n get shouldPlay() {\n return (\n (game.user.viewedScene === this.data.sceneId ||\n this.data.creatorUserId === game.userId) &&\n (game.user.isGM ||\n !this.data.users ||\n this.data.users.length === 0 ||\n this.data.users.includes(game.userId))\n );\n }\n\n get shouldPlayVisible() {\n let playVisible =\n this.shouldPlay &&\n game.settings.get(\"sequencer\", \"effectsEnabled\") &&\n game.user.viewedScene === this.data.sceneId;\n\n if (\n isNewerVersion(game.version, \"10.289\") &&\n game.settings.get(\"core\", \"photosensitiveMode\")\n ) {\n playVisible = false;\n lib.throttled_custom_warning(\n this.data.moduleName,\n \"Photosensitive Mode is turned on, so Sequencer's visual effects aren't being rendered\"\n );\n }\n\n return playVisible;\n }\n\n /**\n * Whether this effect should play naturally, or be constrained to a subsection of the video\n *\n * @returns {boolean}\n */\n get playNaturally() {\n return (\n (!this.data.time ||\n (this._startTime === 0 && this._endTime === this.mediaDuration)) &&\n this._animationTimes.loopStart === undefined &&\n this._animationTimes.loopEnd === undefined\n );\n }\n\n static make(inData) {\n return !inData.persist\n ? new CanvasEffect(inData)\n : new PersistentCanvasEffect(inData);\n }\n\n static checkValid(effectData) {\n if (effectData.delete) {\n return false;\n }\n let sourceExists = true;\n let targetExists = true;\n if (effectData.source && lib.is_UUID(effectData.source)) {\n sourceExists = fromUuidSync(effectData.source);\n }\n if (effectData.target && lib.is_UUID(effectData.target)) {\n targetExists = fromUuidSync(effectData.target);\n }\n for (let tiedDocumentUuid of effectData?.tiedDocuments ?? []) {\n if (tiedDocumentUuid && lib.is_UUID(tiedDocumentUuid)) {\n let tiedDocumentExists = fromUuidSync(tiedDocumentUuid);\n if (!tiedDocumentExists) return false;\n }\n }\n if (\n effectData.source &&\n lib.is_UUID(effectData.source) &&\n effectData.target &&\n lib.is_UUID(effectData.target)\n ) {\n const sourceScene = effectData.source.split(\".\")[1];\n const targetScene = effectData.target.split(\".\")[1];\n if (sourceScene !== targetScene || sourceScene !== effectData.sceneId)\n return false;\n }\n return sourceExists && targetExists;\n }\n\n /**\n * Validates that the update contains the appropriate data\n *\n * @param inUpdates\n */\n static validateUpdate(inUpdates) {\n const updateKeys = Object.keys(inUpdates);\n const protectedValues = updateKeys.filter((key) =>\n CanvasEffect.protectedValues.includes(key)\n );\n if (protectedValues.length) {\n throw lib.custom_error(\n \"Sequencer\",\n `CanvasEffect | update | You cannot update the following keys of an effect's data: ${protectedValues.join(\n \"\\n - \"\n )}`\n );\n }\n if (updateKeys.includes(\"source\")) {\n if (\n !(\n lib.is_UUID(inUpdates.source) ||\n canvaslib.is_object_canvas_data(inUpdates.source)\n )\n ) {\n throw lib.custom_error(\n \"Sequencer\",\n `CanvasEffect | update | source must be of type document UUID or object with X and Y coordinates`\n );\n }\n }\n if (updateKeys.includes(\"target\")) {\n if (\n !(\n lib.is_UUID(inUpdates.target) ||\n canvaslib.is_object_canvas_data(inUpdates.target)\n )\n ) {\n throw lib.custom_error(\n \"Sequencer\",\n `CanvasEffect | update | target must be of type document UUID or object with X and Y coordinates`\n );\n }\n }\n }\n\n getHook(type, uuid) {\n if (!lib.is_UUID(uuid)) return false;\n const parts = uuid.split(\".\");\n return type + parts[parts.length - 2];\n }\n\n /**\n * Gets the source hook name\n *\n * @param {string} type\n * @returns {string|boolean}\n */\n getSourceHook(type = \"\") {\n return this.getHook(type, this.data.source);\n }\n\n /**\n * The source object's current position, or its current position\n *\n * @returns {boolean|object}\n */\n getSourceData() {\n if (this.data.temporary && !this.owner) {\n return SequencerEffectManager.getPositionForUUID(this.data.source);\n }\n\n const position =\n this.source instanceof PlaceableObject && !this.isSourceTemporary\n ? canvaslib.get_object_position(this.source)\n : this.source?.worldPosition || this.source?.center || this.source;\n\n const { width, height } = canvaslib.get_object_dimensions(this.source);\n\n if (this.isIsometricActive && this.source instanceof PlaceableObject) {\n position.x +=\n ((this.sourceDocument.elevation ?? 0) / canvas.scene.grid.distance) *\n canvas.grid.size;\n position.y -=\n ((this.sourceDocument.elevation ?? 0) / canvas.scene.grid.distance) *\n canvas.grid.size;\n if (\n this.data.isometric?.overlay ||\n this.target instanceof PlaceableObject\n ) {\n position.x += (this.source?.height ?? height) / 2;\n position.y -= (this.source?.height ?? height) / 2;\n }\n }\n\n if (position !== undefined) {\n this._cachedSourceData.position = position;\n }\n\n if (width !== undefined && height !== undefined) {\n this._cachedSourceData.width = width;\n this._cachedSourceData.height = height;\n }\n\n let rotation = 0;\n if (\n this.source instanceof MeasuredTemplate &&\n this.sourceDocument?.t !== \"rect\"\n ) {\n rotation = Math.normalizeRadians(\n Math.toRadians(this.sourceDocument?.direction)\n );\n } else if (!(this.source instanceof MeasuredTemplate)) {\n rotation = this.sourceDocument?.rotation\n ? Math.normalizeRadians(Math.toRadians(this.sourceDocument?.rotation))\n : 0;\n }\n\n if (rotation !== undefined) {\n this._cachedSourceData.rotation = rotation;\n }\n\n const alpha =\n this.sourceDocument instanceof TokenDocument ||\n this.sourceDocument instanceof TileDocument\n ? this.sourceDocument?.alpha ?? 1.0\n : 1.0;\n\n if (alpha !== undefined) {\n this._cachedSourceData.alpha = alpha;\n }\n\n return {\n ...this._cachedSourceData,\n };\n }\n\n /**\n * Gets the target hook name\n *\n * @param {string} type\n * @returns {string|boolean}\n */\n getTargetHook(type = \"\") {\n return this.getHook(type, this.data.target);\n }\n\n /**\n * The target object's current position, or its current position\n *\n * @returns {boolean|object}\n */\n getTargetData() {\n if (this.data.temporary && !this.owner) {\n return (\n SequencerEffectManager.getPositionForUUID(this.data.target) ??\n this.getSourceData()\n );\n }\n\n const position =\n this.target instanceof PlaceableObject && !this.isTargetTemporary\n ? canvaslib.get_object_position(this.target, { measure: true })\n : this.target?.worldPosition || this.target?.center || this.target;\n\n const { width, height } = canvaslib.get_object_dimensions(this.target);\n\n if (this.isIsometricActive && this.target instanceof PlaceableObject) {\n const targetHeight = this.target?.height ?? height;\n position.x +=\n ((this.targetDocument.elevation ?? 0) / canvas.scene.grid.distance) *\n canvas.grid.size +\n targetHeight;\n position.y -=\n ((this.targetDocument.elevation ?? 0) / canvas.scene.grid.distance) *\n canvas.grid.size +\n targetHeight;\n }\n\n if (width !== undefined && height !== undefined) {\n this._cachedTargetData.width = width;\n this._cachedTargetData.height = height;\n }\n\n if (position !== undefined) {\n this._cachedTargetData.position = position;\n }\n\n let rotation = 0;\n if (\n this.target instanceof MeasuredTemplate &&\n this.targetDocument?.t !== \"rect\"\n ) {\n rotation = Math.normalizeRadians(\n Math.toRadians(this.targetDocument?.direction)\n );\n } else if (!(this.target instanceof MeasuredTemplate)) {\n rotation = this.targetDocument?.rotation\n ? Math.normalizeRadians(Math.toRadians(this.targetDocument?.rotation))\n : 0;\n }\n\n if (rotation !== undefined) {\n this._cachedTargetData.rotation = rotation;\n }\n\n const alpha =\n this.targetDocument instanceof TokenDocument ||\n this.targetDocument instanceof TileDocument\n ? this.targetDocument?.alpha ?? 1.0\n : 1.0;\n\n if (alpha !== undefined) {\n this._cachedTargetData.alpha = alpha;\n }\n\n return {\n ...this._cachedTargetData,\n };\n }\n\n /**\n * Calculates the offset for a given offset property and name mapping\n *\n * @param {string} offsetMapName\n * @param {boolean} source\n * @returns {{x: number, y: number}|*}\n * @private\n */\n _getOffset(offsetMapName, source = false) {\n const key = source ? \"source\" : \"target\";\n\n const offset = {\n x: 0,\n y: 0,\n };\n\n let twister = this._twister;\n\n let nameOffsetMap = this._nameOffsetMap?.[this.data.name];\n\n if (nameOffsetMap) {\n twister = nameOffsetMap.twister;\n }\n\n // If the effect is missing, and it's not the source we're offsetting OR it is the source, but we don't have a target (it's playing on the spot)\n if (this.data.missed && (!source || !this.data.target)) {\n let missedOffset =\n this._offsetCache[key]?.missedOffset ||\n canvaslib.calculate_missed_position(this.source, this.target, twister);\n this._offsetCache[key].missedOffset = missedOffset;\n offset.x -= missedOffset.x;\n offset.y -= missedOffset.y;\n }\n\n const obj = source ? this.source : this.target;\n const multiplier = source\n ? this.data.randomOffset?.source\n : this.data.randomOffset?.target;\n\n if (obj && multiplier) {\n let randomOffset =\n this._offsetCache[key]?.randomOffset ||\n canvaslib.get_random_offset(obj, multiplier, twister);\n this._offsetCache[key].randomOffset = randomOffset;\n offset.x -= randomOffset.x;\n offset.y -= randomOffset.y;\n }\n\n let extraOffset = this.data?.offset?.[key];\n if (extraOffset) {\n let newOffset = {\n x: extraOffset.x,\n y: extraOffset.y,\n };\n if (extraOffset.gridUnits) {\n newOffset.x *= canvas.grid.size;\n newOffset.y *= canvas.grid.size;\n }\n if (extraOffset.local) {\n if (\n !this._cachedSourceData?.position ||\n !this._cachedTargetData?.position\n ) {\n this.getSourceData();\n this.getTargetData();\n }\n\n const startPos = this._cachedSourceData.position;\n const endPos = this._cachedTargetData.position;\n\n const angle = this.target\n ? new Ray(startPos, endPos).angle\n : Ray.fromAngle(\n startPos.x,\n startPos.y,\n this._cachedSourceData.rotation,\n 1\n ).angle;\n\n newOffset = canvaslib.rotateAroundPoint(\n 0,\n 0,\n newOffset.x,\n newOffset.y,\n -angle\n );\n }\n offset.x -= newOffset.x;\n offset.y -= newOffset.y;\n }\n\n let offsetMap = this._nameOffsetMap?.[offsetMapName];\n\n if (!this._offsetCache[key][\"nameCache\"][offsetMapName]) {\n this._offsetCache[key][\"nameCache\"][offsetMapName] = {};\n }\n\n if (offsetMap) {\n if (offsetMap.missed) {\n const missedOffset =\n this._offsetCache[key][\"nameCache\"][offsetMapName]?.missedOffset ||\n canvaslib.calculate_missed_position(\n offsetMap.sourceObj,\n offsetMap.targetObj,\n offsetMap.twister\n );\n this._offsetCache[key][\"nameCache\"][offsetMapName].missedOffset =\n missedOffset;\n offset.x -= missedOffset.x;\n offset.y -= missedOffset.y;\n }\n\n const obj = offsetMap.targetObj || offsetMap.sourceObj;\n const multiplier =\n offsetMap.randomOffset?.source || offsetMap.randomOffset?.target;\n\n if (obj && multiplier) {\n let randomOffset =\n this._offsetCache[key][\"nameCache\"][offsetMapName]?.randomOffset ||\n canvaslib.get_random_offset(obj, multiplier, offsetMap.twister);\n this._offsetCache[key][\"nameCache\"][offsetMapName].randomOffset =\n randomOffset;\n offset.x -= randomOffset.x;\n offset.y -= randomOffset.y;\n }\n\n if (offsetMap.offset) {\n offset.x += offsetMap.offset.x;\n offset.y += offsetMap.offset.y;\n }\n }\n\n return offset;\n }\n\n /**\n * Initializes the name offset map by establishing targets\n *\n * @param inOffsetMap\n * @returns {{setup}|*}\n * @private\n */\n _setupOffsetMap(inOffsetMap) {\n if (!inOffsetMap.setup) {\n inOffsetMap.setup = true;\n inOffsetMap.sourceObj = inOffsetMap.source\n ? this._validateObject(inOffsetMap.source)\n : false;\n inOffsetMap.targetObj = inOffsetMap.target\n ? this._validateObject(inOffsetMap.target)\n : false;\n const repetition = this.data.repetition % inOffsetMap.repetitions;\n const seed = lib.get_hash(`${inOffsetMap.seed}-${repetition}`);\n inOffsetMap.twister = new MersenneTwister(seed);\n }\n\n return inOffsetMap;\n }\n\n /**\n * Plays the effect, returning two promises; one that resolves once the duration has been established, and another\n * when the effect has finished playing\n *\n * @returns {Object}\n */\n play() {\n const durationPromise = new Promise((resolve, reject) => {\n this._durationResolve = resolve;\n });\n\n const finishPromise = new Promise(async (resolve, reject) => {\n this._resolve = resolve;\n Hooks.callAll(\"createSequencerEffect\", this);\n lib.debug(`Playing effect:`, this.data);\n this._initialize();\n });\n\n return {\n duration: durationPromise,\n promise: finishPromise,\n };\n }\n\n /**\n * Ends the effect\n */\n endEffect() {\n if (this._ended) return;\n Hooks.callAll(\"endedSequencerEffect\", this);\n this.destroy();\n }\n\n destroy(...args) {\n this._destroyDependencies();\n return super.destroy(...args);\n }\n\n /**\n * Updates this effect with the given parameters\n * @param inUpdates\n * @returns {Promise}\n */\n async update(inUpdates) {\n if (!this.userCanUpdate)\n throw lib.custom_error(\n \"Sequencer\",\n \"CanvasEffect | Update | You do not have permission to update this effect\"\n );\n CanvasEffect.validateUpdate(inUpdates);\n\n const newData = foundry.utils.deepClone(this.data);\n const updateKeys = Object.keys(inUpdates);\n\n updateKeys.forEach((key) => {\n setProperty(newData, key, inUpdates[key]);\n });\n\n if (\n Object.keys(foundry.utils.diffObject(newData, this.data)).length === 0\n ) {\n lib.debug(\n `Skipped updating effect with ID ${this.id} - no changes needed`\n );\n return;\n }\n\n if (this.data.persist) {\n const originalSourceUUID =\n lib.is_UUID(this.data.source) && this.data.attachTo\n ? this.data.source\n : \"Scene.\" + this.data.sceneId;\n\n const newSourceUUID =\n lib.is_UUID(newData.source) && newData.attachTo\n ? newData.source\n : \"Scene.\" + newData.sceneId;\n\n if (originalSourceUUID !== newSourceUUID) {\n flagManager.removeFlags(originalSourceUUID, newData);\n }\n\n flagManager.addFlags(newSourceUUID, newData);\n }\n\n lib.debug(`Updated effect with ID ${this.id}`);\n\n return sequencerSocket.executeForEveryone(\n SOCKET_HANDLERS.UPDATE_EFFECT,\n this.id,\n newData\n );\n }\n\n async addAnimatedProperties({ animations = [], loopingAnimation = [] } = {}) {\n const animationsToAdd = [];\n if (!Array.isArray(animations)) {\n throw lib.custom_error(\n this.data.moduleName,\n `animations must be an array of arrays`\n );\n }\n for (const animationData of animations) {\n if (!Array.isArray(animationData)) {\n throw lib.custom_error(\n this.data.moduleName,\n `each entry in animations must be an array, each with target, property name, and animation options`\n );\n }\n const result = canvaslib.validateAnimation(...animationData);\n if (typeof result === \"string\") {\n throw lib.custom_error(this.data.moduleName, result);\n }\n result.creationTimestamp = +new Date();\n animationsToAdd.push(result);\n }\n if (!Array.isArray(loopingAnimation)) {\n throw lib.custom_error(\n this.data.moduleName,\n `loopingAnimation must be an array of arrays`\n );\n }\n for (const animationData of loopingAnimation) {\n if (!Array.isArray(animationData)) {\n throw lib.custom_error(\n this.data.moduleName,\n `each entry in loopingAnimation must be an array, each with target, property name, and animation options`\n );\n }\n const result = canvaslib.validateLoopingAnimation(...animationData);\n if (typeof result === \"string\") {\n throw lib.custom_error(this.data.moduleName, result);\n }\n result.creationTimestamp = +new Date();\n animationsToAdd.push(result);\n }\n\n if (this.data.persist) {\n const originalSourceUUID =\n lib.is_UUID(this.data.source) && this.data.attachTo\n ? this.data.source\n : \"Scene.\" + this.data.sceneId;\n const newData = foundry.utils.deepClone(this.data);\n newData.animations = (newData.animations ?? []).concat(\n foundry.utils.deepClone(animationsToAdd)\n );\n flagManager.addFlags(originalSourceUUID, newData);\n }\n\n return sequencerSocket.executeForEveryone(\n SOCKET_HANDLERS.ADD_EFFECT_ANIMATIONS,\n this.id,\n animationsToAdd\n );\n }\n\n async _addAnimations(inAnimations) {\n this._playAnimations(inAnimations);\n this.data.animations = (this.data.animations ?? []).concat(inAnimations);\n }\n\n /**\n * Updates the effect\n *\n * @param inUpdates\n * @returns {Promise}\n * @private\n */\n _update(inUpdates) {\n this.data = inUpdates;\n Hooks.callAll(\"updateSequencerEffect\", this);\n this._destroyDependencies();\n return this._reinitialize();\n }\n\n /**\n * Determines whether a position is within the bounds of this effect\n *\n * @param inPosition\n * @returns {boolean}\n */\n isPositionWithinBounds(inPosition) {\n if (!this.spriteContainer) return false;\n return canvaslib.is_position_within_bounds(\n inPosition,\n this.spriteContainer,\n this.parent\n );\n }\n\n /**\n * Initializes the effect and places it on the canvas\n *\n * @param {boolean} play\n * @returns {Promise}\n * @private\n */\n async _initialize(play = true) {\n this.ready = false;\n this._initializeVariables();\n await this._contextLostCallback();\n await this._loadTexture();\n this._addToContainer();\n this._createSprite();\n this._calculateDuration();\n this._createShapes();\n await this._setupMasks();\n await this._transformSprite();\n this._playCustomAnimations();\n this._playPresetAnimations();\n this._setEndTimeout();\n this._timeoutVisibility();\n if (play) await this.playMedia();\n this.ready = true;\n }\n\n /**\n * Reinitializes the effect after it has been updated\n *\n * @param play\n * @returns {Promise}\n * @private\n */\n async _reinitialize(play = true) {\n this.renderable = false;\n if (!this.shouldPlay) {\n return Sequencer.EffectManager._removeEffect(this);\n }\n this.actualCreationTime = +new Date();\n return this._initialize(play);\n }\n\n /**\n * Initializes variables core to the function of the effect\n * This is run as a part of the construction of the effect\n *\n * @private\n */\n _initializeVariables() {\n // Responsible for rotating the sprite\n this.rotationContainer = this.addChild(new PIXI.Container());\n this.rotationContainer.id = this.id + \"-rotationContainer\";\n\n this.isometricContainer = this.rotationContainer.addChild(\n new PIXI.Container()\n );\n this.isometricContainer.id = this.id + \"-isometricContainer\";\n\n // An offset container for the sprite\n this.spriteContainer = this.isometricContainer.addChild(\n new PIXI.Container()\n );\n this.spriteContainer.id = this.id + \"-spriteContainer\";\n\n this._template = this.data.template;\n this._ended = null;\n this._maskContainer = null;\n this._maskSprite = null;\n this._file = null;\n this._loopOffset = 0;\n this.effectFilters = {};\n this._animationDuration = 0;\n this._animationTimes = {};\n this._twister = new MersenneTwister(this.data.creationTimestamp);\n this._video = null;\n this._distanceCache = null;\n this._isRangeFind = false;\n this._customAngle = 0;\n this._currentFilePath = this.data.file;\n this._relatedSprites = {};\n this._hooks = [];\n\n if (this._resetTimeout) {\n clearTimeout(this._resetTimeout);\n }\n this._resetTimeout = null;\n\n this._source = false;\n this._target = false;\n this._offsetCache = {\n source: { nameCache: {} },\n target: { nameCache: {} },\n };\n\n this._nameOffsetMap = Object.fromEntries(\n Object.entries(\n foundry.utils.deepClone(this.data.nameOffsetMap ?? {})\n ).map((entry) => {\n return [entry[0], this._setupOffsetMap(entry[1])];\n })\n );\n\n this.uuid = !lib.is_UUID(this.context.uuid)\n ? this.id\n : this.context.uuid + \".data.flags.sequencer.effects.\" + this.id;\n\n const maxPerformance = game.settings.get(\"core\", \"performanceMode\") === 3;\n const maxFPS = game.settings.get(\"core\", \"maxFPS\");\n\n this._ticker = new PIXI.Ticker();\n this._ticker.maxFPS = maxPerformance && maxFPS === 60 ? 60 : maxFPS;\n this._ticker.start();\n }\n\n /**\n * Destroys all dependencies to this element, such as tickers, animations, textures, and child elements\n *\n * @private\n */\n _destroyDependencies() {\n if (this._ended) return;\n this._ended = true;\n\n this.mask = null;\n\n hooksManager.removeHooks(this.uuid);\n\n try {\n this._ticker.stop();\n this._ticker.destroy();\n } catch (err) {}\n\n this._ticker = null;\n\n Object.values(this._relatedSprites).forEach((sprite) =>\n sprite.destroy({ children: true })\n );\n\n SequencerAnimationEngine.endAnimations(this.id);\n\n if (this._maskContainer) this._maskContainer.destroy({ children: true });\n if (this._maskSprite) {\n try {\n this._maskSprite.texture.destroy(true);\n this._maskSprite.destroy();\n } catch (err) {}\n }\n\n if (this._file instanceof SequencerFileBase) {\n this._file.destroy();\n }\n\n if (this.video) {\n try {\n this.video.removeAttribute(\"src\");\n this.video.pause();\n this.video.load();\n } catch (err) {}\n }\n\n try {\n if (this.data.screenSpace) {\n SequencerAboveUILayer.removeContainerByEffect(this);\n }\n } catch (err) {}\n\n this.removeChildren().forEach((child) => child.destroy({ children: true }));\n }\n\n /**\n * Plays preset animations\n *\n * @private\n */\n _playPresetAnimations() {\n this._moveTowards();\n\n this._fadeIn();\n this._fadeInAudio();\n this._scaleIn();\n this._rotateIn();\n\n this._fadeOut();\n this._fadeOutAudio();\n this._scaleOut();\n this._rotateOut();\n }\n\n /**\n * Gets an object based on an identifier, checking if it exists within the named offset map, whether it's a\n * coordinate object, or if it's an UUID that needs to be fetched from the scene\n *\n * @param inIdentifier\n * @returns {*}\n * @private\n */\n _getObjectByID(inIdentifier) {\n let source = inIdentifier;\n let offsetMap = this._nameOffsetMap?.[inIdentifier];\n if (offsetMap) {\n source = offsetMap?.targetObj || offsetMap?.sourceObj || source;\n } else {\n source = this._validateObject(source);\n }\n return source;\n }\n\n /**\n * Validates the given parameter, whether it's a UUID or a coordinate object, and returns the proper one\n *\n * @param inObject\n * @returns {*}\n * @private\n */\n _validateObject(inObject) {\n if (lib.is_UUID(inObject) || !canvaslib.is_object_canvas_data(inObject)) {\n inObject = lib.get_object_from_scene(inObject, this.data.sceneId);\n inObject = inObject?._object ?? inObject;\n }\n return inObject;\n }\n\n /**\n * Adds this effect to the appropriate container on the right layer\n *\n * @private\n */\n _addToContainer() {\n let layer;\n if (this.data.screenSpaceAboveUI) {\n layer = SequencerAboveUILayer;\n } else if (this.data.screenSpace) {\n layer = canvas.sequencerEffectsUILayer;\n } else if (this.data.aboveInterface) {\n layer = canvas.controls;\n } else if (this.data.aboveLighting) {\n layer = canvas.interface;\n } else {\n layer = canvas.primary;\n }\n\n layer.addChild(this);\n layer.sortChildren();\n }\n\n /**\n * Loads the texture for this effect, handling cases where it's a simple path or a database path\n *\n * @private\n */\n async _loadTexture() {\n if (this.data.file === \"\") {\n return;\n }\n\n if (this.data.customRange) {\n this._file = SequencerFileBase.make(\n this.data.file,\n Object.values(this.template),\n \"temporary.range.file\"\n );\n } else {\n if (!Sequencer.Database.entryExists(this.data.file)) {\n let texture = await SequencerFileCache.loadFile(this.data.file);\n this.video = this.data.file.toLowerCase().endsWith(\".webm\")\n ? texture?.baseTexture?.resource?.source ?? false\n : false;\n this._texture = texture;\n this._file = texture;\n this._currentFilePath = this.data.file;\n return;\n }\n\n this._file = Sequencer.Database.getEntry(this.data.file).clone();\n }\n\n this._file.fileIndex = this.data.forcedIndex;\n this._file.twister = this._twister;\n\n this._isRangeFind = this._file?.rangeFind;\n\n this.spriteSheet = false;\n if (this.data.stretchTo) {\n let ray = new Ray(this.sourcePosition, this.targetPosition);\n this._rotateTowards(ray);\n ray = new Ray(this.sourcePosition, this.targetPosition);\n let { filePath, texture, sheet } = await this._getTextureForDistance(\n ray.distance\n );\n this._currentFilePath = filePath;\n this._texture = texture;\n this.spriteSheet = sheet;\n } else if (\n !this._isRangeFind ||\n (this._isRangeFind && !this.data.stretchTo)\n ) {\n const { filePath, texture, sheet } = await this._file.getTexture();\n this._currentFilePath = filePath;\n this._texture = texture;\n this.spriteSheet = sheet;\n }\n\n if (\n this._isRangeFind &&\n (this.data.stretchTo?.attachTo?.active || this.data.attachTo?.active)\n ) {\n let spriteType = this.data.tilingTexture ? PIXI.TilingSprite : SpriteMesh;\n this._relatedSprites[this._currentFilePath] = new spriteType(\n this._texture,\n this.data.xray ? null : VisionSamplerShader\n );\n\n new Promise(async (resolve) => {\n for (let filePath of this._file.getAllFiles()) {\n if (filePath === this._currentFilePath) continue;\n\n let texture = await this._file._getTexture(filePath);\n let spriteType = this.data.tilingTexture\n ? PIXI.TilingSprite\n : SpriteMesh;\n let sprite = new spriteType(\n texture,\n this.data.xray ? null : VisionSamplerShader\n );\n sprite.renderable = false;\n this._relatedSprites[filePath] = sprite;\n }\n\n resolve();\n });\n }\n\n this._template = this._file.template ?? this._template;\n this.video = this._currentFilePath.toLowerCase().endsWith(\".webm\")\n ? this._texture?.baseTexture?.resource?.source\n : false;\n }\n\n /**\n * Calculates the duration of this effect, based on animation durations, the video source duration, end/start times, etc\n *\n * @private\n */\n _calculateDuration() {\n let playbackRate = this.data.playbackRate ? this.data.playbackRate : 1.0;\n\n this.mediaPlaybackRate = playbackRate;\n\n this._animationDuration = this.data.duration || this.mediaDuration * 1000;\n\n // If the effect moves, then infer the duration from the distance divided by the speed\n if (this.data.moveSpeed && this.data.moves) {\n let distance = canvaslib.distance_between(\n this.sourcePosition,\n this.targetPosition\n );\n let durationFromSpeed = (distance / this.data.moveSpeed) * 1000;\n this._animationDuration = Math.max(durationFromSpeed, this.data.duration);\n } else if (!this.data.duration && !this.hasAnimatedMedia) {\n // Determine static image duration\n let fadeDuration =\n (this.data.fadeIn?.duration ?? 0) + (this.data.fadeOut?.duration ?? 0);\n let scaleDuration =\n (this.data.scaleIn?.duration ?? 0) +\n (this.data.scaleOut?.duration ?? 0);\n let rotateDuration =\n (this.data.rotateIn?.duration ?? 0) +\n (this.data.rotateOut?.duration ?? 0);\n let moveDuration = 0;\n if (this.data.moves) {\n let distance = canvaslib.distance_between(\n this.sourcePosition,\n this.targetPosition\n );\n moveDuration =\n (this.data.moveSpeed\n ? (distance / this.data.moveSpeed) * 1000\n : 1000) + this.data.moves.delay;\n }\n\n let animationDurations = this.data.animations\n ? Math.max(\n ...this.data.animations.map((animation) => {\n if (animation.looping) {\n if (animation.loops === 0) return 0;\n return (\n (animation?.duration ?? 0) * (animation?.loops ?? 0) +\n (animation?.delay ?? 0)\n );\n } else {\n return (animation?.duration ?? 0) + (animation?.delay ?? 0);\n }\n })\n )\n : 0;\n\n this._animationDuration = Math.max(\n fadeDuration,\n scaleDuration,\n rotateDuration,\n moveDuration,\n animationDurations\n );\n\n this._animationDuration = this._animationDuration || 1000;\n }\n\n // Clamp effect duration to start time and end time\n this._startTime = 0;\n if (this.data.time?.start && this.mediaCurrentTime !== null) {\n let currentTime = !this.data.time.start.isPerc\n ? this.data.time.start.value ?? 0\n : this._animationDuration * this.data.time.start.value;\n this.mediaCurrentTime = currentTime / 1000;\n this._startTime = this.mediaCurrentTime;\n }\n\n if (this.data.time?.end) {\n this._animationDuration = !this.data.time.end.isPerc\n ? this.data.time.isRange\n ? this.data.time.end.value - this.data.time.start.value\n : this._animationDuration - this.data.time.end.value\n : this._animationDuration * this.data.time.end.value;\n }\n\n this._endTime = this._animationDuration / 1000;\n\n if (\n this._file?.markers &&\n this._startTime === 0 &&\n this._endTime === this.mediaDuration\n ) {\n this._animationTimes.loopStart =\n this._file.markers.loop.start / playbackRate / 1000;\n this._animationTimes.loopEnd =\n this._file.markers.loop.end / playbackRate / 1000;\n this._animationTimes.forcedEnd =\n this._file.markers.forcedEnd / playbackRate / 1000;\n }\n\n // Resolve duration promise so that owner of effect may know when it is finished\n this._durationResolve(this._animationDuration);\n\n this.mediaLooping =\n this._animationDuration / 1000 > this.mediaDuration && !this.data.noLoop;\n }\n\n /**\n * If this effect is animatable, hold off on rendering it for a bit so that the animations have time to initialize to\n * prevent it from spawning and then jumping to the right place\n *\n * @private\n */\n _timeoutVisibility() {\n setTimeout(\n () => {\n this._setupHooks();\n },\n this.data.animations ? 50 : 0\n );\n }\n\n /**\n * If this effect is attached to an object, check whether the object has been destroyed, if so, end the effect\n *\n * @private\n */\n _contextLostCallback() {\n if (this.isSourceTemporary) {\n this._ticker.add(() => {\n if (this.isSourceDestroyed) {\n this._ticker.stop();\n this._source = this.sourcePosition;\n SequencerEffectManager.endEffects({ effects: this });\n }\n });\n }\n if (this.isTargetTemporary) {\n this._ticker.add(() => {\n if (this.isTargetDestroyed) {\n this._ticker.stop();\n this._target = this.targetPosition;\n SequencerEffectManager.endEffects({ effects: this });\n }\n });\n }\n }\n\n /**\n * Creates the sprite, and the relevant containers that manage the position and offsets of the overall visual look of the sprite\n *\n * @private\n */\n _createSprite() {\n this.renderable = false;\n\n const args = [this.spriteSheet ? this.spriteSheet : null];\n if (\n !this.data.xray &&\n !this.spriteSheet &&\n !this.data.screenSpace &&\n !this.data.screenSpaceAboveUI\n ) {\n args.push(VisionSamplerShader);\n }\n\n const spriteType = this.spriteSheet ? PIXI.AnimatedSprite : SpriteMesh;\n const sprite = new spriteType(...args);\n this.sprite = this.spriteContainer.addChild(sprite);\n this.sprite.id = this.id + \"-sprite\";\n\n Object.values(this._relatedSprites).forEach((sprite) => {\n this.sprite.addChild(sprite);\n });\n\n this.animatedSprite = false;\n if (this.spriteSheet) {\n this.animatedSprite = true;\n this.sprite.animationSpeed = 0.4;\n this.sprite.loop = false;\n }\n\n let textSprite;\n\n if (this.data.text) {\n const text = this.data.text.text;\n const fontSettings = foundry.utils.deepClone(this.data.text);\n fontSettings.fontSize =\n (fontSettings?.fontSize ?? 26) * (150 / canvas.grid.size);\n\n textSprite = new PIXI.Text(text, fontSettings);\n textSprite.resolution = 5;\n textSprite.zIndex = 1;\n\n textSprite.anchor.set(\n this.data.text?.anchor?.x ?? 0.5,\n this.data.text?.anchor?.y ?? 0.5\n );\n }\n\n this.sprite.filters = [];\n\n if (this.data.filters) {\n for (let index = 0; index < this.data.filters.length; index++) {\n const filterData = this.data.filters[index];\n const filter = new filters[filterData.className](filterData.data);\n filter.id =\n this.id + \"-\" + filterData.className + \"-\" + index.toString();\n this.sprite.filters.push(filter);\n const filterKeyName = filterData.name || filterData.className;\n this.effectFilters[filterKeyName] = filter;\n }\n }\n\n this.alphaFilter = new PIXI.filters.AlphaFilter(this.data.opacity);\n this.alphaFilter.id = this.id + \"-alphaFilter\";\n this.sprite.filters.push(this.alphaFilter);\n\n let spriteOffsetX = this.data.spriteOffset?.x ?? 0;\n let spriteOffsetY = this.data.spriteOffset?.y ?? 0;\n if (this.data.spriteOffset?.gridUnits) {\n spriteOffsetX *= canvas.grid.size;\n spriteOffsetY *= canvas.grid.size;\n }\n\n this.sprite.position.set(spriteOffsetX, spriteOffsetY);\n\n this.sprite.anchor.set(\n this.data.spriteAnchor?.x ?? 0.5,\n this.data.spriteAnchor?.y ?? 0.5\n );\n\n let spriteRotation = this.data.spriteRotation ?? 0;\n if (this.data.randomSpriteRotation) {\n spriteRotation += lib.random_float_between(-360, 360, this._twister);\n }\n\n this.sprite.rotation = Math.normalizeRadians(\n Math.toRadians(spriteRotation)\n );\n\n this._customAngle = this.data.angle ?? 0;\n if (this.data.randomRotation) {\n this._customAngle += lib.random_float_between(-360, 360, this._twister);\n }\n\n this.spriteContainer.rotation = -Math.normalizeRadians(\n Math.toRadians(this._customAngle)\n );\n\n if (CONSTANTS.INTEGRATIONS.ISOMETRIC.ACTIVE) {\n this.isometricContainer.rotation = Math.PI / 4;\n }\n\n if (this.data.tint) {\n this.sprite.tint = this.data.tint;\n }\n\n if (textSprite) {\n if (this.data.tint) {\n textSprite.tint = this.data.tint;\n }\n this.sprite.addChild(textSprite);\n }\n\n this.filters = [\n new PIXI.filters.ColorMatrixFilter({\n saturation: this.shouldShowFadedVersion ? -1 : 1,\n }),\n new PIXI.filters.AlphaFilter(\n this.shouldShowFadedVersion\n ? game.settings.get(CONSTANTS.MODULE_NAME, \"user-effect-opacity\") /\n 100\n : 1\n ),\n ];\n\n this.updateElevation();\n }\n\n _createShapes() {\n const nonMaskShapes = (this.data?.shapes ?? []).filter(\n (shape) => !shape.isMask\n );\n this.shapes = {};\n for (const shape of nonMaskShapes) {\n const graphic = canvaslib.createShape(shape);\n graphic.filters = this.sprite.filters;\n this.spriteContainer.addChild(graphic);\n this.shapes[shape?.name ?? \"shape-\" + randomID()] = graphic;\n }\n }\n\n updateElevation() {\n const targetElevation =\n Math.max(\n canvaslib.get_object_elevation(this.source ?? {}),\n canvaslib.get_object_elevation(this.target ?? {})\n ) + 1;\n let effectElevation = this.data.elevation?.elevation ?? 0;\n if (!this.data.elevation?.absolute) {\n effectElevation += targetElevation;\n }\n const isIsometric = getProperty(\n game.scenes.get(this.data.sceneId),\n CONSTANTS.INTEGRATIONS.ISOMETRIC.SCENE_ENABLED\n );\n if (CONSTANTS.INTEGRATIONS.ISOMETRIC.ACTIVE && isIsometric) {\n const sourceSort = this.source\n ? this.sourceMesh.sort + (this.data.isometric?.overlay ? 1 : -1)\n : 0;\n const targetSort = this.target\n ? this.targetMesh.sort + (this.data.isometric?.overlay ? 1 : -1)\n : 0;\n this.sort = Math.max(sourceSort, targetSort);\n } else {\n this.sort = !lib.is_real_number(this.data.zIndex)\n ? this.data.index + (this?.parent?.children?.length ?? 0)\n : 100000 + this.data.zIndex;\n }\n this.elevation = effectElevation;\n this.zIndex = this.sort;\n this.sort += 100;\n if (this.parent) {\n this.parent.sortChildren();\n }\n }\n\n updateTransform() {\n super.updateTransform();\n if (this.data.screenSpace || this.data.screenSpaceAboveUI) {\n const [screenWidth, screenHeight] = canvas.screenDimensions;\n\n this.position.set(\n (this.data.screenSpacePosition?.x ?? 0) +\n screenWidth *\n (this.data.screenSpaceAnchor?.x ?? this.data.anchor?.x ?? 0.5),\n (this.data.screenSpacePosition?.y ?? 0) +\n screenHeight *\n (this.data.screenSpaceAnchor?.y ?? this.data.anchor?.y ?? 0.5)\n );\n\n if (this.data.screenSpaceScale) {\n const scaleData = this.data.screenSpaceScale ?? { x: 1, y: 1 };\n\n let scaleX = scaleData.x;\n let scaleY = scaleData.y;\n\n if (scaleData.fitX) {\n scaleX = scaleX * (screenWidth / this.sprite.width);\n }\n\n if (scaleData.fitY) {\n scaleY = scaleY * (screenHeight / this.sprite.height);\n }\n\n scaleX = scaleData.ratioX ? scaleY : scaleX;\n scaleY = scaleData.ratioY ? scaleX : scaleY;\n\n this.scale.set(scaleX, scaleY);\n }\n }\n }\n\n async _setupMasks() {\n const maskShapes = this.data.shapes.filter((shape) => shape.isMask);\n\n if (!this.data?.masks?.length && !maskShapes.length) return;\n\n const maskFilter = MaskFilter.create();\n\n for (const uuid of this.data.masks) {\n const documentObj = fromUuidSync(uuid);\n\n if (!documentObj || documentObj.parent.id !== this.data.sceneId) continue;\n\n const obj = documentObj.object;\n\n let shape = obj?.mesh;\n let shapeToAdd = shape;\n\n if (obj instanceof MeasuredTemplate || obj instanceof Drawing) {\n shape = obj?.shape?.geometry?.graphicsData?.[0]?.shape ?? obj?.shape;\n\n if (\n game.modules.get(\"walledtemplates\")?.active &&\n obj.walledtemplates?.walledTemplate\n ) {\n let wt = obj.walledtemplates.walledTemplate;\n wt.options.padding = 3 * canvas.dimensions.distancePixels;\n shape = wt.computeShape();\n wt.options.padding = 0;\n }\n\n shapeToAdd = new PIXI.LegacyGraphics()\n .beginFill()\n .drawShape(shape)\n .endFill();\n\n if (obj instanceof MeasuredTemplate) {\n shapeToAdd.position.set(documentObj.x, documentObj.y);\n } else {\n const {\n x,\n y,\n shape: { width, height },\n rotation,\n } = documentObj;\n shapeToAdd.pivot.set(width / 2, height / 2);\n shapeToAdd.position.set(x + width / 2, y + height / 2);\n shapeToAdd.angle = rotation;\n }\n shapeToAdd.cullable = true;\n shapeToAdd.custom = true;\n shapeToAdd.renderable = false;\n shapeToAdd.uuid = uuid;\n canvas.stage.addChild(shapeToAdd);\n }\n shapeToAdd.obj = obj;\n\n const updateMethod = (doc) => {\n if (doc !== documentObj) return;\n const mask = maskFilter.masks.find((shape) => shape.uuid === uuid);\n if (!mask) return;\n if (!mask.custom) return;\n mask.clear();\n if (obj instanceof MeasuredTemplate) {\n mask.position.set(documentObj.x, documentObj.y);\n let maskObj = documentObj.object;\n if (\n game.modules.get(\"walledtemplates\")?.active &&\n maskObj.walledtemplates?.walledTemplate\n ) {\n let wt = maskObj.walledtemplates.walledTemplate;\n wt.options.padding = 3 * canvas.dimensions.distancePixels;\n shape = wt.computeShape();\n wt.options.padding = 0;\n }\n } else {\n const {\n x,\n y,\n shape: { width, height },\n rotation,\n } = documentObj;\n mask.pivot.set(width / 2, height / 2);\n mask.position.set(x + width / 2, y + height / 2);\n mask.angle = rotation;\n }\n mask.beginFill().drawShape(shape).endFill();\n };\n\n if (game.modules.get(\"walledtemplates\")?.active) {\n hooksManager.addHook(this.uuid, \"createWall\", () => {\n setTimeout(() => {\n updateMethod(documentObj);\n }, 100);\n });\n\n hooksManager.addHook(this.uuid, \"updateWall\", () => {\n setTimeout(() => {\n updateMethod(documentObj);\n }, 100);\n });\n\n hooksManager.addHook(this.uuid, \"deleteWall\", () => {\n setTimeout(() => {\n updateMethod(documentObj);\n }, 100);\n });\n }\n\n hooksManager.addHook(this.uuid, this.getHook(\"update\", uuid), (doc) => {\n setTimeout(() => {\n updateMethod(doc);\n }, 100);\n });\n\n maskFilter.masks.push(shapeToAdd);\n }\n\n for (const shapeData of maskShapes) {\n const shape = canvaslib.createShape(shapeData);\n shape.cullable = true;\n shape.custom = true;\n shape.renderable = false;\n this.spriteContainer.addChild(shape);\n this.shapes[shapeData?.name ?? \"shape-\" + randomID()] = shape;\n maskFilter.masks.push(shape);\n }\n\n this.sprite.filters.push(maskFilter);\n }\n\n /**\n * Sets up the hooks relating to this effect's source and target\n *\n * @private\n */\n _setupHooks() {\n const attachedToSource =\n this.data.attachTo?.active && lib.is_UUID(this.data.source);\n const attachedToTarget =\n (this.data.stretchTo?.attachTo || this.data.rotateTowards?.attachTo) &&\n lib.is_UUID(this.data.target);\n\n const baseRenderable = this.shouldPlayVisible;\n let renderable = baseRenderable;\n let alpha = null;\n\n if (attachedToSource) {\n hooksManager.addHook(this.uuid, this.getSourceHook(\"delete\"), (doc) => {\n const uuid = doc.uuid;\n if (doc !== this.sourceDocument) return;\n this._source = this._cachedSourceData.position;\n SequencerEffectManager.objectDeleted(uuid);\n });\n\n if (this.data.attachTo?.bindVisibility) {\n hooksManager.addHook(\n this.uuid,\n \"sightRefresh\",\n () => {\n const sourceVisible =\n this.source && (this.sourceMesh?.visible ?? true);\n const sourceHidden =\n this.sourceDocument && (this.sourceDocument?.hidden ?? false);\n const targetVisible =\n this.target &&\n (!attachedToTarget || (this.targetMesh?.visible ?? true));\n this.renderable =\n baseRenderable &&\n (sourceVisible || targetVisible) &&\n this._checkWallCollisions();\n this.alpha = sourceVisible && sourceHidden ? 0.5 : 1.0;\n renderable = baseRenderable && this.renderable;\n },\n true\n );\n }\n\n if (this.data.attachTo?.bindAlpha || this.data.attachTo?.bindElevation) {\n hooksManager.addHook(this.uuid, this.getSourceHook(\"update\"), (doc) => {\n if (doc !== this.sourceDocument) return;\n if (this.data.attachTo?.bindAlpha) {\n this.spriteContainer.alpha = this.getSourceData().alpha;\n }\n if (this.data.attachTo?.bindElevation) {\n this.updateElevation();\n }\n });\n }\n\n if (this.data.attachTo?.bindAlpha) {\n alpha = this.getSourceData().alpha;\n }\n }\n\n if (attachedToTarget) {\n hooksManager.addHook(this.uuid, this.getTargetHook(\"delete\"), (doc) => {\n if (doc !== this.target) return;\n this._target = this._cachedTargetData.position;\n const uuid = doc.uuid;\n SequencerEffectManager.objectDeleted(uuid);\n });\n hooksManager.addHook(this.uuid, this.getTargetHook(\"update\"), (doc) => {\n if (doc !== this.target) return;\n this.updateElevation();\n });\n }\n\n for (let uuid of this.data?.tiedDocuments ?? []) {\n const tiedDocument = fromUuidSync(uuid);\n if (tiedDocument) {\n hooksManager.addHook(\n this.uuid,\n this.getHook(\"delete\", tiedDocument.uuid),\n (doc) => {\n if (tiedDocument !== doc) return;\n SequencerEffectManager.objectDeleted(doc.uuid);\n }\n );\n }\n }\n\n setTimeout(() => {\n this.renderable = renderable;\n this.spriteContainer.alpha = alpha ?? 1.0;\n }, 25);\n }\n\n /**\n * Calculates the padding and scale to stretch an effect across the given distance\n *\n * If the file is a SequencerFileBase instance, it will also pick the appropriate file for the right distance\n *\n * @param distance\n * @returns {Object}\n * @private\n */\n async _getTextureForDistance(distance) {\n if (!this._distanceCache || this._distanceCache?.distance !== distance) {\n let scaleX = 1.0;\n let scaleY = 1.0;\n let texture;\n let filePath;\n let spriteAnchor = this.data.anchor?.x ?? 1.0;\n\n if (this._file instanceof SequencerFileBase) {\n const scaledDistance = distance / (this.data.scale.x ?? 1.0);\n const result = await this._file.getTexture(scaledDistance);\n\n filePath = result.filePath;\n\n texture = result.texture;\n\n spriteAnchor = result.spriteAnchor ?? this.data.anchor?.x ?? 0.0;\n\n scaleX = result.spriteScale;\n\n if (this.data.stretchTo?.onlyX) {\n const widthWithPadding =\n texture.width - (this.template.startPoint + this.template.endPoint);\n scaleY = widthWithPadding / texture.width;\n } else {\n scaleY = result.spriteScale;\n }\n } else if (this._file instanceof PIXI.Texture) {\n filePath = this.data.file;\n\n texture = this._file;\n\n spriteAnchor = this.template.startPoint / texture.width;\n\n const widthWithPadding =\n texture.width - (this.template.startPoint + this.template.endPoint);\n let spriteScale = distance / widthWithPadding;\n\n scaleX = spriteScale;\n\n if (this.data.stretchTo?.onlyX) {\n scaleY = widthWithPadding / texture.width;\n } else {\n scaleY = spriteScale;\n }\n }\n\n this._distanceCache = {\n filePath,\n texture,\n spriteAnchor,\n scaleX,\n scaleY,\n distance,\n };\n }\n\n return this._distanceCache;\n }\n\n /**\n * Applies the distance scaling to the sprite based on the previous method\n *\n * @returns {Promise<void>}\n * @private\n */\n async _applyDistanceScaling() {\n const ray = new Ray(this.sourcePosition, this.targetPosition);\n\n this._rotateTowards(ray);\n\n let { filePath, texture, spriteAnchor, scaleX, scaleY, distance } =\n await this._getTextureForDistance(ray.distance);\n\n if (\n this._currentFilePath !== filePath ||\n this._relatedSprites[filePath] === undefined\n ) {\n this._texture = texture;\n this.video = filePath.toLowerCase().endsWith(\".webm\")\n ? texture?.baseTexture?.resource?.source ?? false\n : false;\n\n Object.values(this._relatedSprites).forEach((subsprite) => {\n subsprite.renderable = false;\n });\n\n this._currentFilePath = filePath;\n\n if (this._relatedSprites[filePath]) {\n this._relatedSprites[filePath].renderable = true;\n } else {\n let sprite;\n let spriteType = this.data.tilingTexture\n ? PIXI.TilingSprite\n : SpriteMesh;\n if (this.data.xray) {\n sprite = new spriteType(texture);\n } else {\n sprite = new spriteType(texture, VisionSamplerShader);\n }\n this._relatedSprites[filePath] = sprite;\n if (this.data.tint) {\n sprite.tint = this.data.tint;\n }\n\n this.sprite.addChild(sprite);\n }\n }\n\n this.playMedia();\n\n if (this._relatedSprites[filePath]) {\n if (this.data.attachTo?.active) {\n this._applyAttachmentOffset();\n }\n\n const sprite = this._relatedSprites[filePath];\n\n if (!sprite.parent) {\n this.sprite.addChild(sprite);\n }\n\n if (this.data.tilingTexture) {\n const scaleX = (this.data.scale.x ?? 1.0) * this.gridSizeDifference;\n const scaleY = (this.data.scale.y ?? 1.0) * this.gridSizeDifference;\n sprite.width = distance / scaleX;\n sprite.height = texture.height;\n sprite.scale.set(scaleX * this.flipX, scaleY * this.flipY);\n\n sprite.tileScale.x = this.data.tilingTexture.scale.x;\n sprite.tileScale.y = this.data.tilingTexture.scale.y;\n\n sprite.tilePosition = this.data.tilingTexture.position;\n } else {\n sprite.scale.set(\n scaleX * (this.data.scale.x ?? 1.0) * this.flipX,\n scaleY * (this.data.scale.y ?? 1.0) * this.flipY\n );\n }\n\n sprite.anchor.set(\n this.flipX === 1 ? spriteAnchor : 1 - spriteAnchor,\n this.data.anchor?.y ?? 0.5\n );\n }\n }\n\n _checkWallCollisions() {\n if (\n !this.data.stretchTo?.attachTo ||\n !this.data.stretchTo?.requiresLineOfSight\n )\n return true;\n\n const ray = new Ray(this.sourcePosition, this.targetPosition);\n\n const blockingObjects = canvas.walls.checkCollision(ray, { type: \"sight\" });\n\n if (!blockingObjects.length && !this.data.stretchTo?.hideLineOfSight) {\n this._ticker.stop();\n SequencerEffectManager.endEffects({ effects: this });\n }\n\n return !blockingObjects.length;\n }\n\n /**\n * Rotates the effect towards the target\n *\n * @param ray\n * @private\n */\n _rotateTowards(ray) {\n if (!ray) {\n const sourcePosition =\n this.flipX === 1 ? this.sourcePosition : this.targetPosition;\n const targetPosition =\n this.flipX === 1 ? this.targetPosition : this.sourcePosition;\n ray = new Ray(sourcePosition, targetPosition);\n }\n\n this.rotationContainer.rotation = Math.normalizeRadians(\n ray.angle + Math.toRadians(this.data.rotateTowards?.rotationOffset ?? 0)\n );\n this._tweakRotationForIsometric();\n }\n\n _tweakRotationForIsometric() {\n if (!CONSTANTS.INTEGRATIONS.ISOMETRIC.ACTIVE) return;\n\n if (this.data.stretchTo) {\n let skew = Math.normalizeRadians(\n this.rotationContainer.rotation - Math.PI / 4\n );\n\n if (\n Math.abs(skew) >= Math.PI / 2 - 0.5 &&\n Math.abs(skew) <= Math.PI / 2 + 0.5\n ) {\n skew -= Math.PI / 2;\n }\n\n this.isometricContainer.skew.set(Math.normalizeRadians(skew), 0);\n this.isometricContainer.rotation = 0;\n } else if (this.data?.isometric?.overlay) {\n this.rotationContainer.rotation = 0;\n let skew = Math.PI / 4 + this.rotationContainer.rotation;\n this.isometricContainer.skew.set(\n Math.normalizeRadians(skew - Math.PI / 4),\n 0\n );\n this.isometricContainer.scale.set(\n 1.0,\n window.scale ?? CONSTANTS.INTEGRATIONS.ISOMETRIC.ISOMETRIC_CONVERSION\n );\n } else {\n this.isometricContainer.rotation = 0;\n }\n }\n\n /**\n * Transforms the sprite, rotating it, stretching it, scaling it, sizing it according its data\n *\n * @private\n */\n async _transformSprite() {\n if (this.data.stretchTo) {\n if (this.data.stretchTo?.attachTo) {\n this._transformStretchToAttachedSprite();\n }\n\n await this._applyDistanceScaling();\n } else {\n if (!this.sprite?.texture?.valid && this._texture?.valid) {\n this.sprite.texture = this._texture;\n }\n }\n\n if (\n this.video &&\n (this._startTime || this._loopOffset > 0) &&\n this.video?.currentTime !== undefined\n ) {\n await lib.wait(20);\n this.updateTexture();\n }\n\n if (!this.data.stretchTo) {\n this._transformNoStretchSprite();\n }\n\n if (this.data.attachTo?.active && !this.data.stretchTo?.attachTo) {\n await this._transformAttachedNoStretchSprite();\n } else {\n if (!this.data.screenSpace) {\n this.position.set(this.sourcePosition.x, this.sourcePosition.y);\n }\n }\n\n if (this.data.rotateTowards) {\n this._rotateTowards();\n\n if (this.data.rotateTowards?.attachTo) {\n this._transformRotateTowardsAttachedSprite();\n }\n }\n\n this._tweakRotationForIsometric();\n\n if (!this.data.anchor && this.data.rotateTowards) {\n const textureWidth = (this._texture?.width ?? this.sprite.width) / 2;\n const startPointRatio = this.template.startPoint / textureWidth;\n this.spriteContainer.pivot.set(\n this.sprite.width * (-0.5 + startPointRatio),\n 0\n );\n } else {\n this.spriteContainer.pivot.set(\n lib.interpolate(\n this.sprite.width * -0.5,\n this.sprite.width * 0.5,\n this.data.anchor?.x ?? 0.5\n ),\n lib.interpolate(\n this.sprite.height * -0.5,\n this.sprite.height * 0.5,\n this.data.anchor?.y ?? 0.5\n )\n );\n }\n }\n\n _transformStretchToAttachedSprite() {\n this._ticker.add(async () => {\n try {\n await this._applyDistanceScaling();\n } catch (err) {\n //lib.debug_error(err);\n }\n });\n }\n\n _transformNoStretchSprite() {\n if (this.data.tilingTexture) {\n this.sprite.tileScale = {\n x: this.data.tilingTexture.scale.x * this.gridSizeDifference,\n y: this.data.tilingTexture.scale.y * this.gridSizeDifference,\n };\n\n this.sprite.tilePosition = this.data.tilingTexture.position;\n }\n\n const baseScaleX =\n (this.data.scale?.x ?? 1.0) *\n (this.data.spriteScale?.x ?? 1.0) *\n this.flipX;\n const baseScaleY =\n (this.data.scale?.y ?? 1.0) *\n (this.data.spriteScale?.y ?? 1.0) *\n this.flipY;\n\n const heightWidthRatio = this.sprite.height / this.sprite.width;\n const widthHeightRatio = this.sprite.width / this.sprite.height;\n const ratioToUse = heightWidthRatio > widthHeightRatio;\n\n if (this.data.scaleToObject) {\n let { width, height } = this.target\n ? this.getTargetData()\n : this.getSourceData();\n\n const target = this.targetDocument || this.sourceDocument;\n if (target instanceof TokenDocument) {\n width *= this.data.scaleToObject?.considerTokenScale\n ? target.texture.scaleX\n : 1.0;\n height *= this.data.scaleToObject?.considerTokenScale\n ? target.texture.scaleY\n : 1.0;\n }\n\n if (this.data.scaleToObject?.uniform) {\n let newWidth = Math.max(width, height);\n height = Math.max(width, height);\n width = newWidth;\n } else {\n width = width * (ratioToUse ? widthHeightRatio : 1.0);\n height = height * (!ratioToUse ? heightWidthRatio : 1.0);\n }\n\n this.sprite.width =\n width * (this.data.scaleToObject?.scale ?? 1.0) * baseScaleX;\n this.sprite.height =\n height * (this.data.scaleToObject?.scale ?? 1.0) * baseScaleY;\n } else if (this.data.size) {\n let { height, width } = this.data.size;\n\n if (this.data.size.width === \"auto\" || this.data.size.height === \"auto\") {\n height = this.sprite.height;\n width = this.sprite.width;\n\n if (this.data.size.width === \"auto\") {\n height = this.data.size.height;\n if (this.data.size.gridUnits) {\n height *= canvas.grid.size;\n }\n width = height * widthHeightRatio;\n } else if (this.data.size.height === \"auto\") {\n width = this.data.size.width;\n if (this.data.size.gridUnits) {\n width *= canvas.grid.size;\n }\n height = width * heightWidthRatio;\n }\n } else if (this.data.size.gridUnits) {\n height *= canvas.grid.size;\n width *= canvas.grid.size;\n }\n\n this.sprite.width = width * baseScaleX;\n this.sprite.height = height * baseScaleY;\n } else {\n this.sprite.scale.set(\n baseScaleX * this.gridSizeDifference,\n baseScaleY * this.gridSizeDifference\n );\n }\n }\n\n async _transformAttachedNoStretchSprite() {\n const applyRotation =\n this.data.attachTo?.followRotation &&\n !(\n this.sourceDocument instanceof TokenDocument &&\n this.sourceDocument.lockRotation\n ) &&\n (this.sourceDocument?.rotation !== undefined ||\n this.sourceDocument?.direction !== undefined) &&\n !this.data.rotateTowards &&\n !this.data.stretchTo;\n\n this._ticker.add(() => {\n if (this.isDestroyed) return;\n\n if (applyRotation) {\n this.rotationContainer.rotation = this.getSourceData().rotation;\n }\n\n this._tweakRotationForIsometric();\n\n try {\n this._applyAttachmentOffset();\n } catch (err) {\n lib.debug_error(err);\n }\n });\n }\n\n _applyAttachmentOffset() {\n let offset = { x: 0, y: 0 };\n\n if (this.data.attachTo?.align && this.data.attachTo?.align !== \"center\") {\n offset = canvaslib.align({\n context: this.source,\n spriteWidth: this.sprite.width,\n spriteHeight: this.sprite.height,\n align: this.data.attachTo?.align,\n edge: this.data.attachTo?.edge,\n });\n }\n\n this.position.set(\n this.sourcePosition.x - offset.x,\n this.sourcePosition.y - offset.y\n );\n }\n\n _transformRotateTowardsAttachedSprite() {\n this._ticker.add(async () => {\n if (this.isDestroyed) return;\n try {\n this._rotateTowards();\n } catch (err) {\n lib.debug_error(err);\n }\n });\n }\n\n /**\n * Provided an animation targeting the rotation of the sprite's primary container, this method will counter-rotate\n * the sprite in an equal fashion so that the sprite's rotation remains static relative to this animation\n *\n * @param animation\n * @returns {*[]}\n * @private\n */\n _counterAnimateRotation(animation) {\n if (\n animation.target === this.spriteContainer &&\n this.data.zeroSpriteRotation\n ) {\n delete animation.target;\n let counterAnimation = foundry.utils.deepClone(animation);\n animation.target = this.spriteContainer;\n counterAnimation.target = this.sprite;\n if (counterAnimation.values) {\n counterAnimation.values = counterAnimation.values.map(\n (value) => value * -1\n );\n } else {\n counterAnimation.from *= -1;\n counterAnimation.to *= -1;\n }\n if (!Array.isArray(animation)) {\n animation = [animation, counterAnimation];\n } else {\n animation.push(counterAnimation);\n }\n }\n\n return animation;\n }\n\n /**\n * Plays the custom animations of this effect\n *\n * @returns {number}\n * @private\n */\n _playCustomAnimations() {\n if (!this.data.animations) return 0;\n\n this._playAnimations(\n foundry.utils.deepClone(this.data.animations) ?? [],\n this.actualCreationTime - this.data.creationTimestamp\n );\n }\n\n _playAnimations(animations, timeDifference = 0) {\n let animationsToSend = [];\n\n const oneShotAnimations = animations.filter(\n (animation) => !animation.looping && !animation.fromEnd\n );\n\n for (let animation of oneShotAnimations) {\n animation.target = foundry.utils.getProperty(this, animation.target);\n\n if (!animation.target) continue;\n\n if (animation.propertyName.indexOf(\"rotation\") > -1) {\n animation.from = animation.from * (Math.PI / 180);\n animation.to = animation.to * (Math.PI / 180);\n }\n\n if (\n [\"position.x\", \"position.y\", \"height\", \"width\"].includes(\n animation.propertyName\n ) &&\n animation.gridUnits\n ) {\n animation.from *= canvas.grid.size;\n animation.to *= canvas.grid.size;\n }\n\n if ([\"hue\"].includes(animation.propertyName)) {\n animation.getPropertyName = \"values.\" + animation.propertyName;\n }\n\n animationsToSend = animationsToSend.concat(\n this._counterAnimateRotation(animation)\n );\n }\n\n const loopingAnimations = animations.filter(\n (animation) => animation.looping\n );\n\n for (let animation of loopingAnimations) {\n animation.target = foundry.utils.getProperty(this, animation.target);\n\n if (!animation.target) continue;\n\n if (animation.propertyName.indexOf(\"rotation\") > -1) {\n animation.values = animation.values.map((angle) => {\n return angle * (Math.PI / 180);\n });\n }\n\n if (\n [\"position.x\", \"position.y\", \"height\", \"width\"].includes(\n animation.propertyName\n ) &&\n animation.gridUnits\n ) {\n animation.values = animation.values.map((value) => {\n return value * canvas.grid.size;\n });\n }\n\n if ([\"hue\"].includes(animation.propertyName)) {\n animation.getPropertyName = \"values.\" + animation.propertyName;\n }\n\n animationsToSend = animationsToSend.concat(\n this._counterAnimateRotation(animation)\n );\n }\n\n if (!(this instanceof PersistentCanvasEffect)) {\n animationsToSend = animationsToSend.concat(\n this._getFromEndCustomAnimations()\n );\n }\n\n setTimeout(() => {\n SequencerAnimationEngine.addAnimation(\n this.id,\n animationsToSend,\n timeDifference\n );\n }, 20);\n }\n\n _getFromEndCustomAnimations(immediate = false) {\n let fromEndAnimations = [];\n\n const animations = foundry.utils.deepClone(this.data.animations) ?? [];\n\n const oneShotEndingAnimations = animations.filter(\n (animation) => !animation.looping && animation.fromEnd\n );\n\n for (let animation of oneShotEndingAnimations) {\n animation.target = foundry.utils.getProperty(this, animation.target);\n\n if (!animation.target) continue;\n\n animation.delay = lib.is_real_number(immediate)\n ? Math.max(immediate - animation.duration + animation.delay, 0)\n : Math.max(\n this._animationDuration - animation.duration + animation.delay,\n 0\n );\n\n if (animation.propertyName.indexOf(\"rotation\") > -1) {\n animation.from = animation.from * (Math.PI / 180);\n animation.to = animation.to * (Math.PI / 180);\n }\n\n if (\n [\"position.x\", \"position.y\", \"height\", \"width\"].includes(\n animation.propertyName\n ) &&\n animation.gridUnits\n ) {\n animation.from *= canvas.grid.size;\n animation.to *= canvas.grid.size;\n }\n\n fromEndAnimations = fromEndAnimations.concat(\n this._counterAnimateRotation(animation)\n );\n }\n\n return fromEndAnimations;\n }\n\n /**\n * Fades in the effect at the start of the effect\n *\n * @returns {number|*}\n * @private\n */\n _fadeIn() {\n if (!this.data.fadeIn || !this.sprite) return 0;\n\n let fadeIn = this.data.fadeIn;\n\n if (\n this.actualCreationTime -\n (this.data.creationTimestamp + fadeIn.duration + fadeIn.delay) >\n 0\n ) {\n return;\n }\n\n this.alphaFilter.alpha = 0.0;\n\n SequencerAnimationEngine.addAnimation(this.id, {\n target: this.alphaFilter,\n propertyName: \"alpha\",\n to: this.data.opacity,\n duration: fadeIn.duration,\n ease: fadeIn.ease,\n delay: fadeIn.delay,\n absolute: true,\n });\n\n return fadeIn.duration + fadeIn.delay;\n }\n\n /**\n * Fades in the effect's audio at the start of the effect\n *\n * @returns {number|*}\n * @private\n */\n _fadeInAudio() {\n if (!this.data.fadeInAudio || !this.sprite || !this.video) return 0;\n\n let fadeInAudio = this.data.fadeInAudio;\n\n if (\n this.actualCreationTime -\n (this.data.creationTimestamp +\n fadeInAudio.duration +\n fadeInAudio.delay) >\n 0\n )\n return;\n\n this.video.volume = 0.0;\n\n SequencerAnimationEngine.addAnimation(this.id, {\n target: this,\n propertyName: \"video.volume\",\n to:\n (this.data.volume ?? 0) *\n game.settings.get(\"core\", \"globalInterfaceVolume\"),\n duration: fadeInAudio.duration,\n ease: fadeInAudio.ease,\n delay: fadeInAudio.delay,\n absolute: true,\n });\n\n return fadeInAudio.duration + fadeInAudio.delay;\n }\n\n /**\n * Fades out the effect at the end of the effect's duration\n *\n * @returns {number|*}\n * @private\n */\n _fadeOut(immediate = false) {\n if (!this.data.fadeOut || !this.sprite) return 0;\n\n let fadeOut = this.data.fadeOut;\n\n fadeOut.delay = lib.is_real_number(immediate)\n ? Math.max(immediate - fadeOut.duration + fadeOut.delay, 0)\n : Math.max(this._animationDuration - fadeOut.duration + fadeOut.delay, 0);\n\n SequencerAnimationEngine.addAnimation(this.id, {\n target: this.alphaFilter,\n propertyName: \"alpha\",\n to: 0.0,\n duration: fadeOut.duration,\n ease: fadeOut.ease,\n delay: fadeOut.delay,\n absolute: true,\n });\n\n return fadeOut.duration + fadeOut.delay;\n }\n\n /**\n * Fades out the effect at the end of the effect's duration\n *\n * @returns {number|*}\n * @private\n */\n _fadeOutAudio(immediate = false) {\n if (!this.data.fadeOutAudio || !this.sprite || !this.video) return 0;\n\n let fadeOutAudio = this.data.fadeOutAudio;\n\n fadeOutAudio.delay = lib.is_real_number(immediate)\n ? Math.max(immediate - fadeOutAudio.duration + fadeOutAudio.delay, 0)\n : Math.max(\n this._animationDuration - fadeOutAudio.duration + fadeOutAudio.delay,\n 0\n );\n\n SequencerAnimationEngine.addAnimation(this.id, {\n target: this,\n propertyName: \"video.volume\",\n to: 0.0,\n duration: fadeOutAudio.duration,\n ease: fadeOutAudio.ease,\n delay: fadeOutAudio.delay,\n absolute: true,\n });\n\n return fadeOutAudio.duration + fadeOutAudio.delay;\n }\n\n /**\n * Determines the scale to animate from or to\n * @param property\n * @returns {{x: number, y: number}}\n * @private\n */\n _determineScale(property) {\n let scale = {\n x: this.sprite.scale.x,\n y: this.sprite.scale.y,\n };\n\n if (lib.is_real_number(property.value)) {\n scale.x *= property.value * this.gridSizeDifference * this.flipX;\n scale.y *= property.value * this.gridSizeDifference * this.flipY;\n } else {\n scale.x *= property.value.x * this.gridSizeDifference * this.flipX;\n scale.y *= property.value.y * this.gridSizeDifference * this.flipY;\n }\n\n return scale;\n }\n\n /**\n * Scales the effect in at the start of the effect\n *\n * @returns {number|*}\n * @private\n */\n _scaleIn() {\n if (!this.data.scaleIn || !this.sprite) return 0;\n\n let scaleIn = this.data.scaleIn;\n let fromScale = this._determineScale(scaleIn);\n\n if (\n this.actualCreationTime -\n (this.data.creationTimestamp + scaleIn.duration + scaleIn.delay) >\n 0\n )\n return;\n\n let toScale = {\n x: this.sprite.scale.x,\n y: this.sprite.scale.y,\n };\n\n this.sprite.scale.set(fromScale.x, fromScale.y);\n\n SequencerAnimationEngine.addAnimation(this.id, [\n {\n target: this.sprite,\n propertyName: \"scale.x\",\n from: fromScale.x,\n to: toScale.x,\n duration: scaleIn.duration,\n ease: scaleIn.ease,\n delay: scaleIn.delay,\n absolute: true,\n },\n {\n target: this.sprite,\n propertyName: \"scale.y\",\n from: fromScale.y,\n to: toScale.y,\n duration: scaleIn.duration,\n ease: scaleIn.ease,\n delay: scaleIn.delay,\n absolute: true,\n },\n ]);\n\n return scaleIn.duration + scaleIn.delay;\n }\n\n /**\n * Scales the effect out at the end of the effect's duration\n *\n * @returns {number|*}\n * @private\n */\n _scaleOut(immediate = false) {\n if (!this.data.scaleOut || !this.sprite) return 0;\n\n let scaleOut = this.data.scaleOut;\n let scale = this._determineScale(scaleOut);\n\n scaleOut.delay = lib.is_real_number(immediate)\n ? Math.max(immediate - scaleOut.duration + scaleOut.delay, 0)\n : Math.max(\n this._animationDuration - scaleOut.duration + scaleOut.delay,\n 0\n );\n\n SequencerAnimationEngine.addAnimation(this.id, [\n {\n target: this.sprite,\n propertyName: \"scale.x\",\n to: scale.x,\n duration: scaleOut.duration,\n ease: scaleOut.ease,\n delay: scaleOut.delay,\n absolute: true,\n },\n {\n target: this.sprite,\n propertyName: \"scale.y\",\n to: scale.y,\n duration: scaleOut.duration,\n ease: scaleOut.ease,\n delay: scaleOut.delay,\n absolute: true,\n },\n ]);\n\n return scaleOut.duration + scaleOut.delay;\n }\n\n /**\n * Rotates the effect in at the start of the effect\n *\n * @returns {number|*}\n * @private\n */\n _rotateIn() {\n if (!this.data.rotateIn || !this.sprite) return 0;\n\n let rotateIn = this.data.rotateIn;\n\n if (\n this.actualCreationTime -\n (this.data.creationTimestamp + rotateIn.duration + rotateIn.delay) >\n 0\n )\n return;\n\n let original_radians = this.spriteContainer.rotation;\n this.spriteContainer.rotation = rotateIn.value * (Math.PI / 180);\n\n SequencerAnimationEngine.addAnimation(\n this.id,\n this._counterAnimateRotation({\n target: this.spriteContainer,\n propertyName: \"rotation\",\n to: original_radians,\n duration: rotateIn.duration,\n ease: rotateIn.ease,\n delay: rotateIn.delay,\n absolute: true,\n })\n );\n\n return rotateIn.duration + rotateIn.delay;\n }\n\n /**\n * Rotates the effect out at the end of the effect's duration\n *\n * @returns {number|*}\n * @private\n */\n _rotateOut(immediate = false) {\n if (!this.data.rotateOut || !this.sprite) return 0;\n\n let rotateOut = this.data.rotateOut;\n\n rotateOut.delay = lib.is_real_number(immediate)\n ? Math.max(immediate - rotateOut.duration + rotateOut.delay, 0)\n : Math.max(\n this._animationDuration - rotateOut.duration + rotateOut.delay,\n 0\n );\n\n SequencerAnimationEngine.addAnimation(\n this.id,\n this._counterAnimateRotation({\n target: this.spriteContainer,\n propertyName: \"rotation\",\n to: rotateOut.value * (Math.PI / 180),\n duration: rotateOut.duration,\n ease: rotateOut.ease,\n delay: rotateOut.delay,\n absolute: true,\n })\n );\n\n return rotateOut.duration + rotateOut.delay;\n }\n\n /**\n * Causes the effect to move towards the given location\n *\n * @returns {number|*}\n * @private\n */\n _moveTowards() {\n if (!this.data.moves || !this.sprite) return 0;\n\n let moves = this.data.moves;\n\n let movementDuration = this._animationDuration;\n if (this.data.moveSpeed) {\n const distance = canvaslib.distance_between(\n this.sourcePosition,\n this.targetPosition\n );\n movementDuration = (distance / this.data.moveSpeed) * 1000;\n }\n\n if (this.data.moves.rotate) this._rotateTowards();\n\n const duration = movementDuration - moves.delay;\n\n if (\n this.actualCreationTime -\n (this.data.creationTimestamp + duration + moves.delay) >\n 0\n )\n return;\n\n SequencerAnimationEngine.addAnimation(this.id, [\n {\n target: this,\n propertyName: \"position.x\",\n to: this.targetPosition.x,\n duration: duration,\n ease: moves.ease,\n delay: moves.delay,\n },\n {\n target: this,\n propertyName: \"position.y\",\n to: this.targetPosition.y,\n duration: duration,\n ease: moves.ease,\n delay: moves.delay,\n },\n ]);\n\n return duration + moves.delay;\n }\n\n /**\n * If this effect is temporary, this sets the timeout for when the effect should resolve and get removed;\n *\n * @private\n */\n _setEndTimeout() {\n setTimeout(() => {\n this._resolve(this.data);\n this.endEffect();\n }, this._animationDuration);\n }\n\n _setupTimestampHook(offset) {\n if (!this._file?.originalMetadata?.timestamps || this._ended) return;\n const timestamps = this._file.getTimestamps();\n const timestampArray = Array.isArray(timestamps)\n ? timestamps\n : [timestamps];\n for (const timestamp of timestampArray) {\n if (!lib.is_real_number(timestamp)) continue;\n let realTimestamp = timestamp - offset / this.mediaPlaybackRate;\n if (realTimestamp < 0) {\n realTimestamp += this._endTime;\n }\n setTimeout(() => {\n if (this._ended) return;\n Hooks.callAll(\"sequencerEffectTimestamp\", this, this._file);\n if (this.mediaLooping) {\n const offsets = (this._endTime - this.mediaCurrentTime) * -1000;\n this._setupTimestampHook(offsets);\n }\n }, realTimestamp);\n }\n }\n}\n\nclass PersistentCanvasEffect extends CanvasEffect {\n /**\n * @OVERRIDE\n * @returns {Promise<void>}\n * @private\n */\n async _initialize() {\n await super._initialize(false);\n await this._startEffect();\n }\n\n /**\n * @OVERRIDE\n * @returns {Promise<void>}\n * @private\n */\n async _reinitialize() {\n await super._reinitialize(false);\n }\n\n /** @OVERRIDE */\n _playPresetAnimations() {\n this._moveTowards();\n this._fadeIn();\n this._scaleIn();\n this._rotateIn();\n }\n\n /**\n * Starts the loop of this effect, calculating the difference between the effect's creation time, and the actual\n * creation time on the client\n *\n * @returns {Promise<void>}\n * @private\n */\n async _startEffect() {\n if (!this.hasAnimatedMedia) return;\n\n let creationTimeDifference =\n this.actualCreationTime - this.data.creationTimestamp;\n\n if (!this.data.noLoop) {\n return this._startLoop(creationTimeDifference);\n }\n\n if (creationTimeDifference < this._animationDuration) {\n this.mediaCurrentTime = creationTimeDifference / 1000;\n if (this._endTime !== this.mediaDuration) {\n setTimeout(() => {\n this.mediaCurrentTime = this._endTime;\n this.updateTexture();\n }, this._endTime * 1000 - creationTimeDifference);\n }\n await this.playMedia();\n return;\n }\n\n await this.pauseMedia();\n this.mediaCurrentTime = this._endTime;\n if (this.sprite.texture && this.video) {\n const oldRenderable = this.renderable;\n this.renderable = false;\n setTimeout(() => {\n this.renderable = oldRenderable;\n this.updateTexture();\n }, 350);\n }\n }\n\n /**\n * Kicks off the loop, or just sets the video to loop\n *\n * @param creationTimeDifference\n * @returns {Promise<void>}\n * @private\n */\n async _startLoop(creationTimeDifference) {\n this.mediaLooping = this.playNaturally;\n if (!this._animationTimes.loopStart) {\n this._loopOffset =\n (creationTimeDifference % this._animationDuration) / 1000;\n } else if (creationTimeDifference / 1000 > this._animationTimes.loopStart) {\n const loopDuration =\n this._animationTimes.loopEnd - this._animationTimes.loopStart;\n this._loopOffset =\n (creationTimeDifference % (loopDuration * 1000)) / 1000;\n }\n return this._resetLoop();\n }\n\n /**\n * Continuously reset the video to the right time so that the start and end time can be preserved\n *\n * @returns {Promise<void>}\n * @private\n */\n async _resetLoop(firstLoop = true) {\n if (this._ended) return;\n\n let loopWaitTime = 0;\n if (this._animationTimes.loopStart) {\n if (this._isEnding) return;\n this.mediaCurrentTime =\n (firstLoop ? 0 : this._animationTimes.loopStart) +\n (this._loopOffset > 0 ? this._loopOffset : 0);\n loopWaitTime =\n (this._animationTimes.loopEnd - this.mediaCurrentTime) * 1000;\n } else {\n this.mediaCurrentTime = this._startTime + this._loopOffset;\n loopWaitTime = this._animationDuration - this._loopOffset * 1000;\n }\n\n await this.playMedia();\n\n if (this.mediaLooping) {\n return;\n }\n\n this._resetTimeout = setTimeout(() => {\n if (this._ended) return;\n this._loopOffset = 0;\n this._resetLoop(false);\n }, loopWaitTime);\n }\n\n /** @OVERRIDE */\n _timeoutVisibility() {\n let creationTimeDifference =\n this.actualCreationTime - this.data.creationTimestamp;\n let timeout =\n creationTimeDifference === 0 && !this.data.animations ? 0 : 50;\n setTimeout(() => {\n this._setupHooks();\n }, timeout);\n }\n\n /** @OVERRIDE */\n _setEndTimeout() {\n let creationTimeDifference =\n this.actualCreationTime - this.data.creationTimestamp;\n if (\n !this.data.noLoop ||\n creationTimeDifference >= this._animationDuration ||\n !(this.hasAnimatedMedia || this.data.text)\n )\n return;\n setTimeout(() => {\n this.pauseMedia();\n }, this._animationDuration);\n }\n\n /** @OVERRIDE */\n async endEffect() {\n if (this._isEnding) return;\n this._isEnding = true;\n let fullWaitDuration = 0;\n let extraEndDuration = this.data.extraEndDuration ?? 0;\n if (this._animationTimes?.forcedEnd) {\n this.mediaCurrentTime = this._animationTimes.forcedEnd;\n fullWaitDuration =\n (this.mediaDuration - (this._animationTimes?.forcedEnd ?? 0)) * 1000;\n } else if (this._animationTimes?.loopEnd) {\n fullWaitDuration = (this.mediaDuration - this.mediaCurrentTime) * 1000;\n this.mediaLooping = false;\n extraEndDuration = Math.max(extraEndDuration, fullWaitDuration);\n }\n const fromEndCustomAnimations =\n this._getFromEndCustomAnimations(extraEndDuration);\n const durations = [\n this._fadeOut(extraEndDuration),\n this._fadeOutAudio(extraEndDuration),\n this._scaleOut(extraEndDuration),\n this._rotateOut(extraEndDuration),\n this.data.extraEndDuration,\n fullWaitDuration,\n ...fromEndCustomAnimations.map(\n (animation) => animation.duration + animation.delay\n ),\n ].filter(Boolean);\n SequencerAnimationEngine.addAnimation(this.id, fromEndCustomAnimations);\n const waitDuration = Math.max(...durations, 0);\n this._resolve(waitDuration);\n return new Promise((resolve) =>\n setTimeout(() => {\n super.endEffect();\n resolve(this.data);\n }, waitDuration)\n );\n }\n}\n","import * as lib from \"./lib.js\";\nimport CanvasEffect from \"../canvas-effects/canvas-effect.js\";\nimport CONSTANTS from \"../constants.js\";\n\nexport function createShape(shape) {\n const graphic = new PIXI.LegacyGraphics();\n\n graphic.beginFill(\n shape?.fillColor ?? 0xffffff,\n shape?.fillAlpha ?? shape?.isMask ? 1 : 0\n );\n\n graphic.lineStyle(\n shape.lineSize ?? (shape?.isMask ? 1 : 0),\n shape?.lineColor ?? 0xffffff\n );\n\n const offsetX =\n (shape.offset?.x ?? 0) * (shape.offset?.gridUnits ? canvas.grid.size : 1);\n const offsetY =\n (shape.offset?.y ?? 0) * (shape.offset?.gridUnits ? canvas.grid.size : 1);\n const sizeMultiplier = shape.gridUnits ? canvas.grid.size : 1;\n\n graphic.offset = {\n x: offsetX,\n y: offsetY,\n };\n\n switch (shape.type) {\n case CONSTANTS.SHAPES.CIRC:\n graphic.drawCircle(\n graphic.offset.x,\n graphic.offset.y,\n shape.radius * sizeMultiplier\n );\n break;\n case CONSTANTS.SHAPES.RECT:\n graphic.drawRect(\n graphic.offset.x,\n graphic.offset.y,\n shape.width * sizeMultiplier,\n shape.height * sizeMultiplier\n );\n break;\n case CONSTANTS.SHAPES.ELIP:\n graphic.drawEllipse(\n graphic.offset.x,\n graphic.offset.y,\n shape.width * sizeMultiplier,\n shape.height * sizeMultiplier\n );\n break;\n case CONSTANTS.SHAPES.RREC:\n graphic.drawRoundedRect(\n graphic.offset.x,\n graphic.offset.y,\n shape.width * sizeMultiplier,\n shape.height * sizeMultiplier,\n shape.radius * sizeMultiplier\n );\n break;\n case CONSTANTS.SHAPES.POLY:\n graphic.drawPolygon(\n shape.points.map((point) => {\n return new PIXI.Point(\n point[0] * sizeMultiplier,\n point[1] * sizeMultiplier\n );\n })\n );\n break;\n }\n\n graphic.alpha = shape.alpha ?? 1.0;\n\n graphic.endFill();\n\n return graphic;\n}\n\nexport function calculate_missed_position(source, target, twister) {\n const sourcePosition = get_object_position(source);\n const sourceDimensions = get_object_dimensions(source, true);\n\n if (!target) {\n const angle = twister.random() * Math.PI * 2;\n let x = Math.cos(angle) * sourceDimensions.width;\n let y = Math.sin(angle) * sourceDimensions.height;\n\n return {\n x: lib.random_float_between(x * 1.5, x * 2.5, twister),\n y: lib.random_float_between(y * 1.5, y * 2.5, twister),\n };\n }\n\n const targetDimensions = get_object_dimensions(target, true);\n const targetPosition = get_object_position(target);\n\n const ray = new Ray(targetPosition, sourcePosition);\n\n let startRadians = ray.angle + Math.PI / 2;\n let endRadians = ray.angle - Math.PI / 2;\n\n const sizeCompensation = Math.max(\n 1,\n Math.abs(sourceDimensions.width - targetDimensions.height)\n );\n let distance = ray.distance / canvas.grid.size - sizeCompensation;\n\n if (distance <= 1) {\n const angle =\n twister.random() > 0.5\n ? ray.angle + Math.PI / 4\n : ray.angle - Math.PI / 4;\n const x = Math.cos(angle) * targetDimensions.width;\n const y = Math.sin(angle) * targetDimensions.height;\n return { x, y };\n }\n\n distance = Math.max(Math.abs(distance - 15), 6);\n\n endRadians -= Math.PI / distance;\n startRadians += Math.PI / distance;\n\n const angle = lib.interpolate(startRadians, endRadians, twister.random());\n const x = Math.cos(angle) * targetDimensions.width;\n const y = Math.sin(angle) * targetDimensions.height;\n\n return {\n x: lib.random_float_between(x * 1.5, x * 2.5, twister),\n y: lib.random_float_between(y * 1.5, y * 2.5, twister),\n };\n}\n\nexport function get_object_position(\n obj,\n { measure = false, exact = false } = {}\n) {\n if (obj instanceof CanvasEffect) {\n return obj.worldPosition;\n }\n\n obj = obj?._object ?? obj.object ?? obj;\n\n let pos = {};\n if (obj instanceof MeasuredTemplate) {\n if (measure) {\n if (obj.document.t === \"cone\" || obj.document.t === \"ray\") {\n pos.x = obj.ray.B.x;\n pos.y = obj.ray.B.y;\n }\n }\n if (obj.document.t === \"rect\") {\n pos.x = obj.x;\n pos.y = obj.y;\n\n if (!exact) {\n pos.x += Math.abs(obj.shape.width / 2) + obj.shape.x;\n pos.y += Math.abs(obj.shape.height / 2) + obj.shape.y;\n }\n }\n } else if (obj instanceof Tile) {\n pos = {\n x: obj.document.x,\n y: obj.document.y,\n };\n\n if (!exact) {\n pos.x += Math.abs(obj.document.width / 2);\n pos.y += Math.abs(obj.document.height / 2);\n }\n } else if (obj instanceof Token) {\n const halfSize = get_object_dimensions(obj, true);\n pos = {\n x: obj.x + halfSize.width,\n y: obj.y + halfSize.height,\n };\n\n if (exact) {\n pos.x -= halfSize.width;\n pos.y -= halfSize.height;\n }\n } else if (obj instanceof Drawing) {\n pos = {\n x: obj.document.x,\n y: obj.document.y,\n };\n\n if (!exact) {\n const halfSize = get_object_dimensions(obj, true);\n pos.x += halfSize.width;\n pos.y += halfSize.height;\n }\n }\n\n pos = {\n x:\n pos.x ??\n obj?.x ??\n obj?.position?.x ??\n obj?.position?._x ??\n obj?.document?.x ??\n obj?.document?.position?.x ??\n null,\n y:\n pos.y ??\n obj?.y ??\n obj?.position?.y ??\n obj?.position?._y ??\n obj?.document?.y ??\n obj?.document?.position?.y ??\n null,\n elevation: obj?.elevation ?? obj?.document?.elevation ?? null,\n };\n\n if (pos.x === null) delete pos[\"x\"];\n if (pos.y === null) delete pos[\"y\"];\n if (pos.elevation === null) delete pos[\"elevation\"];\n\n return pos;\n}\n\nexport function get_random_offset(target, randomOffset, twister = false) {\n let { width, height } = get_object_dimensions(target, true);\n\n width *= randomOffset;\n height *= randomOffset;\n\n return {\n x: lib.random_float_between(width * -1, width, twister),\n y: lib.random_float_between(height * -1, height, twister),\n };\n}\n\nexport function get_object_dimensions(inObj, half = false) {\n inObj = inObj?.object ?? inObj?._object ?? inObj;\n\n let width =\n inObj?.hitArea?.width ??\n inObj?.w ??\n inObj?.shape?.width ??\n (inObj?.shape?.radius ? inObj?.shape?.radius * 2 : undefined) ??\n inObj?.width ??\n canvas.grid.size;\n\n let height =\n inObj?.hitArea?.height ??\n inObj?.h ??\n inObj?.shape?.height ??\n (inObj?.shape?.radius ? inObj?.shape?.radius * 2 : undefined) ??\n inObj?.height ??\n canvas.grid.size;\n\n return {\n width: width / (half ? 2 : 1),\n height: height / (half ? 2 : 1),\n };\n}\n\nexport const alignments = {\n \"top-left\": { x: 0.5, y: 0.5 },\n top: { x: 0, y: 0.5 },\n \"top-right\": { x: -0.5, y: 0.5 },\n left: { x: 0.5, y: 0 },\n center: { x: 0, y: 0 },\n right: { x: -0.5, y: 0 },\n \"bottom-left\": { x: 0.5, y: -0.5 },\n bottom: { x: 0, y: -0.5 },\n \"bottom-right\": { x: -0.5, y: -0.5 },\n};\n\nexport function align({\n context,\n spriteWidth,\n spriteHeight,\n align,\n edge,\n} = {}) {\n let { width, height } = get_object_dimensions(context);\n\n const alignRatio = alignments[align];\n const offset = {\n x: lib.interpolate(width * -0.5, width * 0.5, alignRatio.x + 0.5),\n y: lib.interpolate(height * -0.5, height * 0.5, alignRatio.y + 0.5),\n };\n\n return {\n x:\n offset.x +\n (edge && edge !== \"on\"\n ? spriteWidth * alignRatio.x * (edge === \"outer\" ? 1 : -1)\n : 0),\n y:\n offset.y +\n (edge && edge !== \"on\"\n ? spriteHeight * alignRatio.y * (edge === \"outer\" ? 1 : -1)\n : 0),\n };\n}\n\nexport function is_object_canvas_data(inObj) {\n if (typeof inObj !== \"object\") return false;\n const keys = Object.keys(inObj);\n keys.sort();\n return (\n (keys.includes(\"x\") && keys.includes(\"y\")) ||\n (keys.includes(\"height\") &&\n keys.includes(\"width\") &&\n keys.includes(\"x\") &&\n keys.includes(\"y\"))\n );\n}\n\nexport function get_object_canvas_data(inObject, measure = false) {\n inObject = inObject?.object ?? inObject;\n return {\n ...get_object_position(inObject, { measure }),\n ...get_object_dimensions(inObject?.mesh ?? inObject?.tile ?? inObject),\n elevation: get_object_elevation(inObject),\n uuid: inObject?.document?.uuid ?? inObject?.uuid,\n cachedLocation: true,\n };\n}\n\nexport function get_object_elevation(inObject) {\n return inObject?.document?.elevation ?? inObject?.elevation ?? 0;\n}\n\nexport function get_mouse_position(snapToGrid = false, gridSnap = 2) {\n const pos = lib.getCanvasMouse().getLocalPosition(canvas.app.stage);\n return !snapToGrid\n ? new PIXI.Point(pos.x, pos.y)\n : canvas.grid.getSnappedPosition(pos.x, pos.y, gridSnap);\n}\n\nexport function distance_between(p1, p2) {\n return new Ray(p1, p2).distance;\n}\n\n/**\n * Whether the current video is playing or not\n *\n * @returns {boolean}\n */\nexport function is_video_playing(video) {\n return (\n !!video &&\n video.currentTime >= 0 &&\n !video.paused &&\n video.currentTime <= video.duration\n );\n}\n\n/**\n * Determines whether a position is within the bounds of this effect\n *\n * @param inPosition\n * @param inElement\n * @param relativeTo\n * @returns {boolean}\n */\nexport function is_position_within_bounds(inPosition, inElement, relativeTo) {\n const localPosition = inElement.toLocal(inPosition, relativeTo);\n return inElement.getLocalBounds().contains(localPosition.x, localPosition.y);\n}\n\nexport function rotate_coordinate(p1, p2, radians) {\n let cos = Math.cos(radians);\n let sin = Math.sin(radians);\n let nx = cos * (p2.x - p1.x) + sin * (p2.y - p1.y) + p1.x;\n let ny = cos * (p2.y - p1.y) - sin * (p2.x - p1.x) + p1.y;\n return [nx, ny];\n}\n\n/**\n * Gets the closest token to a certain position\n *\n * @param inPosition\n * @param minimumDistance\n * @returns {*|boolean}\n */\nexport function get_closest_token(\n inPosition,\n { minimumDistance = false } = {}\n) {\n let tokens = Array.from(canvas.scene.tokens);\n if (minimumDistance) {\n tokens = tokens.filter(\n (token) =>\n distance_between(get_object_position(token), inPosition) <=\n minimumDistance\n );\n }\n tokens.sort((a, b) => {\n return (\n distance_between(get_object_position(a), inPosition) -\n distance_between(get_object_position(b), inPosition)\n );\n });\n return tokens?.[0] ?? false;\n}\n\nexport function getBezierControlPoints(factor, previous, point, next) {\n // Calculate distance vectors\n let vector = { x: next[0] - previous[0], y: next[1] - previous[1] },\n preDistance = Math.hypot(previous[0] - point[0], previous[1] - point[1]),\n postDistance = Math.hypot(next[0] - point[0], next[1] - point[1]),\n distance = preDistance + postDistance;\n\n // Compute control point locations\n let cp0d = distance === 0 ? 0 : factor * (preDistance / distance),\n cp1d = distance === 0 ? 0 : factor * (postDistance / distance);\n\n // Return points\n return {\n cp1: {\n x: point[0] - vector.x * cp0d,\n y: point[1] - vector.y * cp0d,\n },\n next_cp0: {\n x: point[0] + vector.x * cp1d,\n y: point[1] + vector.y * cp1d,\n },\n };\n}\n\nexport function rotateAroundPoint(cx, cy, x, y, radians) {\n const cos = Math.cos(radians);\n const sin = Math.sin(radians);\n const nx = cos * (x - cx) + sin * (y - cy) + cx;\n const ny = cos * (y - cy) - sin * (x - cx) + cy;\n return { x: nx, y: ny };\n}\n\nexport function validateAnimation(inTarget, inPropertyName, inOptions) {\n if (typeof inPropertyName !== \"string\") {\n return `inPropertyName must be of type string`;\n }\n if (typeof inTarget !== \"string\") {\n return `inTarget must be of type string`;\n }\n if (!lib.is_real_number(inOptions.from)) {\n return `inOptions.from must be of type number`;\n }\n if (!lib.is_real_number(inOptions.to)) {\n return `inOptions.to must be of type number`;\n }\n if (!lib.is_real_number(inOptions.duration)) {\n return `inOptions.duration must be of type number`;\n }\n if (inOptions?.delay !== undefined && !lib.is_real_number(inOptions.delay)) {\n return `inOptions.delay must be of type number`;\n }\n if (inOptions?.ease !== undefined && typeof inOptions.ease !== \"string\") {\n return `inOptions.ease must be of type string`;\n }\n if (\n inOptions?.fromEnd !== undefined &&\n typeof inOptions.fromEnd !== \"boolean\"\n ) {\n return `inOptions.fromEnd must be of type boolean`;\n }\n if (inOptions?.gridUnits !== undefined) {\n if (typeof inOptions.gridUnits !== \"boolean\") {\n return `inOptions.gridUnits must be of type boolean`;\n }\n if (\n inOptions.gridUnits &&\n ![\n \"position.x\",\n \"position.y\",\n \"scale.x\",\n \"scale.y\",\n \"height\",\n \"width\",\n ].includes(inPropertyName)\n ) {\n return `if inOptions.gridUnits is true, inPropertyName must be position.x, position.y, scale.x, scale.y, width, or height`;\n }\n }\n\n return {\n target: inTarget,\n propertyName: inPropertyName,\n from: inOptions?.from,\n to: inOptions?.to,\n duration: inOptions?.duration ?? 0,\n delay: inOptions?.delay ?? 0,\n ease: inOptions?.ease ?? \"linear\",\n looping: false,\n fromEnd: inOptions?.fromEnd ?? false,\n gridUnits: inOptions?.gridUnits ?? false,\n };\n}\n\nexport function validateLoopingAnimation(inTarget, inPropertyName, inOptions) {\n if (typeof inPropertyName !== \"string\") {\n return `inPropertyName must be of type string`;\n }\n if (typeof inTarget !== \"string\") {\n return `inTarget must be of type string`;\n }\n\n if (!inOptions?.values) {\n if (!inOptions?.from === undefined || !inOptions?.to === undefined) {\n return `if inOptions.values is not set, you must provide inOptions.from and inOptions.to`;\n }\n if (!lib.is_real_number(inOptions.from)) {\n return `inOptions.from must be of type number`;\n }\n if (!lib.is_real_number(inOptions.to)) {\n return `inOptions.to must be of type number`;\n }\n inOptions.values = [inOptions?.from, inOptions?.to];\n delete inOptions.from;\n delete inOptions.to;\n } else {\n if (!Array.isArray(inOptions.values)) {\n return `inOptions.values must be of type array`;\n }\n inOptions.values.forEach((value) => {\n if (!lib.is_real_number(value)) {\n return `values in inOptions.keys must be of type number`;\n }\n });\n }\n\n if (!lib.is_real_number(inOptions.duration)) {\n return `inOptions.duration must be of type number`;\n }\n\n if (inOptions?.delay !== undefined && !lib.is_real_number(inOptions.delay)) {\n return `inOptions.delay must be of type number`;\n }\n if (inOptions?.ease !== undefined && typeof inOptions.ease !== \"string\") {\n return `inOptions.ease must be of type string`;\n }\n if (inOptions?.loops !== undefined && !lib.is_real_number(inOptions.loops)) {\n return `inOptions.loops must be of type number`;\n }\n if (\n inOptions?.pingPong !== undefined &&\n typeof inOptions.pingPong !== \"boolean\"\n ) {\n return `inOptions.pingPong must be of type boolean`;\n }\n if (inOptions?.gridUnits !== undefined) {\n if (typeof inOptions.gridUnits !== \"boolean\") {\n return `inOptions.gridUnits must be of type boolean`;\n }\n if (\n inOptions.gridUnits &&\n ![\n \"position.x\",\n \"position.y\",\n \"scale.x\",\n \"scale.y\",\n \"height\",\n \"width\",\n ].includes(inPropertyName)\n ) {\n return `if inOptions.gridUnits is true, inPropertyName must be position.x, position.y, scale.x, scale.y, width, or height`;\n }\n }\n\n return {\n target: inTarget,\n propertyName: inPropertyName,\n values: inOptions?.values,\n duration: inOptions?.duration ?? 0,\n delay: inOptions?.delay ?? 0,\n ease: inOptions?.ease ?? \"linear\",\n looping: true,\n loops: inOptions?.loops,\n indefinite:\n inOptions?.loops === undefined || !lib.is_real_number(inOptions?.loops),\n pingPong: inOptions?.pingPong ?? false,\n gridUnits: inOptions?.gridUnits ?? false,\n };\n}\n","import { writable, get } from \"svelte/store\";\nimport { EffectPlayer } from \"../../modules/sequencer-interaction-manager.js\";\nimport CONSTANTS from \"../../constants.js\";\n\nconst PlayerSettings = {\n file: {\n label: \"SEQUENCER.Player.Option.File\",\n store: writable(\"\"),\n default: \"\",\n },\n scale: {\n label: \"SEQUENCER.Player.Option.Scale\",\n store: writable(1.0),\n default: 1.0,\n },\n users: {\n label: \"SEQUENCER.Player.Option.ForUsers\",\n store: writable([]),\n default: [],\n },\n belowTokens: {\n label: \"SEQUENCER.Player.Option.BelowTokens\",\n store: writable(false),\n default: false,\n },\n snapToGrid: {\n label: \"SEQUENCER.Player.Option.SnapToGrid\",\n store: writable(false),\n default: false,\n },\n rotation: {\n label: \"SEQUENCER.Player.Option.Rotation\",\n store: writable(0),\n default: 0,\n },\n randomRotation: {\n label: \"SEQUENCER.Player.Option.Randomize\",\n store: writable(false),\n default: false,\n },\n fadeIn: {\n label: \"SEQUENCER.Player.Option.FadeIn\",\n store: writable(0),\n default: 0,\n },\n fadeOut: {\n label: \"SEQUENCER.Player.Option.FadeOut\",\n store: writable(0),\n default: 0,\n },\n scaleIn: {\n label: \"SEQUENCER.Player.Option.ScaleIn\",\n store: writable(0),\n default: 0,\n },\n scaleOut: {\n label: \"SEQUENCER.Player.Option.ScaleOut\",\n store: writable(0),\n default: 0,\n },\n\n mirrorX: {\n label: \"SEQUENCER.Player.Option.MirrorX\",\n store: writable(false),\n default: false,\n },\n mirrorY: {\n label: \"SEQUENCER.Player.Option.MirrorY\",\n store: writable(false),\n default: false,\n },\n randomMirrorX: {\n label: \"SEQUENCER.Player.Option.Randomize\",\n store: writable(false),\n default: false,\n },\n randomMirrorY: {\n label: \"SEQUENCER.Player.Option.Randomize\",\n store: writable(false),\n default: false,\n },\n\n offsetX: {\n label: \"SEQUENCER.Player.Option.OffsetX\",\n store: writable(0),\n default: 0,\n },\n offsetY: {\n label: \"SEQUENCER.Player.Option.OffsetY\",\n store: writable(0),\n default: 0,\n },\n\n offsetGridUnits: {\n label: \"SEQUENCER.Player.Option.GridUnits\",\n store: writable(false),\n default: false,\n },\n\n randomOffsetAmount: {\n label: \"SEQUENCER.Player.Option.RandomOffset\",\n store: writable(0),\n default: 0,\n },\n\n randomOffset: {\n label: \"SEQUENCER.Player.Option.Randomize\",\n store: writable(false),\n default: false,\n },\n\n preload: {\n label: \"SEQUENCER.Player.Option.Preload\",\n store: writable(false),\n default: false,\n },\n moveTowards: {\n label: \"SEQUENCER.Player.Option.DragBehavior\",\n label_off: \"SEQUENCER.Player.Option.DragStretch\",\n label_on: \"SEQUENCER.Player.Option.DragMove\",\n store: writable(false),\n default: false,\n },\n moveSpeed: {\n label: \"SEQUENCER.Player.Option.MoveSpeed\",\n store: writable(0),\n default: 0,\n },\n attachTo: {\n label: \"SEQUENCER.Player.Option.AttachTo\",\n store: writable(false),\n default: false,\n callback: (e) => {\n EffectPlayer.sourceAttach = e.target.checked;\n },\n },\n stretchToAttach: {\n label: \"SEQUENCER.Player.Option.StretchToAttach\",\n store: writable(false),\n default: false,\n callback: (e) => {\n EffectPlayer.targetAttach = e.target.checked;\n },\n },\n persist: {\n label: \"SEQUENCER.Player.Option.Persist\",\n store: writable(false),\n default: false,\n },\n repeat: {\n label: \"SEQUENCER.Player.Option.Repeat\",\n store: writable(false),\n default: false,\n },\n repetitions: {\n label: \"SEQUENCER.Player.Option.Repetitions\",\n store: writable(1.0),\n default: 1.0,\n },\n repeatDelayMin: {\n label: \"SEQUENCER.Player.Option.DelayMin\",\n store: writable(200),\n default: 200,\n },\n repeatDelayMax: {\n label: \"SEQUENCER.Player.Option.DelayMax\",\n store: writable(400),\n default: 400,\n },\n};\n\nPlayerSettings.export = () => {\n return Object.fromEntries(\n Object.entries(PlayerSettings).map((entry) => {\n return [entry[0], get(entry[1].store)];\n })\n );\n};\n\nPlayerSettings.import = (settings) => {\n Object.entries(PlayerSettings).forEach((entry) => {\n if (settings?.[entry[0]] !== undefined) {\n entry[1].store.set(settings?.[entry[0]]);\n } else if (entry[1]?.default !== undefined) {\n entry[1].store.set(entry[1].default);\n }\n });\n};\n\nPlayerSettings.getPresets = () => {\n return Object.keys(game.settings.get(CONSTANTS.MODULE_NAME, \"effectPresets\"));\n};\n\nPlayerSettings.loadPreset = (name) => {\n const effectPresets = game.settings.get(\n CONSTANTS.MODULE_NAME,\n \"effectPresets\"\n );\n return PlayerSettings.import(effectPresets[name]);\n};\n\nPlayerSettings.savePreset = async (name) => {\n const newName = await promptNewPresetName(name);\n if (!newName) return;\n const effectPresets = game.settings.get(\n CONSTANTS.MODULE_NAME,\n \"effectPresets\"\n );\n effectPresets[newName] = PlayerSettings.export();\n return game.settings.set(\n CONSTANTS.MODULE_NAME,\n \"effectPresets\",\n effectPresets\n );\n};\n\nPlayerSettings.copyPreset = async (name) => {\n const newName = await promptNewPresetName(name, true);\n if (!newName) return;\n const effectPresets = game.settings.get(\n CONSTANTS.MODULE_NAME,\n \"effectPresets\"\n );\n effectPresets[newName] = PlayerSettings.export();\n return game.settings.set(\n CONSTANTS.MODULE_NAME,\n \"effectPresets\",\n effectPresets\n );\n};\n\nPlayerSettings.deletePreset = (name) => {\n const effectPresets = game.settings.get(\n CONSTANTS.MODULE_NAME,\n \"effectPresets\"\n );\n delete effectPresets[name];\n return game.settings.set(\n CONSTANTS.MODULE_NAME,\n \"effectPresets\",\n effectPresets\n );\n};\n\nasync function promptNewPresetName(inName, copy = false) {\n const effectPresets = game.settings.get(\n CONSTANTS.MODULE_NAME,\n \"effectPresets\"\n );\n\n let title = copy\n ? game.i18n.localize(\"SEQUENCER.Player.CopyPresetTitle\")\n : game.i18n.localize(\"SEQUENCER.Player.CreateNewPresetTitle\");\n\n let presetName = await new Promise((resolve) => {\n let rejected = false;\n new Dialog({\n title: title,\n content: `<p><input type=\"text\" placeholder=\"${game.i18n.localize(\n \"SEQUENCER.Player.CreateNewPresetInputLabel\"\n )}\" id=\"newPresetName\" style=\"width:100%;\"></p>`,\n buttons: {\n okay: {\n icon: '<i class=\"fas fa-check\"></i>',\n label: game.i18n.localize(\"SEQUENCER.OK\"),\n callback: async (html) => {\n let name = html.find(\"#newPresetName\").val();\n\n if (name === \"\" || !name) {\n name = false;\n rejected = true;\n }\n\n resolve(name);\n },\n },\n cancel: {\n icon: '<i class=\"fas fa-times\"></i>',\n label: game.i18n.localize(\"SEQUENCER.Cancel\"),\n callback: () => {\n rejected = true;\n resolve(false);\n },\n },\n },\n close: () => {},\n render: (html) => {\n html.find(\"#newPresetName\").val(inName).focus();\n },\n }).render(true);\n });\n\n if (presetName) {\n if (presetName.toLowerCase() === \"default\") {\n Dialog.prompt({\n title: game.i18n.localize(\"SEQUENCER.Player.DefaultErrorTitle\"),\n content: `<p>${game.i18n.localize(\n \"SEQUENCER.Player.DefaultErrorContent\"\n )}</p>`,\n label: game.i18n.localize(\"SEQUENCER.OK\"),\n callback: () => {},\n });\n return false;\n }\n\n if (effectPresets[presetName]) {\n const overwrite = await Dialog.confirm({\n title: game.i18n.localize(\"SEQUENCER.Player.OverwritePresetTitle\"),\n content: `<p>${game.i18n.format(\n \"SEQUENCER.Player.OverwritePresetContent\",\n { preset_name: presetName }\n )}</p>`,\n });\n\n if (!overwrite) {\n presetName = await promptPresetName(presetName);\n }\n }\n }\n\n return presetName;\n}\n\nPlayerSettings.migrateOldPresets = () => {\n if (!game.user.isGM) return;\n\n const effectPresets = game.settings.get(\n CONSTANTS.MODULE_NAME,\n \"effectPresets\"\n );\n\n const presetsToUpdate = Object.values(effectPresets).filter((preset) => {\n return !preset?.version;\n });\n\n if (!presetsToUpdate.length) return;\n\n const newEffectPresets = Object.fromEntries(\n Object.entries(effectPresets).map(([name, preset]) => {\n if (preset?.version) return [name, preset];\n preset.version = game.modules.get(CONSTANTS.MODULE_NAME).version;\n if (preset.repetitions > 1) {\n preset.repeat = true;\n }\n if (preset.randomMirrorY) {\n preset.mirrorY = true;\n }\n if (preset.randomOffset) {\n preset.randomOffsetAmount = 1;\n preset.offsetGridUnits = true;\n }\n return [name, preset];\n })\n );\n\n return game.settings.set(\n CONSTANTS.MODULE_NAME,\n \"effectPresets\",\n newEffectPresets\n );\n};\n\nexport { PlayerSettings };\n","import * as lib from \"../lib/lib.js\";\nimport * as canvaslib from \"../lib/canvas-lib.js\";\nimport SequencerEffectManager from \"./sequencer-effect-manager.js\";\nimport CONSTANTS from \"../constants.js\";\nimport SequencerFileCache from \"./sequencer-file-cache.js\";\nimport { EffectsUIApp } from \"../formapplications/effects-ui/effects-ui-app.js\";\nimport { get } from \"svelte/store\";\nimport { PlayerSettings } from \"../formapplications/effects-ui/effect-player-store.js\";\n\n/**\n * -------------------------------------------------------------\n * | THIS IS A MESS, YOU HAVE BEEN WARNED |\n * -------------------------------------------------------------\n */\n\nexport const InteractionManager = {\n startDragPosition: false,\n\n state: {\n LeftMouseDown: false,\n RightMouseDown: false,\n Dragging: false,\n },\n\n get isLayerActive() {\n return canvas.sequencerInterfaceLayer.active;\n },\n\n initialize() {\n window.addEventListener(\"mousedown\", (event) => {\n if (!canvas.ready) return;\n if (!this.isLayerActive) return;\n const hover = document.elementFromPoint(event.clientX, event.clientY);\n if (!hover || hover.id !== \"board\") return;\n\n const button = event.button;\n if (!(button === 0 || button === 2)) return;\n if (button === 0) {\n this.state.LeftMouseDown = true;\n this._propagateEvent(\"mouseLeftDown\");\n }\n if (button === 2) {\n this.state.RightMouseDown = true;\n this._propagateEvent(\"mouseRightDown\");\n }\n });\n\n window.addEventListener(\"mouseup\", (event) => {\n if (!canvas.ready) return;\n if (!this.isLayerActive) return;\n const hover = document.elementFromPoint(event.clientX, event.clientY);\n if (!hover || hover.id !== \"board\") return;\n if (document.activeElement.tagName !== \"BODY\") return;\n\n const button = event.button;\n if (!(button === 0 || button === 2)) return;\n if (button === 0) {\n this.state.LeftMouseDown = false;\n this._propagateEvent(\"mouseLeftUp\");\n this.state.Dragging = false;\n this.startDragPosition = false;\n }\n if (button === 2) {\n this.state.RightMouseDown = false;\n this._propagateEvent(\"mouseRightUp\");\n this.state.Dragging = false;\n this.startDragPosition = false;\n }\n });\n\n window.addEventListener(\"mousemove\", (event) => {\n if (!canvas.ready) return;\n const hover = document.elementFromPoint(event.clientX, event.clientY);\n if (!hover || hover.id !== \"board\") return;\n if (!this.isLayerActive) return;\n this._propagateEvent(\"mouseMove\");\n if (this.state.LeftMouseDown && !this.startDragPosition) {\n this.startDragPosition = canvaslib.get_mouse_position();\n }\n if (this.state.LeftMouseDown && !this.state.Dragging) {\n const distance = canvaslib.distance_between(\n this.startDragPosition,\n canvaslib.get_mouse_position()\n );\n this.state.Dragging = distance > 20;\n }\n });\n\n EffectPlayer.initialize();\n SelectionManager.initialize();\n },\n\n tearDown() {\n EffectPlayer.tearDown();\n SelectionManager.tearDown();\n },\n\n _propagateEvent(eventName) {\n if (EffectPlayer.isActive && EffectPlayer[eventName]) {\n EffectPlayer[eventName]();\n }\n if (SelectionManager.isActive && SelectionManager[eventName]) {\n SelectionManager[eventName]();\n }\n },\n};\n\nexport const EffectPlayer = {\n sequenceBuffer: [],\n\n playMany: false,\n playManySequenced: false,\n\n cursorPos: false,\n startPos: false,\n endPos: false,\n\n get snapLocationToGrid() {\n return get(PlayerSettings.snapToGrid.store);\n },\n\n get sourceAttach() {\n return get(PlayerSettings.attachTo.store);\n },\n\n get targetAttach() {\n return get(PlayerSettings.stretchToAttach.store);\n },\n\n sourceAttachFound: false,\n targetAttachFound: false,\n\n get isActive() {\n return (\n InteractionManager.isLayerActive && game?.activeTool === \"play-effect\"\n );\n },\n\n /**\n * Opens the Sequencer Effects UI with the player tab open\n */\n show() {\n return EffectsUIApp.show({ tab: \"player\" });\n },\n\n initialize() {\n this.layer = canvas.sequencerInterfaceLayer;\n },\n\n tearDown() {\n this._reset();\n },\n\n /**\n * Mouse events\n */\n mouseLeftDown() {\n this._evaluateStartPosition();\n },\n\n mouseLeftUp() {\n if (!this.startPos) return;\n this._playEffect();\n this.startPos = false;\n this.endPos = false;\n this.sourceAttachFound = false;\n this.targetAttachFound = false;\n },\n\n mouseRightUp() {\n this._reset();\n },\n\n mouseMove() {\n this._evaluateCursorPosition();\n\n if (InteractionManager.state.Dragging) {\n this._evaluateEndPosition();\n }\n },\n\n /**\n * Hotkeys\n */\n playManyUp() {\n this._playEffects();\n this._reset();\n },\n\n /**\n * Private methods\n */\n _evaluatePosition(attach = false) {\n let position = canvaslib.get_mouse_position(this.snapLocationToGrid);\n\n const attachToObject = attach\n ? canvaslib.get_closest_token(position, {\n minimumDistance: canvas.grid.size,\n })\n : false;\n\n let attachFound = false;\n if (attachToObject) {\n attachFound = true;\n position = canvaslib.get_object_position(attachToObject);\n }\n\n return [position, attachFound];\n },\n\n _evaluateCursorPosition() {\n const attach = InteractionManager.state.Dragging\n ? this.targetAttach\n : this.sourceAttach;\n\n [this.cursorPos] = this._evaluatePosition(attach);\n },\n\n _evaluateStartPosition() {\n if (this.startPos) return;\n\n [this.startPos, this.sourceAttachFound] = this._evaluatePosition(\n this.sourceAttach\n );\n },\n\n _evaluateEndPosition() {\n [this.endPos, this.targetAttachFound] = this._evaluatePosition(\n this.targetAttach\n );\n },\n\n _reset() {\n if (!this.layer) return;\n this.startPos = false;\n this.endPos = false;\n this.sourceAttachFound = false;\n this.targetAttachFound = false;\n this.sequenceBuffer = [];\n this._evaluateCursorPosition();\n },\n\n async _playEffect() {\n const settings = foundry.utils.mergeObject(PlayerSettings.export(), {\n ...InteractionManager.state,\n startPos: this.startPos,\n endPos: this.endPos,\n });\n\n if (!settings.users.length || settings.users?.[0] === \"all\")\n settings.users = [];\n\n if (settings.file === \"\") return;\n\n if (\n !(\n Sequencer.Database.entryExists(settings.file) ||\n (await SequencerFileCache.srcExists(settings.file))\n )\n ) {\n throw lib.custom_error(\n \"Sequencer\",\n `Sequencer Player | Could not find file or database entry: ${settings.file}`\n );\n }\n\n if (settings.preload) {\n await Sequencer.Preloader.preloadForClients(settings.file);\n }\n\n const sequence =\n this.sequenceBuffer.length > 0 && this.playManySequenced\n ? this.sequenceBuffer[this.sequenceBuffer.length - 1]\n : new Sequence();\n\n const effect = sequence\n .effect()\n .file(settings.file)\n .forUsers(settings.users)\n .mirrorX(settings.mirrorX && !settings.randomMirrorX)\n .mirrorY(settings.mirrorY && !settings.randomMirrorY)\n .randomizeMirrorX(settings.randomMirrorX)\n .randomizeMirrorY(settings.randomMirrorY)\n .persist(settings.persist)\n .belowTokens(settings.belowTokens);\n\n if (settings.repeat) {\n effect.repeats(\n settings.repetitions,\n settings.repeatDelayMin,\n settings.repeatDelayMax\n );\n }\n\n if (settings.fadeIn > 0) effect.fadeIn(settings.fadeIn);\n if (settings.fadeOut > 0) effect.fadeOut(settings.fadeOut);\n\n const offsetData = settings.randomOffset\n ? {\n offset: { x: settings.offsetX, y: settings.offsetY },\n gridUnits: settings.offsetGridUnits,\n }\n : {};\n const offsetSource = !settings.Dragging ? offsetData : {};\n const attachToObject = settings.attachTo\n ? canvaslib.get_closest_token(settings.startPos, {\n minimumDistance: canvas.grid.size,\n })\n : false;\n if (attachToObject) {\n effect.attachTo(attachToObject, {\n randomOffset:\n settings.randomOffset && !settings.Dragging\n ? settings.randomOffsetAmount\n : false,\n ...offsetSource,\n });\n } else {\n effect.atLocation(settings.startPos, {\n randomOffset:\n settings.randomOffset && !settings.Dragging\n ? settings.randomOffsetAmount\n : false,\n ...offsetSource,\n });\n }\n\n if (\n settings.persist &&\n settings.name &&\n settings.name !== \"\" &&\n settings.name !== \"default\" &&\n settings.name !== \"new\"\n ) {\n effect.name(\"Preset: \" + settings.name);\n }\n\n if (settings.Dragging) {\n if (settings.moveTowards) {\n effect.moveTowards(settings.endPos, {\n randomOffset: settings.randomOffset\n ? settings.randomOffsetAmount\n : false,\n ...offsetData,\n });\n if (settings.moveSpeed) {\n effect.moveSpeed(settings.moveSpeed);\n }\n } else {\n let target = settings.stretchToAttach\n ? canvaslib.get_closest_token(settings.endPos, {\n minimumDistance: canvas.grid.size,\n })\n : settings.endPos;\n effect.stretchTo(target, {\n attachTo: settings.stretchToAttach,\n randomOffset: settings.randomOffset\n ? settings.randomOffsetAmount\n : false,\n ...offsetData,\n });\n }\n }\n\n if (!settings.Dragging || (settings.Dragging && settings.moveTowards)) {\n effect.scale(settings.scale);\n if (settings.scaleIn > 0)\n effect.scaleIn(0, settings.scaleIn, { ease: \"easeInOutSine\" });\n if (settings.scaleOut > 0)\n effect.scaleOut(0, settings.scaleOut, { ease: \"easeInOutSine\" });\n effect.randomRotation(settings.randomRotation);\n }\n\n if (this.playManySequenced) {\n effect.waitUntilFinished();\n }\n\n if (!this.playManySequenced || this.sequenceBuffer.length === 0) {\n this.sequenceBuffer.push(sequence);\n }\n\n if (!this.playMany && !this.playManySequenced) this._playEffects();\n },\n\n _playEffects() {\n this.sequenceBuffer.forEach((sequence) => sequence.play());\n this.sequenceBuffer = [];\n },\n};\n\nexport const SelectionManager = {\n selectedEffect: false,\n hoveredEffects: new Set(),\n suggestedProperties: false,\n sourceOrTarget: false,\n dragOffset: false,\n hoveredEffectUI: false,\n\n get snapToGrid() {\n return get(PlayerSettings.snapToGrid.store);\n },\n\n set snapToGrid(bool) {\n PlayerSettings.snapToGrid.store.set(bool);\n },\n\n set attachToTarget(bool) {\n PlayerSettings.stretchToAttach.store.set(bool);\n },\n\n get attachToTarget() {\n return get(PlayerSettings.stretchToAttach.store);\n },\n\n get isActive() {\n return (\n InteractionManager.isLayerActive && game?.activeTool === \"select-effect\"\n );\n },\n\n get effects() {\n return SequencerEffectManager.effects.filter(\n (effect) => effect.userCanDelete\n );\n },\n\n initialize() {\n this.layer = canvas.sequencerInterfaceLayer;\n },\n\n tearDown() {\n this._reset();\n this.hoveredEffects = new Set();\n },\n\n sourcePointSelected() {\n this.sourceOrTarget = \"source\";\n },\n\n targetPointSelected() {\n this.sourceOrTarget = \"target\";\n },\n\n /**\n * Mouse Events\n */\n mouseLeftDown() {\n if (!this.selectedEffect) {\n return this._selectEffects();\n }\n if (!this.hoveredEffects.size) {\n this._reset();\n }\n },\n\n mouseRightDown() {},\n\n mouseLeftUp() {\n if (!InteractionManager.state.Dragging) {\n return this._selectEffects();\n }\n if (\n !InteractionManager.state.Dragging ||\n !this.selectedEffect ||\n !this.suggestedProperties\n )\n return;\n this._updateEffect();\n },\n\n mouseRightUp() {\n InteractionManager.state.LeftMouseDown = false;\n this.suggestedProperties = false;\n this.sourceOrTarget = false;\n this.dragOffset = false;\n },\n\n mouseMove() {\n this._evaluateHoveredEffects();\n if (\n InteractionManager.state.LeftMouseDown &&\n !InteractionManager.state.RightMouseDown\n ) {\n this._evaluateEffectPositionUpdate();\n }\n },\n\n /**\n * Hotkeys\n */\n async delete() {\n if (!this.selectedEffect) return;\n await SequencerEffectManager.endEffects({ effects: this.selectedEffect });\n this.selectedEffect = false;\n },\n\n attachToTargetDown() {\n if (\n InteractionManager.state.LeftMouseDown &&\n !InteractionManager.state.RightMouseDown\n ) {\n this._evaluateEffectPositionUpdate();\n }\n },\n\n /**\n * Private methods\n */\n _selectEffects() {\n this._reset();\n if (!this.hoveredEffects.size) return;\n const firstElement = Array.from(this.hoveredEffects)[0];\n this.selectedEffect = !firstElement.selected ? firstElement : false;\n },\n\n _evaluateHoveredEffects() {\n const position = canvaslib.get_mouse_position();\n this.hoveredEffects = this.effects.filter((effect) =>\n effect.isPositionWithinBounds(position)\n );\n this.hoveredEffects.sort((a, b) => {\n return a.data.layer !== b.data.zIndex\n ? a.data.zIndex - b.data.zIndex\n : a.data.layer - b.data.zIndex;\n });\n this.hoveredEffects = new Set(this.hoveredEffects);\n },\n\n _evaluateEffectPositionUpdate() {\n if (!this.selectedEffect) return;\n\n if (this.selectedEffect.data.stretchTo && !this.sourceOrTarget) {\n return;\n }\n\n let showCursor = false;\n let showPoint = this.snapToGrid;\n\n let position = canvaslib.get_mouse_position(this.snapToGrid);\n\n if (!this.selectedEffect.data.stretchTo && !this.dragOffset) {\n this.dragOffset = {\n x: position.x - this.selectedEffect.position.x,\n y: position.y - this.selectedEffect.position.y,\n };\n }\n\n if (this.attachToTarget) {\n const obj = canvaslib.get_closest_token(position, {\n minimumDistance: canvas.grid.size,\n });\n if (obj) {\n position = canvaslib.get_object_position(obj);\n showCursor = true;\n showPoint = false;\n }\n }\n\n if (this.dragOffset && !showCursor && !this.snapToGrid) {\n position.x -= this.dragOffset.x;\n position.y -= this.dragOffset.y;\n }\n\n const color =\n (this.sourceOrTarget || \"source\") === \"source\"\n ? CONSTANTS.COLOR.PRIMARY\n : CONSTANTS.COLOR.SECONDARY;\n\n this.suggestedProperties = {\n position,\n showCursor,\n showPoint,\n color,\n };\n },\n\n _updateEffect() {\n if (!this.selectedEffect) return;\n\n const updates = {\n attachTo: this.selectedEffect.data.attachTo,\n stretchTo: this.selectedEffect.data.stretchTo,\n };\n\n const obj = this.attachToTarget\n ? canvaslib.get_closest_token(this.suggestedProperties.position, {\n minimumDistance: canvas.grid.size,\n type: TokenDocument,\n })\n : false;\n let objUuid = obj ? lib.get_object_identifier(obj) : false;\n\n if (this.sourceOrTarget === \"source\") {\n if (!updates.attachTo) {\n updates.attachTo = {\n active: false,\n align: \"center\",\n rotation: true,\n bindVisibility: true,\n bindAlpha: true,\n };\n }\n updates.attachTo = foundry.utils.mergeObject(updates.attachTo || {}, {\n active: this.attachToTarget && !!objUuid,\n });\n if (this.attachToTarget && objUuid) {\n updates.source = objUuid;\n } else {\n updates[\"source\"] = this.suggestedProperties.position;\n }\n } else if (this.sourceOrTarget === \"target\") {\n updates.stretchTo.attachTo = this.attachToTarget && !!objUuid;\n if (this.attachToTarget && objUuid) {\n updates.target = objUuid;\n } else {\n updates[\"target\"] = this.suggestedProperties.position;\n }\n } else {\n updates[\"source\"] = this.suggestedProperties.position;\n }\n\n this.selectedEffect.update(updates);\n\n this.suggestedProperties = false;\n this.sourceOrTarget = false;\n this.dragOffset = false;\n },\n\n _reset() {\n this.selectedEffect = false;\n this.suggestedProperties = false;\n this.sourceOrTarget = false;\n this.dragOffset = false;\n },\n};\n","<script>\r\n\r\n import { localize } from '@typhonjs-fvtt/runtime/svelte/helper';\r\n import { SelectionManager } from \"../../../modules/sequencer-interaction-manager.js\";\r\n import SequencerEffectManager from \"../../../modules/sequencer-effect-manager.js\";\r\n\r\n export let effect;\r\n\r\n function getEffectName(effect) {\r\n\r\n let effectName = \"Unknown effect\";\r\n if (effect.data.file) {\r\n effectName = effect.data.file.split('\\\\').pop().split('/').pop();\r\n } else if (effect.data.text) {\r\n effectName = \"Text: \" + effect.data.text.text;\r\n } else {\r\n effectName = \"Shape: \" + effect.data.shapes[0].type\r\n }\r\n\r\n effectName = effect.data.name ? `${effect.data.name} (${effectName})` : effectName;\r\n\r\n if (effect.data.creatorUserId !== game.userId) {\r\n let user_name = game.users.get(effect.data.creatorUserId)?.name;\r\n let formattedUsername = (user_name\r\n ? localize(\"SEQUENCER.ManagerPlayersEffect\", { user_name })\r\n : localize(\"SEQUENCER.ManagerUnknownEffect\"));\r\n effectName += ` (${formattedUsername})`;\r\n }\r\n\r\n return effectName;\r\n\r\n }\r\n\r\n function mouseOver() {\r\n SelectionManager.hoveredEffectUI = effect;\r\n }\r\n\r\n function mouseLeave() {\r\n SelectionManager.hoveredEffectUI = false;\r\n }\r\n\r\n function endEffect(){\r\n SequencerEffectManager.endEffects({ effects: [effect] });\r\n\t}\r\n\r\n</script>\r\n\r\n\r\n<div class=\"effect hover-highlight\" on:mouseleave={mouseLeave} on:mouseover={mouseOver}>\r\n\t<button class=\"btn_end\" type=\"button\" on:click={endEffect}>\r\n\t\t<i class=\"fas fa-times\"></i>\r\n\t</button>\r\n\t<div class=\"effect-text hover-text\">\r\n\t\t{getEffectName(effect)}\r\n\t</div>\r\n</div>\r\n\r\n\r\n<style lang=\"scss\">\r\n\r\n .effect {\r\n display: flex;\r\n flex: 1 0 auto;\r\n }\r\n\r\n .effect > button {\r\n flex: 0;\r\n font-size: 0.7rem;\r\n height: 1.25rem;\r\n line-height: normal;\r\n margin-right: 5px;\r\n }\r\n\r\n .btn_end {\r\n min-width: 1.5rem;\r\n }\r\n\r\n .effect > div {\r\n flex: 1;\r\n line-height: 1.25rem;\r\n }\r\n\r\n .hover-highlight:hover > .hover-text {\r\n color: #000;\r\n text-shadow: 0 0 10px red;\r\n }\r\n\r\n</style>\r\n","<script>\r\n\r\n import SequencerAudioHelper from \"../../../modules/sequencer-audio-helper.js\";\r\n\r\n export let id;\r\n export let sound;\r\n\r\n function endSound(){\r\n SequencerAudioHelper.stop([id], true);\r\n\t}\r\n\r\n</script>\r\n\r\n\r\n<div class=\"effect hover-highlight\">\r\n\t<button class=\"btn_end\" type=\"button\" on:click={endSound}>\r\n\t\t<i class=\"fas fa-times\"></i>\r\n\t</button>\r\n\t<div class=\"effect-text hover-text\">\r\n\t\t{sound.src.split(\"/\").slice(-1)}\r\n\t</div>\r\n</div>\r\n\r\n\r\n<style lang=\"scss\">\r\n\r\n .effect {\r\n display: flex;\r\n flex: 1 0 auto;\r\n }\r\n\r\n .effect > button {\r\n flex: 0;\r\n font-size: 0.7rem;\r\n height: 1.25rem;\r\n line-height: normal;\r\n margin-right: 5px;\r\n }\r\n\r\n .btn_end {\r\n min-width: 1.5rem;\r\n }\r\n\r\n .effect > div {\r\n flex: 1;\r\n line-height: 1.25rem;\r\n }\r\n\r\n .hover-highlight:hover > .hover-text {\r\n color: #000;\r\n text-shadow: 0 0 10px red;\r\n }\r\n\r\n</style>\r\n","<script>\r\n import { localize } from \"@typhonjs-fvtt/runtime/svelte/helper\";\r\n import SequenceManager from \"../../modules/sequence-manager.js\";\r\n import EffectEntry from \"./components/EffectEntry.svelte\";\r\n import SoundEntry from \"./components/SoundEntry.svelte\";\r\n import SequencerAudioHelper from \"../../modules/sequencer-audio-helper.js\";\r\n\r\n const VisibleEffects = SequenceManager.VisibleEffects;\r\n const RunningSounds = SequenceManager.RunningSounds;\r\n\r\n $: effects = Object.values($VisibleEffects);\r\n $: sounds = Object.entries($RunningSounds);\r\n $: persistentEffects = effects.filter(effect => effect.data.persist);\r\n $: temporaryEffects = effects.filter(effect => !effect.data.persist);\r\n\r\n function endAllEffects() {\r\n Sequencer.EffectManager.endEffects({ effects: effects.filter(effect => effect.userCanDelete && !effect.data.private) });\r\n }\r\n\r\n function endAllSounds() {\r\n SequencerAudioHelper.stop(RunningSounds.keys());\r\n }\r\n\r\n</script>\r\n\r\n<div class=\"effects-container\">\r\n\r\n {#if !effects.length && !sounds.length}\r\n\r\n <div class=\"no-effects\">\r\n <h2>{localize(\"SEQUENCER.Manager.NothingPlaying\")}</h2>\r\n </div>\r\n\r\n {/if}\r\n\r\n {#if effects.length}\r\n <button class=\"w-100 end-all-effects mb-2\" on:click={endAllEffects} type=\"button\">\r\n {localize(\"SEQUENCER.Manager.EndAllEffects\")}\r\n </button>\r\n\r\n <div class=\"effects\">\r\n\r\n {#if persistentEffects.length}\r\n <h2>{localize(\"SEQUENCER.Manager.PersistentEffects\")}</h2>\r\n <div>\r\n {#each persistentEffects as effect (effect.id)}\r\n <EffectEntry {effect} />\r\n {/each}\r\n </div>\r\n {/if}\r\n\r\n {#if temporaryEffects.length && persistentEffects.length}\r\n <hr />\r\n {/if}\r\n\r\n {#if temporaryEffects.length}\r\n <h2>{localize(\"SEQUENCER.Manager.TemporaryEffects\")}</h2>\r\n <div>\r\n {#each temporaryEffects as effect (effect.id)}\r\n <EffectEntry {effect} />\r\n {/each}\r\n </div>\r\n {/if}\r\n\r\n </div>\r\n\r\n {/if}\r\n\r\n {#if sounds.length}\r\n <button class=\"w-100 end-all-effects mb-2\" on:click={endAllSounds} type=\"button\">\r\n {localize(\"SEQUENCER.Manager.EndAllSounds\")}\r\n </button>\r\n\r\n <div>\r\n\r\n <h2>{localize(\"SEQUENCER.Manager.Sounds\")}</h2>\r\n\r\n <div>\r\n {#each sounds as [id, sound] (id)}\r\n <SoundEntry {id} {sound}/>\r\n {/each}\r\n </div>\r\n </div>\r\n\r\n {/if}\r\n\r\n</div>\r\n\r\n<style lang=\"scss\">\r\n\r\n .end-all-effects{\r\n margin-bottom: 0.5rem;\r\n }\r\n\r\n .effects-container {\r\n min-width: 320px;\r\n min-height: 563px;\r\n max-width: 320px;\r\n max-height: 563px;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .effects {\r\n flex: 1;\r\n margin-top: 0.5rem;\r\n }\r\n\r\n .running-sequences {\r\n flex: 1;\r\n margin-top: 0.5rem;\r\n }\r\n\r\n</style>\r\n","<script>\r\n\r\n import { localize } from \"@typhonjs-fvtt/runtime/svelte/helper\";\r\n import { writable } from \"svelte/store\";\r\n import { applyStyles } from \"@typhonjs-fvtt/runtime/svelte/action\";\r\n\r\n export let setting;\r\n export let lock = false;\r\n export let min = 0.1;\r\n export let max = 2;\r\n export let maxInput = Infinity;\r\n export let step = 0.01;\r\n export let styles = {};\r\n\r\n const store = setting.store;\r\n const isLocked = lock ? lock.store : writable(false);\r\n\r\n</script>\r\n\r\n<div style=\"display: flex; align-items: center;\" use:applyStyles={styles}>\r\n\t<label>{localize(setting.label)}</label>\r\n\t<input bind:value=\"{$store}\" disabled={$isLocked} {max} {min} {step} type=\"range\"/>\r\n\t<input bind:value=\"{$store}\" disabled={$isLocked} max={maxInput} {min} required {step} type=\"number\"/>\r\n</div>\r\n\r\n<style lang=\"scss\">\r\n\r\n\tlabel {\r\n\t\tflex: 1 0 auto;\r\n\t\tmargin-right: 0.25rem;\r\n\t}\r\n\r\n\tinput[type=\"range\"] {\r\n flex: 1 0 50%;\r\n margin-right: 0.25rem;\r\n\t}\r\n\r\n\tinput[type=\"number\"] {\r\n flex: 1 0 15%;\r\n\t}\r\n\r\n</style>\r\n","<script>\r\n import { localize } from \"@typhonjs-fvtt/runtime/svelte/helper\";\r\n import { applyStyles } from \"@typhonjs-fvtt/runtime/svelte/action\";\r\n import { writable } from \"svelte/store\";\r\n\r\n export let setting;\r\n export let label = false;\r\n export let lock = false;\r\n export let inverse = false\r\n export let styles = {};\r\n\r\n\tconst id = \"sequencer-input-\" + randomID();\r\n const store = setting.store;\r\n const isLocked = lock ? lock.store : writable(inverse);\r\n\r\n $: {\r\n if($isLocked !== inverse){\r\n $store = false;\r\n\t\t}\r\n }\r\n\r\n</script>\r\n\r\n<div style=\"display: flex; align-items: center;\" use:applyStyles={styles}>\r\n\t<input id={id} disabled={$isLocked !== inverse} style=\"height:15px;\" type=\"checkbox\" bind:checked={$store}/>\r\n\t<label for={id}>{localize(setting.label)}</label>\r\n</div>\r\n","<script>\r\n\timport { localize } from \"@typhonjs-fvtt/runtime/svelte/helper\";\r\n import { applyStyles } from \"@typhonjs-fvtt/runtime/svelte/action\";\r\n import { writable } from \"svelte/store\";\r\n\r\n export let setting;\r\n export let lock = false;\r\n export let inverse = false;\r\n export let styles = {};\r\n\r\n const id = \"sequencer-input-\" + randomID();\r\n const store = setting.store;\r\n const isLocked = lock ? lock.store : writable(inverse);\r\n</script>\r\n\r\n<div style=\"display: flex; align-items: center;\" use:applyStyles={styles}>\r\n\t{#if localize(setting.label)}\r\n\t\t<label for={id}>{localize(setting.label)}</label>\r\n\t{/if}\r\n\t<input id={id} type=\"number\" disabled={$isLocked !== inverse} bind:value={$store} on:change={() => { if($store === null) $store = 0; }}/>\r\n</div>\r\n\r\n\r\n<style lang=\"scss\">\r\n\tlabel {\r\n text-align: right;\r\n flex: 1 0 auto;\r\n\t\tpadding-right: 0.25rem;\r\n\t}\r\n\r\n\tinput {\r\n\t\twidth: 100%;\r\n\t\tflex: 1 0 40%;\r\n\t}\r\n</style>\r\n","<script>\r\n\r\n import { localize } from \"@typhonjs-fvtt/runtime/svelte/helper\";\r\n import { applyStyles } from \"@typhonjs-fvtt/runtime/svelte/action\";\r\n\r\n\texport let setting;\r\n export let styles = {};\r\n\r\n const store = setting.store;\r\n\r\n const width = 5.75;\r\n\r\n $: finalStyles = {\r\n ...styles,\r\n\t\t\"--switch-width\": `${width}em`,\r\n\t\t\"--half-switch-width\": `${width-1.5}em`,\r\n\t\t\"--half-switch-width-on\": `${width-1.7}em`,\r\n\t}\r\n\r\n</script>\r\n\r\n<div style=\"display: flex; align-items: center;\" use:applyStyles={finalStyles}>\r\n\r\n\t<div class=\"first\" class:active={!$store} on:click={() => { $store = false; }}>\r\n\t\t<span>{localize(setting.label_off)}</span>\r\n\t</div>\r\n\t<div class=\"second\" class:active={$store} on:click={() => { $store = true; }}>\r\n\t\t<span>{localize(setting.label_on)}</span>\r\n\t</div>\r\n\r\n</div>\r\n\r\n\r\n<style lang=\"scss\">\r\n\r\n\tdiv > div {\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t\tpadding: 2px 5px;\r\n\t\tborder: 1px solid #919191;\r\n\t\tcursor:pointer;\r\n\t}\r\n\r\n\t.first {\r\n\t\tborder-bottom-left-radius: 5px;\r\n\t\tborder-top-left-radius: 5px;\r\n\t\tbackground: #ccc;\r\n border-right: 0;\r\n\t}\r\n\r\n\t.second {\r\n\t\tborder-bottom-right-radius: 5px;\r\n\t\tborder-top-right-radius: 5px;\r\n\t\tbackground: #ccc;\r\n\t}\r\n\r\n\t.active {\r\n background: #eaeaea;\r\n\t}\r\n\r\n</style>\r\n","<script>\r\n import { localize } from '@typhonjs-fvtt/runtime/svelte/helper';\r\n import { PlayerSettings } from \"./effect-player-store.js\";\r\n import { get } from \"svelte/store\";\r\n import SequencerDatabase from \"../../modules/sequencer-database.js\";\r\n import SliderInput from \"./components/SliderInput.svelte\";\r\n import Checkbox from \"./components/Checkbox.svelte\";\r\n import NumberInput from \"./components/NumberInput.svelte\";\r\n import SwitchToggle from \"./components/SwitchToggle.svelte\";\r\n\r\n const fileStore = PlayerSettings.file.store;\r\n const users = game.users.filter(user => user.active);\r\n const userStore = PlayerSettings.users.store;\r\n\r\n let lastInput = \"\";\r\n let lastResults = [];\r\n let suggestions = [];\r\n const searchDebounce = foundry.utils.debounce(() => {\r\n const fileInput = get(fileStore).toLowerCase();\r\n if(!fileInput){\r\n suggestions = SequencerDatabase.publicModules;\r\n return;\r\n\t\t}\r\n if (lastInput === fileInput) return;\r\n let results = SequencerDatabase.searchFor(fileInput);\r\n if (lastResults.equals(results)) return;\r\n lastResults = foundry.utils.duplicate(results);\r\n if (results.length === 1 && results[0].startsWith(fileInput)) return;\r\n if (results.length > 100) {\r\n results = results.slice(0, 100);\r\n }\r\n suggestions = foundry.utils.duplicate(results);\r\n }, 200);\r\n\r\n $: searchDebounce($fileStore);\r\n\r\n async function activateLayer(){\r\n ui.controls.initialize({ control: \"sequencer\", tool: \"play-effect\" });\r\n canvas.sequencerInterfaceLayer.activate({ tool: \"play-effect\" });\r\n\t}\r\n\r\n let filePicker = false;\r\n\r\n function handleClick() {\r\n if (!filePicker) {\r\n const file = get(fileStore);\r\n const current = SequencerDatabase.getEntry(file, { softFail: true })\r\n ? file\r\n : \"\";\r\n filePicker = new FilePicker({\r\n type: \"imageVideo\",\r\n current,\r\n callback: path => {\r\n fileStore.set(path);\r\n filePicker = false;\r\n }\r\n });\r\n }\r\n filePicker.render(true, { focus: true });\r\n }\r\n\r\n const presets = PlayerSettings.getPresets();\r\n let selectedPreset = \"default\";\r\n\r\n</script>\r\n\r\n<div class=\"effect-player-container\">\r\n\r\n\t<fieldset>\r\n\r\n\t\t<legend>Effect</legend>\r\n\r\n\t\t<button class=\"activate-layer\" type=\"button\" on:click={() => activateLayer()}>{localize(\"SEQUENCER.Player.SwitchToLayer\")}</button>\r\n\r\n\t\t<div class=\"file-settings\">\r\n\t\t\t<input bind:value={$fileStore} class=\"file-input flex3\"\r\n list=\"dblist\"\r\n\t\t\t\t\t\t placeholder='{localize(\"SEQUENCER.Player.PathInput\")}'\r\n\t\t\t\t\t\t type=\"text\"/>\r\n\t\t\t<button class=\"custom-file-picker small-button\" type=\"button\" on:click={handleClick}>\r\n <i class=\"fas fa-file-import\"></i>\r\n </button>\r\n\t\t\t<datalist id=\"dblist\">\r\n\t\t\t\t{#each suggestions as suggestion}\r\n\t\t\t\t\t<option>{suggestion}</option>\r\n\t\t\t\t{/each}\r\n\t\t\t</datalist>\r\n\t\t</div>\r\n\r\n\t\t<div class=\"user-settings flexcol\">\r\n\t\t\t<label for=\"user-select\">Play for users:</label>\r\n\t\t\t<select class=\"user-select\" id=\"user-select\" multiple bind:value={$userStore}>\r\n\t\t\t\t<option selected value=\"all\">{localize(\"SEQUENCER.Player.AllUsers\")}</option>\r\n\t\t\t\t{#each users as user (user.id)}\r\n\t\t\t\t\t<option value=\"{user.id}\">{user.name}</option>\r\n\t\t\t\t{/each}\r\n\t\t\t</select>\r\n\t\t</div>\r\n\r\n\t\t<div class=\"flexcol\">\r\n\r\n\t\t\t<div class=\"row w-100\">{localize(\"SEQUENCER.Player.Presets\")}</div>\r\n\r\n\t\t\t<div class=\"preset-container\">\r\n\r\n\t\t\t\t<select class=\"preset-select\" bind:value={selectedPreset} on:change={() => PlayerSettings.loadPreset(selectedPreset)}>\r\n\r\n\t\t\t\t\t<option value=\"default\">{localize(\"SEQUENCER.Player.PresetsDefault\")}</option>\r\n\t\t\t\t\t{#each presets as preset}\r\n\t\t\t\t\t\t<option>{preset}</option>\r\n\t\t\t\t\t{/each}\r\n\t\t\t\t\t<!--{{#each presets}}-->\r\n\t\t\t\t\t<!--<option>{{ @key }}</option>-->\r\n\t\t\t\t\t<!--{{/each}}-->\r\n\r\n\t\t\t\t</select>\r\n\r\n\t\t\t\t<button class=\"save-preset small-button\" data-tooltip=\"Save Preset\" type=\"button\" on:click={() => PlayerSettings.savePreset(selectedPreset)}>\r\n\t\t\t\t\t<i class=\"fas fa-download\"></i>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button class=\"copy-preset small-button\" data-tooltip=\"Copy Preset\" disabled={selectedPreset === \"default\"} type=\"button\" on:click={() => PlayerSettings.copyPreset(selectedPreset)}>\r\n\t\t\t\t\t<i class=\"fas fa-copy\"></i>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button class=\"delete-preset small-button\" data-tooltip=\"Delete Preset\" disabled={selectedPreset === \"default\"} type=\"button\" on:click={() => PlayerSettings.deletePreset(selectedPreset)}>\r\n\t\t\t\t\t<i class=\"fas fa-times\"></i>\r\n\t\t\t\t</button>\r\n\r\n\t\t\t</div>\r\n\r\n\t\t</div>\r\n\r\n\t</fieldset>\r\n\r\n\t<fieldset>\r\n\r\n\t\t<legend>Transform</legend>\r\n\r\n\t\t<div class=\"effect-transform-container\">\r\n\t\t\t<SliderInput setting={PlayerSettings.scale} styles={{ \"grid-column\": `1 / 5` }}/>\r\n\t\t\t<NumberInput setting={PlayerSettings.scaleIn} styles={{ \"grid-column\": `1 / 3` }}/>\r\n\t\t\t<NumberInput setting={PlayerSettings.scaleOut} styles={{ \"grid-column\": `3 / 5` }}/>\r\n\t\t\t<div class=\"divider\"></div>\r\n\t\t\t<SliderInput setting={PlayerSettings.rotation} lock={PlayerSettings.randomRotation} min=\"-180\" max=\"180\" styles={{ \"grid-column\": `1 / 5` }}/>\r\n\t\t\t<div></div>\r\n\t\t\t<Checkbox setting={PlayerSettings.randomRotation} styles={{ \"grid-column\": `2 / 4` }}/>\r\n\t\t\t<div></div>\r\n\t\t\t<div class=\"divider\"></div>\r\n\t\t\t<Checkbox setting={PlayerSettings.mirrorX} styles={{ \"grid-column\": `1 / 3` }}/>\r\n\t\t\t<Checkbox setting={PlayerSettings.mirrorY} styles={{ \"grid-column\": `3 / 5` }}/>\r\n\t\t\t<Checkbox setting={PlayerSettings.randomMirrorX} styles={{ \"grid-column\": `1 / 3` }} lock={PlayerSettings.mirrorX} inverse/>\r\n\t\t\t<Checkbox setting={PlayerSettings.randomMirrorY} styles={{ \"grid-column\": `3 / 5` }} lock={PlayerSettings.mirrorY} inverse/>\r\n\t\t\t<div class=\"divider\"></div>\r\n\t\t\t<NumberInput setting={PlayerSettings.offsetX} lock={PlayerSettings.randomOffset} styles={{ \"grid-column\": `1 / 3` }}/>\r\n\t\t\t<NumberInput setting={PlayerSettings.offsetY} lock={PlayerSettings.randomOffset} styles={{ \"grid-column\": `3 / 5` }}/>\r\n\t\t\t<Checkbox setting={PlayerSettings.randomOffset} styles={{ \"grid-column\": `1 / 3` }}/>\r\n\t\t\t<NumberInput setting={PlayerSettings.randomOffsetAmount} lock={PlayerSettings.randomOffset} inverse styles={{ \"grid-column\": `3 / 5` }}/>\r\n\t\t\t<Checkbox setting={PlayerSettings.offsetGridUnits} styles={{ \"grid-column\": `2 / 5` }}/>\r\n\t\t\t<div></div>\r\n\t\t</div>\r\n\r\n\t</fieldset>\r\n\r\n\t<fieldset>\r\n\r\n\t\t<legend>Behavior</legend>\r\n\t\t<div class=\"effect-transform-container\">\r\n\t\t\t<NumberInput setting={PlayerSettings.fadeIn} styles={{ \"grid-column\": `1 / 3` }}/>\r\n\t\t\t<NumberInput setting={PlayerSettings.fadeOut} styles={{ \"grid-column\": `3 / 5` }}/>\r\n\t\t\t<div class=\"divider\"></div>\r\n\t\t\t<Checkbox setting={PlayerSettings.repeat} styles={{ \"grid-column\": `1 / 3` }}/>\r\n\t\t\t<NumberInput setting={PlayerSettings.repetitions} lock={PlayerSettings.repeat} inverse styles={{ \"grid-column\": `3 / 5` }}/>\r\n\t\t\t<NumberInput setting={PlayerSettings.repeatDelayMin} lock={PlayerSettings.repeat} inverse styles={{ \"grid-column\": `3 / 4` }}/>\r\n\t\t\t<NumberInput setting={PlayerSettings.repeatDelayMax} lock={PlayerSettings.repeat} inverse styles={{ \"grid-column\": `4 / 5` }}/>\r\n\t\t\t<div class=\"divider\"></div>\r\n\t\t\t<SwitchToggle setting={PlayerSettings.moveTowards} styles={{ \"grid-column\": `1 / 3` }}/>\r\n\t\t\t<NumberInput setting={PlayerSettings.moveSpeed} lock={PlayerSettings.moveTowards} inverse styles={{ \"grid-column\": `3 / 5` }}/>\r\n\t\t\t<div class=\"divider\"></div>\r\n\t\t\t<Checkbox setting={PlayerSettings.attachTo} styles={{ \"grid-column\": `1 / 5` }}/>\r\n\t\t\t<Checkbox setting={PlayerSettings.stretchToAttach} styles={{ \"grid-column\": `1 / 5` }}/>\r\n\t\t\t<Checkbox setting={PlayerSettings.snapToGrid} styles={{ \"grid-column\": `1 / 5` }}/>\r\n\t\t\t<Checkbox setting={PlayerSettings.persist} styles={{ \"grid-column\": `1 / 5` }}/>\r\n\t\t\t<Checkbox setting={PlayerSettings.belowTokens} styles={{ \"grid-column\": `1 / 5` }}/>\r\n\t\t</div>\r\n\r\n\t</fieldset>\r\n\r\n</div>\r\n\r\n<style lang=\"scss\">\r\n\r\n\t.activate-layer {\r\n\t\tmargin-bottom: 0.5rem;\r\n\t}\r\n\r\n\t.file-settings {\r\n\t\tdisplay: flex;\r\n margin-bottom: 0.5rem;\r\n\t}\r\n\r\n\t.preset-container {\r\n\t\tdisplay: flex;\r\n margin-bottom: 0.5rem;\r\n\r\n\t\tselect {\r\n\t\t\tflex: 1;\r\n }\r\n\t}\r\n\r\n .small-button {\r\n flex: 0 0 24px;\r\n min-width: 30px;\r\n line-height: 24px;\r\n margin: -1px 0 -1px 4px;\r\n order: 99;\r\n text-align: center;\r\n\r\n i {\r\n margin: 0;\r\n }\r\n\r\n &:disabled {\r\n cursor: initial;\r\n opacity: 0.5;\r\n }\r\n\r\n }\r\n\r\n\t.user-settings {\r\n margin-bottom: 0.5rem;\r\n\t}\r\n\r\n .scrolling-text {\r\n\r\n }\r\n\r\n /* jb2a.breath_weapons02.burst.cone.arcana */\r\n\r\n</style>\r\n","<script>\r\n\r\n import CONSTANTS from \"../../../constants.js\";\r\n\r\n export let status;\r\n\r\n</script>\r\n\r\n<i class=\"fa-solid background-circle\"\r\n class:invisible={$status === CONSTANTS.STATUS.READY}\r\n class:fa-arrow-right={$status === CONSTANTS.STATUS.RUNNING || $status === CONSTANTS.STATUS.READY}\r\n class:fa-check={$status === CONSTANTS.STATUS.COMPLETE}\r\n class:fa-arrow-down={$status === CONSTANTS.STATUS.SKIPPED}\r\n class:fa-times={$status === CONSTANTS.STATUS.ABORTED}>\r\n</i>\r\n<i class=\"fa-solid \"></i>\r\n\r\n<style lang=\"scss\">\r\n\r\n .background-circle{\r\n position: relative;\r\n z-index: 2;\r\n margin-right: 0.2rem;\r\n min-width: 1rem;\r\n text-align: center;\r\n }\r\n\r\n .invisible {\r\n opacity: 0;\r\n }\r\n\r\n</style>\r\n","<script>\r\n\r\n import { localize } from \"@typhonjs-fvtt/runtime/svelte/helper\";\r\n import SequenceStatus from \"./SequenceStatus.svelte\";\r\n import CONSTANTS from \"../../../constants.js\";\r\n\r\n export let section;\r\n\r\n const status = section.sectionStatus;\r\n const sectionName = (section?.constructor?.niceName ? section?.constructor?.niceName : section.constructor.name) + (section?._name ? \" - \" + section._name : \"\");\r\n\r\n</script>\r\n\r\n<div>\r\n <span>\r\n <SequenceStatus {status}/>\r\n </span>\r\n <span class=\"section-name\">{sectionName}</span>\r\n <span class=\"sequence-actions\" data-tooltip={localize(\"SEQUENCER.Sequences.AbortSection\")}>\r\n <a class:section-done={$status > CONSTANTS.STATUS.READY} on:click={() => { section._abortSection(); }}>\r\n <i class=\"fas fa-stop\"></i>\r\n </a>\r\n </span>\r\n</div>\r\n\r\n<style lang=\"scss\">\r\n div {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n margin-left: 0.5rem;\r\n padding: 3px 5px;\r\n border-radius: 3px;\r\n\r\n .section-name {\r\n flex: 1;\r\n }\r\n\r\n &:hover {\r\n background: rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n .sequence-actions {\r\n opacity: 0.3;\r\n }\r\n\r\n &:hover .sequence-actions {\r\n opacity: 0.8;\r\n }\r\n\r\n .section-done {\r\n display: none;\r\n }\r\n }\r\n</style>\r\n","<script>\r\n\r\n import { localize } from \"@typhonjs-fvtt/runtime/svelte/helper\";\r\n import SequenceSection from \"./SequenceSection.svelte\";\r\n import SequenceStatus from \"./SequenceStatus.svelte\";\r\n import SequenceManager from \"../../../modules/sequence-manager.js\";\r\n import CONSTANTS from \"../../../constants.js\";\r\n\r\n export let sequence;\r\n export let index;\r\n\r\n const status = sequence.status;\r\n\r\n</script>\r\n\r\n\r\n<div class=\"sequence-name-container\">\r\n <span>\r\n <SequenceStatus {status}/>\r\n </span>\r\n <span class=\"sequence-name\">\r\n Sequence {index}{sequence.moduleName ? ` (${sequence.moduleName})` : \"\"}\r\n </span>\r\n <span class=\"sequence-actions\">\r\n <a class=\"clear-sequence\"\r\n class:sequence-done-show={$status > CONSTANTS.STATUS.RUNNING}\r\n on:click={() => { SequenceManager.RunningSequences.delete(sequence.id); }}\r\n data-tooltip={localize(\"SEQUENCER.Sequences.Clear\")}\r\n >\r\n <i class=\"fas fa-trash-can\"></i>\r\n </a>\r\n <a class:sequence-done-hide={$status > CONSTANTS.STATUS.RUNNING} on:click={() => { sequence._abort(); }} data-tooltip={localize(\"SEQUENCER.Sequences.AbortSequence\")}>\r\n <i class=\"fas fa-stop\"></i>\r\n </a>\r\n </span>\r\n</div>\r\n{#each sequence.sections as section}\r\n <SequenceSection {section} />\r\n{/each}\r\n\r\n\r\n<style lang=\"scss\">\r\n\r\n .sequence-name-container{\r\n display: flex;\r\n font-weight: bold;\r\n padding: 3px 5px;\r\n border-radius: 3px;\r\n\r\n .sequence-name {\r\n flex: 1;\r\n }\r\n\r\n &:hover {\r\n background: rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n .sequence-actions {\r\n display: flex;\r\n max-width: 10px;\r\n flex: 0 1 10px;\r\n & a {\r\n opacity: 0.35;\r\n }\r\n }\r\n\r\n &:hover .sequence-actions a {\r\n opacity: 0.7;\r\n\r\n &:hover{\r\n opacity: 1.0;\r\n }\r\n }\r\n\r\n .clear-sequence {\r\n margin-right: 0.5rem;\r\n display: none;\r\n }\r\n\r\n .sequence-done-show {\r\n display: block;\r\n }\r\n\r\n .sequence-done-hide {\r\n display: none;\r\n }\r\n\r\n }\r\n\r\n</style>\r\n","<script>\r\n import { localize } from \"@typhonjs-fvtt/runtime/svelte/helper\";\r\n import { onDestroy } from \"svelte\";\r\n import SequenceManager from \"../../modules/sequence-manager.js\";\r\n import Sequence from \"./components/Sequence.svelte\";\r\n\r\n const VisibleEffects = SequenceManager.VisibleEffects;\r\n const RunningSequences = SequenceManager.RunningSequences;\r\n\r\n $: sequences = Object.values($RunningSequences);\r\n $: runningSequences = Object.entries($RunningSequences);\r\n\r\n onDestroy(() => {\r\n SequenceManager.RunningSequences.clearFinishedSequences();\r\n });\r\n\r\n</script>\r\n\r\n<div class=\"sequence-container\">\r\n\r\n {#if !runningSequences.length}\r\n\r\n <div class=\"no-sequences\">\r\n <h2>{localize(\"SEQUENCER.Sequences.NoSequences\")}</h2>\r\n </div>\r\n\r\n {:else}\r\n\r\n <div class=\"sequence-button-header\">\r\n <button type=\"button\" on:click={() => {\r\n SequenceManager.RunningSequences.clearFinishedSequences();\r\n }}>\r\n {localize(\"SEQUENCER.Sequences.ClearFinished\")}\r\n </button>\r\n <button type=\"button\" on:click={() => {\r\n SequenceManager.RunningSequences.stopAll();\r\n }}>\r\n {localize(\"SEQUENCER.Sequences.StopAll\")}\r\n </button>\r\n </div>\r\n\r\n <div class=\"running-sequences\">\r\n {#each runningSequences as [id, sequence], index (id)}\r\n <Sequence {sequence} index={index+1}/>\r\n {/each}\r\n </div>\r\n\r\n {/if}\r\n\r\n</div>\r\n\r\n<style lang=\"scss\">\r\n\r\n .sequence-container {\r\n min-width: 320px;\r\n min-height: 563px;\r\n max-width: 320px;\r\n max-height: 563px;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .sequence-button-header{\r\n display: flex;\r\n button {\r\n font-size: 0.85rem;\r\n }\r\n }\r\n\r\n .effects {\r\n flex: 1;\r\n margin-top: 0.5rem;\r\n }\r\n\r\n .running-sequences{\r\n flex: 1;\r\n margin-top: 0.5rem;\r\n }\r\n\r\n</style>\r\n","<script>\r\n\r\n import { ApplicationShell } from \"@typhonjs-fvtt/runtime/svelte/component/core\";\r\n import { localize } from '@typhonjs-fvtt/runtime/svelte/helper';\r\n import { getContext } from \"svelte\";\r\n import HowTo from \"./HowTo.svelte\";\r\n import Tabs from \"./Tabs.svelte\";\r\n import Manager from \"./Manager.svelte\";\r\n import Player from \"./Player.svelte\";\r\n import Sequences from \"./Sequences.svelte\";\r\n\r\n const { application } = getContext(\"#external\");\r\n\r\n export let elementRoot;\r\n\r\n let tabs = [\r\n { value: \"player\", label: localize(\"SEQUENCER.Player.Title\"), icon: \"fas fa-play-circle\", component: Player },\r\n { value: \"manager\", label: localize(\"SEQUENCER.Manager.Title\"), icon: \"fas fa-film\", component: Manager },\r\n { value: \"sequences\", label: localize(\"SEQUENCER.Sequences.Title\"), icon: \"fas fa-play\", component: Sequences },\r\n { value: \"howto\", label: localize(\"SEQUENCER.HowTo.Title\"), icon: \"fas fa-chalkboard-teacher\", component: HowTo },\r\n ];\r\n\r\n let activeTab = application.options.tab ?? \"manager\";\r\n $: component = tabs.find(tab => tab.value === activeTab).component;\r\n\r\n</script>\r\n\r\n<svelte:options accessors={true}/>\r\n\r\n<ApplicationShell bind:elementRoot>\r\n\r\n\t<Tabs bind:activeTab {tabs}/>\r\n\r\n\t<svelte:component this={component}/>\r\n\r\n</ApplicationShell>\r\n","import { SvelteApplication } from \"@typhonjs-fvtt/runtime/svelte/application\";\nimport EffectsUIShell from \"./effects-ui-shell.svelte\";\n\nexport class EffectsUIApp extends SvelteApplication {\n static get defaultOptions() {\n return foundry.utils.mergeObject(super.defaultOptions, {\n title: game.i18n.localize(\"SEQUENCER.ManagerUI\"),\n classes: [\"dialog\"],\n width: \"auto\",\n height: \"auto\",\n top: 65,\n left: 120,\n resizable: false,\n svelte: {\n class: EffectsUIShell,\n target: document.body,\n },\n });\n }\n\n static getActiveApp() {\n return Object.values(ui.windows).find((app) => {\n return (\n app instanceof this && app._state > Application.RENDER_STATES.CLOSED\n );\n });\n }\n\n static async show(options = {}) {\n const existingApp = this.getActiveApp();\n if (existingApp) return existingApp.render(false, { focus: true });\n return new Promise((resolve) => {\n options.resolve = resolve;\n new this(options).render(true, { focus: true });\n });\n }\n}\n","import CONSTANTS from \"./constants.js\";\nimport { debug, user_can_do } from \"./lib/lib.js\";\nimport { DatabaseViewerApp } from \"./formapplications/database/database-viewer-app.js\";\nimport { EffectsUIApp } from \"./formapplications/effects-ui/effects-ui-app.js\";\n\nexport function registerSettings() {\n game.settings.register(CONSTANTS.MODULE_NAME, \"enable-fix-pixi\", {\n name: \"SEQUENCER.Setting.EnablePixiFix.Title\",\n hint: \"SEQUENCER.Setting.EnablePixiFix.Label\",\n scope: \"client\",\n config: true,\n default: false,\n requiresReload: true,\n type: Boolean,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"enable-global-fix-pixi\", {\n name: \"SEQUENCER.Setting.EnableGlobalPixiFix.Title\",\n hint: \"SEQUENCER.Setting.EnableGlobalPixiFix.Label\",\n scope: \"client\",\n config: true,\n default: false,\n requiresReload: true,\n type: Boolean,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"enable-above-ui-screenspace\", {\n name: \"SEQUENCER.Setting.EnableAboveUIScreenspace.Title\",\n hint: \"SEQUENCER.Setting.EnableAboveUIScreenspace.Label\",\n scope: \"client\",\n config: true,\n default: true,\n requiresReload: true,\n type: Boolean,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"debug\", {\n name: \"SEQUENCER.Setting.Debug.Title\",\n hint: \"SEQUENCER.Setting.Debug.Label\",\n scope: \"client\",\n config: true,\n default: false,\n type: Boolean,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"showSidebarTools\", {\n name: \"SEQUENCER.Setting.ShowTools.Title\",\n hint: \"SEQUENCER.Setting.ShowTools.Label\",\n scope: \"client\",\n config: true,\n default: true,\n requiresReload: true,\n type: Boolean,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"showTokenSidebarTools\", {\n name: \"SEQUENCER.Setting.ShowTokenTools.Title\",\n hint: \"SEQUENCER.Setting.ShowTokenTools.Label\",\n scope: \"client\",\n config: true,\n default: true,\n requiresReload: true,\n type: Boolean,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"effectsEnabled\", {\n name: \"SEQUENCER.Setting.EnableEffects.Title\",\n hint: \"SEQUENCER.Setting.EnableEffects.Label\",\n scope: \"client\",\n config: true,\n default: true,\n requiresReload: true,\n type: Boolean,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"soundsEnabled\", {\n name: \"SEQUENCER.Setting.EnableSounds.Title\",\n hint: \"SEQUENCER.Setting.EnableSounds.Label\",\n scope: \"client\",\n config: true,\n default: true,\n requiresReload: true,\n type: Boolean,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"user-effect-opacity\", {\n name: \"SEQUENCER.Setting.ExternalEffectOpacity.Title\",\n hint: \"SEQUENCER.Setting.ExternalEffectOpacity.Label\",\n scope: \"client\",\n config: true,\n default: 50,\n type: Number,\n range: {\n min: 0,\n max: 100,\n step: 1,\n },\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"db-list-view\", {\n scope: \"client\",\n config: false,\n default: false,\n type: Boolean,\n });\n\n const permissionLevels = [\n game.i18n.localize(\"SEQUENCER.Permission.Player\"),\n game.i18n.localize(\"SEQUENCER.Permission.Trusted\"),\n game.i18n.localize(\"SEQUENCER.Permission.Assistant\"),\n game.i18n.localize(\"SEQUENCER.Permission.GM\"),\n ];\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"permissions-effect-create\", {\n name: \"SEQUENCER.Setting.Permission.EffectCreate.Title\",\n hint: \"SEQUENCER.Setting.Permission.EffectCreate.Label\",\n scope: \"world\",\n config: true,\n default: 0,\n type: Number,\n choices: permissionLevels,\n requiresReload: true,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"permissions-effect-delete\", {\n name: \"SEQUENCER.Setting.Permission.EffectDelete.Title\",\n hint: \"SEQUENCER.Setting.Permission.EffectDelete.Label\",\n scope: \"world\",\n config: true,\n default: 2,\n type: Number,\n choices: permissionLevels,\n requiresReload: true,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"permissions-sound-create\", {\n name: \"SEQUENCER.Setting.Permission.SoundCreate.Title\",\n hint: \"SEQUENCER.Setting.Permission.SoundCreate.Label\",\n scope: \"world\",\n config: true,\n default: 0,\n type: Number,\n choices: permissionLevels,\n requiresReload: true,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"permissions-preload\", {\n name: \"SEQUENCER.Setting.Permission.PreloadClients.Title\",\n hint: \"SEQUENCER.Setting.Permission.PreloadClients.Label\",\n scope: \"world\",\n config: true,\n default: 1,\n type: Number,\n choices: permissionLevels,\n requiresReload: true,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"permissions-sidebar-tools\", {\n name: \"SEQUENCER.Setting.Permission.UseSidebarTools.Title\",\n hint: \"SEQUENCER.Setting.Permission.UseSidebarTools.Label\",\n scope: \"world\",\n config: true,\n default: 0,\n type: Number,\n choices: permissionLevels,\n requiresReload: true,\n });\n\n game.settings.register(CONSTANTS.MODULE_NAME, \"effectPresets\", {\n scope: \"client\",\n default: {},\n type: Object,\n });\n\n Hooks.on(\"getSceneControlButtons\", (controls) => {\n if (!game.settings.get(CONSTANTS.MODULE_NAME, \"showSidebarTools\")) return;\n\n const selectTool = {\n icon: \"fas fa-expand\",\n name: \"select-effect\",\n title: \"SEQUENCER.SidebarButtons.Select\",\n visible:\n user_can_do(\"permissions-effect-create\") &&\n user_can_do(\"permissions-sidebar-tools\"),\n };\n\n const playTool = {\n icon: \"fas fa-play\",\n name: \"play-effect\",\n title: \"SEQUENCER.SidebarButtons.Play\",\n visible:\n user_can_do(\"permissions-effect-create\") &&\n user_can_do(\"permissions-sidebar-tools\"),\n onClick: () => {\n EffectsUIApp.show({ inFocus: true, tab: \"player\" });\n },\n };\n\n const viewer = {\n icon: \"fas fa-film\",\n name: \"effectviewer\",\n title: \"SEQUENCER.SidebarButtons.Manager\",\n button: true,\n visible:\n user_can_do(\"permissions-effect-create\") &&\n user_can_do(\"permissions-sidebar-tools\"),\n onClick: () => {\n EffectsUIApp.show({ inFocus: true, tab: \"manager\" });\n },\n };\n\n const database = {\n icon: \"fas fa-database\",\n name: \"effectdatabase\",\n title: \"SEQUENCER.SidebarButtons.Database\",\n button: true,\n visible: user_can_do(\"permissions-sidebar-tools\"),\n onClick: () => {\n DatabaseViewerApp.show();\n },\n };\n\n controls.push({\n name: CONSTANTS.MODULE_NAME,\n title: \"Sequencer Layer\",\n icon: \"fas fa-list-ol\",\n layer: \"sequencerInterfaceLayer\",\n visible:\n user_can_do(\"permissions-effect-create\") &&\n user_can_do(\"permissions-sidebar-tools\"),\n activeTool: \"select-effect\",\n tools: [selectTool, playTool, database, viewer],\n });\n\n if (!game.settings.get(CONSTANTS.MODULE_NAME, \"showTokenSidebarTools\"))\n return;\n\n const bar = controls.find((c) => c.name === \"token\");\n bar.tools.push(database);\n bar.tools.push(viewer);\n });\n\n debug(\"Sequencer | Registered settings\");\n}\n\nexport async function migrateSettings() {\n const oldScreenspaceSetting = game.settings.storage\n .get(\"client\")\n .getItem(\"sequencer.disable-above-ui-screenspace\");\n if (oldScreenspaceSetting) {\n const value = oldScreenspaceSetting === \"true\";\n game.settings.storage\n .get(\"client\")\n .removeItem(\"sequencer.disable-above-ui-screenspace\");\n await game.settings.set(\n CONSTANTS.MODULE_NAME,\n \"enable-above-ui-screenspace\",\n !value\n );\n }\n}\n","import {\n BaseEffectsLayer,\n SequencerInterfaceLayer,\n UIEffectsLayer,\n} from \"./canvas-effects/effects-layer.js\";\nimport { debug } from \"./lib/lib.js\";\n\nexport default function registerLayers() {\n CONFIG.Canvas.layers = foundry.utils.mergeObject(Canvas.layers, {\n sequencerEffects: {\n layerClass: BaseEffectsLayer,\n group: \"primary\",\n },\n sequencerInterfaceLayer: {\n layerClass: SequencerInterfaceLayer,\n group: \"interface\",\n },\n sequencerEffectsUILayer: {\n layerClass: UIEffectsLayer,\n group: \"interface\",\n },\n });\n\n if (!Object.is(Canvas.layers, CONFIG.Canvas.layers)) {\n const layers = Canvas.layers;\n Object.defineProperty(Canvas, \"layers\", {\n get: function () {\n return foundry.utils.mergeObject(layers, CONFIG.Canvas.layers);\n },\n });\n }\n\n debug(\"Registered Layers\");\n}\n","import CONSTANTS from \"./constants.js\";\nimport {\n EffectPlayer,\n SelectionManager,\n} from \"./modules/sequencer-interaction-manager.js\";\nimport { PlayerSettings } from \"./formapplications/effects-ui/effect-player-store.js\";\n\nconst hotkeys = {\n get _ready() {\n return canvas.ready && canvas.sequencerInterfaceLayer.active;\n },\n\n playTool: {\n playManySequencedDown: () => {\n if (!hotkeys._ready) return;\n EffectPlayer.playManySequenced = true;\n },\n playManySequencedUp: () => {\n if (!hotkeys._ready) return;\n EffectPlayer.playManySequenced = false;\n if (!EffectPlayer.isActive) return;\n EffectPlayer.playManyUp();\n },\n playManyDown: () => {\n if (!hotkeys._ready) return;\n EffectPlayer.playMany = true;\n },\n playManyUp: () => {\n if (!hotkeys._ready) return;\n EffectPlayer.playMany = false;\n if (!EffectPlayer.isActive) return;\n EffectPlayer.playManyUp();\n },\n attachToDown: () => {\n if (!hotkeys._ready) return;\n PlayerSettings.attachTo.store.set(true);\n PlayerSettings.stretchToAttach.store.set(true);\n },\n attachToUp: () => {\n if (!hotkeys._ready) return;\n PlayerSettings.attachTo.store.set(false);\n PlayerSettings.stretchToAttach.store.set(false);\n },\n },\n\n selectTool: {\n snapToGridDown: () => {\n if (!hotkeys._ready) return;\n SelectionManager.snapToGrid = true;\n },\n snapToGridUp: () => {\n if (!hotkeys._ready) return;\n SelectionManager.snapToGrid = false;\n },\n attachToTargetDown: () => {\n if (!hotkeys._ready) return;\n if (!SelectionManager.isActive) return;\n PlayerSettings.attachTo.store.set(true);\n PlayerSettings.stretchToAttach.store.set(true);\n },\n attachToTargetUp: () => {\n if (!hotkeys._ready) return;\n PlayerSettings.attachTo.store.set(false);\n PlayerSettings.stretchToAttach.store.set(false);\n },\n deleteDown: () => {\n if (!hotkeys._ready) return;\n SelectionManager.delete();\n },\n },\n};\n\nexport default function registerHotkeys() {\n game.keybindings.register(CONSTANTS.MODULE_NAME, \"play-tool-hotkey-control\", {\n name: \"SEQUENCER.Hotkeys.PlayTool.Control\",\n editable: [{ key: \"ControlLeft\" }],\n onDown: hotkeys.playTool.playManySequencedDown,\n onUp: hotkeys.playTool.playManySequencedUp,\n });\n\n game.keybindings.register(CONSTANTS.MODULE_NAME, \"play-tool-hotkey-shift\", {\n name: \"SEQUENCER.Hotkeys.PlayTool.Shift\",\n editable: [{ key: \"ShiftLeft\" }],\n onDown: hotkeys.playTool.playManyDown,\n onUp: hotkeys.playTool.playManyUp,\n });\n\n game.keybindings.register(CONSTANTS.MODULE_NAME, \"play-tool-hotkey-alt\", {\n name: \"SEQUENCER.Hotkeys.PlayTool.Alt\",\n editable: [{ key: \"AltLeft\" }],\n onDown: hotkeys.playTool.attachToDown,\n onUp: hotkeys.playTool.attachToDown,\n });\n\n game.keybindings.register(\n CONSTANTS.MODULE_NAME,\n \"select-tool-hotkey-control\",\n {\n name: \"SEQUENCER.Hotkeys.SelectTool.Control\",\n editable: [{ key: \"ControlLeft\" }],\n onDown: hotkeys.selectTool.snapToGridDown,\n onUp: hotkeys.selectTool.snapToGridUp,\n }\n );\n\n game.keybindings.register(CONSTANTS.MODULE_NAME, \"select-tool-hotkey-alt\", {\n name: \"SEQUENCER.Hotkeys.SelectTool.Alt\",\n editable: [{ key: \"AltLeft\" }],\n onDown: hotkeys.selectTool.attachToTargetDown,\n onUp: hotkeys.selectTool.attachToTargetUp,\n });\n\n game.keybindings.register(\n CONSTANTS.MODULE_NAME,\n \"select-tool-hotkey-delete\",\n {\n name: \"SEQUENCER.Hotkeys.SelectTool.Delete\",\n editable: [{ key: \"Delete\" }],\n onDown: hotkeys.selectTool.deleteDown,\n }\n );\n}\n","export default async function registerTypes(register) {\n fetch(\"modules/sequencer/typings/types.d.ts\")\n .then((response) => response.text())\n .then((content) => register(\"sequencer/types.d.ts\", content));\n}\n","import { custom_error, debug, is_function } from \"../lib/lib.js\";\n\nconst presetMap = new Map();\n\nexport default class SequencerPresets {\n /**\n * Adds a preset that can then be used in sequences\n *\n * @param {string} inName\n * @param {Function} inFunction\n * @param {boolean} [overwrite=false] overwrite\n * @returns {Map<string, Function>}\n */\n static add(inName, inFunction, overwrite = false) {\n if (typeof inName !== \"string\") {\n throw custom_error(\n \"Sequencer\",\n `SequencerPresets | inName must be of type string`\n );\n }\n\n if (!is_function(inFunction)) {\n throw custom_error(\n \"Sequencer\",\n `SequencerPresets | inFunction must be of type function`\n );\n }\n\n if (presetMap.get(inName) && !overwrite) {\n throw custom_error(\n \"Sequencer\",\n `SequencerPresets | Preset \"${inName}\" already exists`\n );\n }\n\n presetMap.set(inName, inFunction);\n debug(`Sequencer | Presets | Added \"${inName}\" preset`);\n return presetMap;\n }\n\n /**\n * Retrieves all presets\n *\n * @returns {Map<string, Function>}\n */\n static getAll() {\n return presetMap;\n }\n\n /**\n * Retrieves preset based on its name\n *\n * @param {string} name\n * @returns {Function}\n */\n static get(name) {\n return presetMap.get(name);\n }\n}\n","import * as lib from \"../lib/lib.js\";\nimport SequencerPresets from \"../modules/sequencer-presets.js\";\nimport CONSTANTS from \"../constants.js\";\nimport { get, writable } from \"svelte/store\";\n\nexport default class Section {\n constructor(inSequence) {\n this.sequence = inSequence;\n this._applyTraits();\n this._sectionStatus = writable(CONSTANTS.STATUS.READY);\n this._playIf = true;\n this._waitUntilFinished = false;\n this._async = false;\n this._waitUntilFinishedDelay = [0, 0];\n this._repetitions = 1;\n this._currentRepetition = 0;\n this._repeatDelayMin = 0;\n this._repeatDelayMax = 0;\n this._repeatDelay = 0;\n this._delayMin = 0;\n this._delayMax = 0;\n this._basicDelay = 0;\n this._duration = false;\n }\n\n static niceName = \"Section\";\n\n /**\n * @protected\n */\n get _shouldAsync() {\n return this._async || this._waitAnyway;\n }\n\n /**\n * @protected\n */\n get shouldWaitUntilFinished() {\n return this._waitUntilFinished || this._waitAnyway;\n }\n\n /**\n * @protected\n */\n get _waitAnyway() {\n return (\n ((this._async || this._waitUntilFinished) && this._isLastRepetition) ||\n (this._isLastRepetition && this._isLastSection)\n );\n }\n\n /**\n * @protected\n */\n get _isLastSection() {\n return (\n this.sequence.sections.length - 1 === this.sequence.sections.indexOf(this)\n );\n }\n\n /** ------------------------------------------------------------------------------------------------------------------------------ *\n * Methods below this point should NOT be overridden by child instances of the class, they are integral to the sequence functioning\n * ------------------------------------------------------------------------------------------------------------------------------- */\n\n /**\n * @protected\n */\n get _isLastRepetition() {\n return (\n this._repetitions === 1 ||\n this._repetitions === this._currentRepetition + 1\n );\n }\n\n /**\n * @protected\n */\n get _currentWaitTime() {\n let waitUntilFinishedDelay = this._waitAnyway\n ? lib.random_int_between(...this._waitUntilFinishedDelay)\n : 0;\n return waitUntilFinishedDelay + this._repeatDelay;\n }\n\n /**\n * Method overwritten by inheriting classes, which is called just before the \"run\" method is called (see below)\n *\n * @returns {Promise<void>}\n * @protected\n */\n async preRun() {}\n\n /**\n * Method overwritten by inheriting classes, which is called when this section is executed by the Sequence\n *\n * @returns {Promise<void>}\n * @protected\n */\n async run() {}\n\n /**\n * Method overwritten by inheriting classes, which is called when this section is serialized by the Sequence\n *\n * @returns {object}\n * @private\n */\n async _serialize() {\n return {\n async: this._async,\n delay: [this._delayMin, this._delayMax],\n waitUntilFinished: this._waitUntilFinished,\n waitUntilFinishedDelay: this._waitUntilFinishedDelay,\n repetitions: this._repetitions,\n repetitionsDelay: [this._repeatDelayMin, this._repeatDelayMax],\n };\n }\n\n _deserialize(data) {\n this._async = data.async;\n this._waitUntilFinished = data.waitUntilFinished;\n this._waitUntilFinishedDelay = data.waitUntilFinishedDelay;\n this._repetitions = data.repetitions;\n this._repeatDelayMin = data.repetitionsDelay[0];\n this._repeatDelayMax = data.repetitionsDelay[1];\n return this;\n }\n\n /**\n * Method overwritten by inheriting classes, which stores data or prepares data before the Sequence executes it (see EffectsSection)\n *\n * @protected\n */\n async _initialize() {}\n\n /**\n * Method overwritten by inheriting classes. Inheriting classes uses the following to apply traits to themselves:\n * - Object.assign(this.constructor.prototype, trait)\n *\n * @protected\n */\n _applyTraits() {}\n\n /**\n * Causes the section to be repeated n amount of times, with an optional delay. If given inRepeatDelayMin\n * and inRepeatDelayMax, a random repetition delay will be picked for every repetition\n *\n * @param {number} inRepetitions\n * @param {number} inRepeatDelayMin\n * @param {number} inRepeatDelayMax\n * @returns {Section} this\n */\n repeats(inRepetitions, inRepeatDelayMin = 0, inRepeatDelayMax) {\n if (!lib.is_real_number(inRepetitions))\n throw this.sequence._customError(\n this,\n \"repeats\",\n \"inRepetitions must be of type number\"\n );\n if (!lib.is_real_number(inRepeatDelayMin))\n throw this.sequence._customError(\n this,\n \"repeats\",\n \"repeatDelayMin must be of type number\"\n );\n if (inRepeatDelayMax && !lib.is_real_number(inRepeatDelayMax)) {\n throw this.sequence._customError(\n this,\n \"repeats\",\n \"repeatDelayMax must be of type number\"\n );\n }\n this._repetitions = inRepetitions;\n this._repeatDelayMin = Math.min(\n inRepeatDelayMin,\n inRepeatDelayMax ?? inRepeatDelayMin\n );\n this._repeatDelayMax = Math.max(\n inRepeatDelayMin,\n inRepeatDelayMax ?? inRepeatDelayMin\n );\n return this;\n }\n\n /**\n * Causes the effect or sound to not play, and skip all delays, repetitions, waits, etc. If you pass a function,\n * the function should return something false-y if you do not want the effect or sound to play.\n *\n * @param {boolean|function} inCondition\n * @returns {Section} this\n */\n playIf(inCondition) {\n this._playIf = inCondition;\n return this;\n }\n\n /**\n * Causes the section to finish running before starting the next section.\n *\n * @param {number|boolean} [minDelay=0] minDelay\n * @param {number/null} [maxDelay=null] maxDelay\n * @returns {Section} this\n */\n waitUntilFinished(minDelay = 0, maxDelay = null) {\n if (minDelay === false) return this;\n if (!lib.is_real_number(minDelay))\n throw this.sequence._customError(\n this,\n \"waitUntilFinished\",\n \"minDelay must be of type number\"\n );\n if (maxDelay !== null && !lib.is_real_number(maxDelay))\n throw this.sequence._customError(\n this,\n \"waitUntilFinished\",\n \"maxDelay must be of type number\"\n );\n this._waitUntilFinished = true;\n this._waitUntilFinishedDelay = [\n Math.min(minDelay, maxDelay ?? minDelay),\n Math.max(minDelay, maxDelay ?? minDelay),\n ];\n return this;\n }\n\n /**\n * Causes each effect or sound to finish playing before the next one starts playing. This differs from\n * .waitUntilFinished() in the sense that this is for each repetition, whilst .waitUntilFinished() is\n * for the entire section.\n *\n * @returns {Section} this\n */\n async() {\n this._async = true;\n return this;\n }\n\n /**\n * Delays the effect or sound from being played for a set amount of milliseconds. If given a second number, a\n * random delay between the two numbers will be generated.\n *\n * @param {number} [msMin=1] minMs\n * @param {number} [msMax=1] maxMs\n * @returns {Section} this\n */\n delay(msMin, msMax) {\n if (!lib.is_real_number(msMin))\n throw this.sequence._customError(\n this,\n \"delay\",\n \"msMin must be of type number\"\n );\n if (msMax && !lib.is_real_number(msMax))\n throw this.sequence._customError(\n this,\n \"delay\",\n \"msMax must be of type number\"\n );\n this._delayMin = Math.min(msMin, msMax ?? msMin);\n this._delayMax = Math.max(msMin, msMax ?? msMin);\n return this;\n }\n\n /**\n * Overrides the duration of this section\n *\n * @param {number} inDuration\n * @returns {Section} this\n */\n duration(inDuration) {\n if (!lib.is_real_number(inDuration))\n throw this.sequence._customError(\n this,\n \"duration\",\n \"inDuration must be of type number\"\n );\n this._duration = inDuration;\n return this;\n }\n\n /**\n * Applies a preset to the current section\n *\n * @param {string} presetName\n * @param {*} args\n * @returns {Section|FunctionSection|EffectSection|AnimationSection|SoundSection}\n */\n preset(presetName, ...args) {\n if (typeof presetName !== \"string\") {\n throw this.sequence._customError(\n this,\n \"name\",\n `inName must be of type string`\n );\n }\n const preset = SequencerPresets.get(presetName);\n if (!preset) {\n lib.custom_warning(\n \"Sequencer\",\n `preset | Could not find preset with name \"${presetName}\"`\n );\n return this;\n }\n return preset(this, ...args);\n }\n\n /**\n * @protected\n */\n async _shouldPlay() {\n return lib.is_function(this._playIf) ? await this._playIf() : this._playIf;\n }\n\n /**\n * @protected\n */\n _validateLocation(inLocation) {\n inLocation = lib.validate_document(inLocation);\n if (typeof inLocation === \"string\") {\n inLocation = lib.get_object_from_scene(inLocation) ?? inLocation;\n }\n if (typeof inLocation === \"string\") {\n inLocation = lib.safe_str(inLocation);\n }\n return inLocation;\n }\n\n /**\n * @protected\n */\n async _execute() {\n if (!(await this._shouldPlay())) {\n this.sectionStatus = CONSTANTS.STATUS.SKIPPED;\n return;\n }\n this._basicDelay = lib.random_float_between(this._delayMin, this._delayMax);\n return new Promise(async (resolve) => {\n setTimeout(async () => {\n this.sectionStatus = CONSTANTS.STATUS.RUNNING;\n for (let i = 0; i < this._repetitions; i++) {\n if (get(this.sectionStatus) === CONSTANTS.STATUS.ABORTED) {\n resolve();\n return;\n }\n this._currentRepetition = i;\n this._repeatDelay =\n i !== this._repetitions - 1\n ? lib.random_float_between(\n this._repeatDelayMin,\n this._repeatDelayMax\n )\n : 0;\n await this.preRun();\n if (this._shouldAsync) {\n await this.run();\n } else {\n this.run();\n }\n if (this._repetitions > 1 && i !== this._repetitions - 1) {\n await this._delayBetweenRepetitions();\n }\n }\n resolve();\n }, this._basicDelay);\n }).then(() => {\n this.sectionStatus = CONSTANTS.STATUS.COMPLETE;\n });\n }\n\n set sectionStatus(inStatus) {\n this._sectionStatus.update((currentStatus) => {\n if (\n currentStatus === CONSTANTS.STATUS.READY ||\n (currentStatus === CONSTANTS.STATUS.RUNNING &&\n inStatus !== CONSTANTS.STATUS.ABORTED)\n ) {\n return inStatus;\n }\n return currentStatus;\n });\n }\n\n get sectionStatus() {\n return this._sectionStatus;\n }\n\n _abortSection() {\n this.sectionStatus = CONSTANTS.STATUS.ABORTED;\n }\n\n /**\n * @protected\n */\n async _delayBetweenRepetitions() {\n let self = this;\n return new Promise((resolve) => {\n setTimeout(resolve, self._repeatDelay);\n });\n }\n}\n","import * as lib from \"../lib/lib.js\";\nimport Section from \"./section.js\";\n\nexport default class FunctionSection extends Section {\n constructor(inSequence, inFunc) {\n super(inSequence);\n if (!lib.is_function(inFunc))\n this._customError(\n \"create\",\n \"The given function needs to be an actual function\"\n );\n this._func = inFunc;\n this._waitUntilFinished = inFunc.constructor.name === \"AsyncFunction\";\n }\n\n static niceName = \"Function\";\n\n /**\n * @returns {Promise<void>}\n */\n async run() {\n lib.debug(\"Running function\");\n await this._func();\n }\n\n /**\n * @returns {Promise}\n * @private\n */\n async _execute() {\n await this.run();\n }\n}\n","import { is_real_number } from \"../../lib/lib.js\";\nimport { validateAnimation } from \"../../lib/canvas-lib.js\";\nimport * as canvaslib from \"../../lib/canvas-lib.js\";\n\nexport default {\n /**\n * Base properties\n */\n _animations: null,\n\n /**\n * Animates a property on the target of the animation.\n *\n * @param {string} inTarget\n * @param {string} inPropertyName\n * @param {object} inOptions\n * @param {Number} inOptions.from - a single number from which to animate\n * @param {Number} inOptions.to - a single number to which to animate\n * @param {Number} inOptions.duration - how long in ms the animation should take\n * @param {Number} inOptions.delay - inserts a delay in ms before the animation starts\n * @param {String} inOptions.ease - what type of easing the animation should use\n * @param {Boolean} inOptions.gridUnits - if animating width or height, this will set it to work in the scene's grid units\n * @param {Boolean} inOptions.fromEnd - makes this animation play from the end, like fadeOut, scaleOut, etc\n *\n * @returns this\n */\n animateProperty(inTarget, inPropertyName, inOptions = {}) {\n if (!this._animations) this._animations = [];\n\n const result = canvaslib.validateAnimation(\n inTarget,\n inPropertyName,\n inOptions\n );\n\n if (typeof result === \"string\") {\n throw this.sequence._customError(this, \"animateProperty\", result);\n }\n\n this._animations.push(result);\n\n return this;\n },\n\n /**\n * Loops a property between a set of values on the target\n *\n * @param {string} inTarget\n * @param {string} inPropertyName\n * @param {object} inOptions\n * @param {Number} inOptions.from - a single number from which to loop\n * @param {Number} inOptions.to - a single number to which to loop\n * @param {Number} inOptions.values - an array of values to loop between\n * @param {Number} inOptions.duration - how long in ms the loop should take\n * @param {Number} inOptions.loops - how many loops in total this animation should go through - if none are specified, the loop is indefinite\n * @param {Number} inOptions.delay - inserts a delay in ms before the animation starts\n * @param {String} inOptions.ease - what type of easing the animation should use\n * @param {Boolean} inOptions.pingPong - sets whether loop should interpolate to the first value after it reaches the first value, or simply set it to the first value\n * @param {Boolean} inOptions.gridUnits - if animating width or height, this will set it to work in the scene's grid units\n *\n * @returns this\n */\n loopProperty(inTarget, inPropertyName, inOptions = {}) {\n if (!this._animations) this._animations = [];\n\n const result = canvaslib.validateLoopingAnimation(\n inTarget,\n inPropertyName,\n inOptions\n );\n\n if (typeof result === \"string\") {\n throw this.sequence._customError(this, \"loopProperty\", result);\n }\n\n this._animations.push(result);\n\n return this;\n },\n};\n","import { is_real_number } from \"../../lib/lib.js\";\n\nexport default {\n /**\n * Base properties\n */\n _volume: null,\n _fadeInAudio: null,\n _fadeOutAudio: null,\n\n /**\n * Sets the volume of the sound.\n *\n * @param {number} inVolume\n * @returns this\n */\n volume(inVolume) {\n if (!is_real_number(inVolume))\n throw this.sequence._customError(\n this,\n \"volume\",\n \"inVolume must be of type number\"\n );\n this._volume = Math.max(0, Math.min(1.0, inVolume));\n return this;\n },\n\n /**\n * Causes the animated section to fade in its audio (if any) when played\n *\n * @param {number} duration How long the fade should be\n * @param {object} [options] Additional options, such as easing and delay\n * @returns this\n */\n fadeInAudio(duration, options = {}) {\n if (typeof options !== \"object\")\n throw this.sequence._customError(\n this,\n \"fadeInAudio\",\n \"options must be of type object\"\n );\n options = foundry.utils.mergeObject(\n {\n ease: \"linear\",\n delay: 0,\n },\n options\n );\n if (!is_real_number(duration))\n throw this.sequence._customError(\n this,\n \"fadeInAudio\",\n \"duration must be of type number\"\n );\n if (typeof options.ease !== \"string\")\n throw this.sequence._customError(\n this,\n \"fadeInAudio\",\n \"options.ease must be of type string\"\n );\n if (!is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"fadeInAudio\",\n \"options.delay must be of type number\"\n );\n this._fadeInAudio = {\n duration: duration,\n ease: options.ease,\n delay: options.delay,\n };\n return this;\n },\n\n /**\n * Causes the audio to fade out at the end of the animated section's duration\n *\n * @param {number} duration How long the fade should be\n * @param {object} [options] Additional options, such as easing and delay\n * @returns this\n */\n fadeOutAudio(duration, options = {}) {\n if (typeof options !== \"object\")\n throw this.sequence._customError(\n this,\n \"fadeOutAudio\",\n \"options must be of type object\"\n );\n options = foundry.utils.mergeObject(\n {\n ease: \"linear\",\n delay: 0,\n },\n options\n );\n if (!is_real_number(duration))\n throw this.sequence._customError(\n this,\n \"fadeOutAudio\",\n \"duration must be of type number\"\n );\n if (typeof options.ease !== \"string\")\n throw this.sequence._customError(\n this,\n \"fadeOutAudio\",\n \"ease must be of type string\"\n );\n if (!is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"fadeOutAudio\",\n \"delay must be of type number\"\n );\n this._fadeOutAudio = {\n duration: duration,\n ease: options.ease,\n delay: options.delay,\n };\n return this;\n },\n};\n","import * as lib from \"../../lib/lib.js\";\nimport { SequencerFileRangeFind } from \"../../modules/sequencer-file.js\";\n\nexport default {\n /**\n * Base properties\n */\n _file: \"\",\n _fileOptions: false,\n _baseFolder: \"\",\n _mustache: null,\n\n /**\n * Declares which file to be played. This may also be an array of paths, which will be randomly picked from each\n * time the section is played.\n *\n * @param {string|array} inFile\n * @returns this\n */\n file(inFile) {\n this._file = inFile;\n return this;\n },\n\n /**\n * Defines the base folder that will prepend to the file path. This is mainly just useful to make the file\n * path easier to manage.\n *\n * @param {string} inBaseFolder\n * @returns this\n */\n baseFolder(inBaseFolder) {\n if (typeof inBaseFolder !== \"string\")\n throw this.sequence._customError(\n this,\n \"baseFolder\",\n \"inBaseFolder must be of type string\"\n );\n this._baseFolder = inBaseFolder + (inBaseFolder.endsWith(\"/\") ? \"\" : \"/\");\n return this;\n },\n\n /**\n * Sets the Mustache of the filepath. This is applied after the randomization of the filepath, if available.\n *\n * @param {object} inMustache\n * @returns this\n */\n setMustache(inMustache) {\n if (typeof inMustache !== \"object\")\n throw this.sequence._customError(\n this,\n \"setMustache\",\n \"inMustache must be of type object\"\n );\n this._mustache = inMustache;\n return this;\n },\n\n async _determineFile(inFile) {\n if (!Array.isArray(inFile) && typeof inFile === \"object\") {\n return this._validateCustomRange(inFile);\n }\n\n if (Array.isArray(inFile))\n inFile = lib.random_array_element(inFile, { recurse: true });\n\n inFile = this._applyMustache(inFile);\n\n if (Sequencer.Database.entryExists(inFile)) {\n return this._determineDatabaseFile(inFile);\n }\n\n const determinedFile = await this._processFile(inFile);\n\n return { file: determinedFile, forcedIndex: false, customRange: false };\n },\n\n async _processFile(inFile) {\n inFile = this._applyMustache(inFile);\n inFile = this._applyBaseFolder(inFile);\n inFile = await this._applyWildcard(inFile);\n if (Array.isArray(inFile))\n inFile = lib.random_array_element(inFile, { recurse: true });\n return inFile;\n },\n\n async _validateCustomRange(inFile) {\n const finalFiles = {};\n const validRanges = Object.keys(SequencerFileRangeFind.ftToDistanceMap);\n for (const [range, rangeFile] of Object.entries(inFile)) {\n if (!validRanges.includes(range)) {\n throw this.sequence._customError(\n this,\n \"file\",\n `a file-distance key map must only contain the following keys: ${validRanges.join(\n \", \"\n )}`\n );\n }\n finalFiles[range] = await this._processFile(rangeFile);\n }\n\n return { file: finalFiles, forcedIndex: false, customRange: true };\n },\n\n _determineDatabaseFile(inFile) {\n const entries = Sequencer.Database.getEntry(inFile);\n const entry = Array.isArray(entries)\n ? lib.random_array_element(entries)\n : entries;\n const match = inFile.match(/(\\d)+$/);\n return {\n file: entry,\n forcedIndex: match ? Number(match[1]) : false,\n customRange: false,\n };\n },\n\n _applyBaseFolder(inFile) {\n if (Array.isArray(inFile))\n return inFile.map((file) => this._applyBaseFolder(file));\n return inFile.startsWith(this._baseFolder)\n ? inFile\n : this._baseFolder + inFile;\n },\n\n _applyMustache(inFile) {\n if (!this._mustache) return inFile;\n let template = Handlebars.compile(inFile);\n return template(this._mustache);\n },\n\n async _applyWildcard(inFile) {\n if (!inFile.includes(\"*\")) return inFile;\n if (Array.isArray(inFile))\n return inFile.map(async (file) => await this._applyWildcard(file));\n inFile = this._applyBaseFolder(inFile);\n return lib.getFiles(inFile, {\n applyWildCard: true,\n softFail: this.sequence.softFail,\n });\n },\n};\n","import { is_real_number } from \"../../lib/lib.js\";\nimport * as canvaslib from \"../../lib/canvas-lib.js\";\n\nexport default {\n /**\n * Base properties\n */\n _moveTowards: null,\n _moveSpeed: null,\n\n /**\n * Sets the location to move the target object to\n *\n * @param {object|string} inTarget\n * @param {object} options\n * @returns this\n */\n moveTowards(inTarget, options = {}) {\n options = foundry.utils.mergeObject(\n {\n ease: \"linear\",\n delay: 0,\n rotate: true,\n cacheLocation: false,\n },\n options\n );\n if (typeof options.ease !== \"string\")\n throw this.sequence._customError(\n this,\n \"moveTowards\",\n \"options.ease must be of type string\"\n );\n if (!is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"moveTowards\",\n \"options.delay must be of type number\"\n );\n if (typeof options.rotate !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"moveTowards\",\n \"options.rotate must be of type boolean\"\n );\n if (typeof options.cacheLocation !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"moveTowards\",\n \"options.cacheLocation must be of type boolean\"\n );\n options.target = this._validateLocation(inTarget);\n if (!options.target)\n throw this.sequence._customError(\n this,\n \"moveTowards\",\n \"could not find position of given object\"\n );\n options.target = options.cacheLocation\n ? canvaslib.get_object_position(options.cacheLocation, { measure: true })\n : options.target;\n this._moveTowards = options;\n return this;\n },\n\n /**\n * Sets the speed (pixels per frame) to move the target object\n *\n * @param {number} inSpeed\n * @returns this\n */\n moveSpeed(inSpeed) {\n if (!is_real_number(inSpeed))\n throw this.sequence._customError(\n this,\n \"moveSpeed\",\n \"inSpeed must be of type number\"\n );\n this._moveSpeed = inSpeed;\n return this;\n },\n};\n","import { is_real_number } from \"../../lib/lib.js\";\n\nexport default {\n /**\n * Base properties\n */\n _opacity: null,\n _fadeIn: null,\n _fadeOut: null,\n\n /**\n * Sets the opacity of the effect. If used with ._fadeIn() and/or ._fadeOut(), this defines what the effect will fade to/from\n *\n * @param {number} inOpacity\n * @returns this\n */\n opacity(inOpacity) {\n if (!is_real_number(inOpacity))\n throw this.sequence._customError(\n this,\n \"opacity\",\n \"inOpacity must be of type number\"\n );\n this._opacity = inOpacity;\n return this;\n },\n\n /**\n * Causes the effect to fade in when played\n *\n * @param {number} duration How long the fade should be\n * @param {object} [options] Additional options, such as easing and delay\n * @returns this\n */\n fadeIn(duration, options = {}) {\n if (typeof options !== \"object\")\n throw this.sequence._customError(\n this,\n \"fadeIn\",\n \"options must be of type object\"\n );\n options = foundry.utils.mergeObject(\n {\n ease: \"linear\",\n delay: 0,\n },\n options\n );\n if (!is_real_number(duration))\n throw this.sequence._customError(\n this,\n \"fadeIn\",\n \"duration must be of type number\"\n );\n if (typeof options.ease !== \"string\")\n throw this.sequence._customError(\n this,\n \"fadeIn\",\n \"options.ease must be of type string\"\n );\n if (!is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"fadeIn\",\n \"options.delay must be of type number\"\n );\n this._fadeIn = {\n duration: duration,\n ease: options.ease,\n delay: options.delay,\n };\n return this;\n },\n\n /**\n * Causes the effect to fade out at the end of the effect's duration\n *\n * @param {number} duration How long the fade should be\n * @param {object} [options] Additional options, such as easing and delay\n * @returns this\n */\n fadeOut(duration, options = {}) {\n if (typeof options !== \"object\")\n throw this.sequence._customError(\n this,\n \"fadeOut\",\n \"options must be of type object\"\n );\n options = foundry.utils.mergeObject(\n {\n ease: \"linear\",\n delay: 0,\n },\n options\n );\n if (!is_real_number(duration))\n throw this.sequence._customError(\n this,\n \"fadeOut\",\n \"duration must be of type number\"\n );\n if (typeof options.ease !== \"string\")\n throw this.sequence._customError(\n this,\n \"fadeOut\",\n \"ease must be of type string\"\n );\n if (!is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"fadeOut\",\n \"delay must be of type number\"\n );\n this._fadeOut = {\n duration: duration,\n ease: options.ease,\n delay: options.delay,\n };\n return this;\n },\n};\n","import { is_real_number } from \"../../lib/lib.js\";\n\nexport default {\n /**\n * Base properties\n */\n _angle: null,\n _rotateIn: null,\n _rotateOut: null,\n _randomRotation: null,\n _rotateTowards: null,\n\n /**\n * The object gets a random rotation, which means it should not be used with .stretchTo()\n *\n * @param {boolean} [inBool=true] inBool\n * @returns this\n */\n randomRotation(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"randomRotation\",\n \"inBool must be of type boolean\"\n );\n this._randomRotation = inBool;\n return this;\n },\n\n /**\n * Sets the rotation of the object, which is added on top of the calculated rotation after .rotateTowards() or .randomRotation()\n *\n * @param {number} inRotation\n * @returns this\n */\n rotate(inRotation) {\n if (!is_real_number(inRotation))\n throw this.sequence._customError(\n this,\n \"opacity\",\n \"inRotation must be of type number\"\n );\n this._angle = inRotation;\n return this;\n },\n\n /**\n * Causes the object to rotate when it starts playing\n *\n * @param {number} degrees\n * @param {number} duration\n * @param {object} [options] options\n * @returns this\n */\n rotateIn(degrees, duration, options = {}) {\n if (typeof options !== \"object\")\n throw this.sequence._customError(\n this,\n \"rotateIn\",\n \"options must be of type object\"\n );\n options = foundry.utils.mergeObject(\n {\n ease: \"linear\",\n delay: 0,\n },\n options\n );\n if (!is_real_number(degrees))\n throw this.sequence._customError(\n this,\n \"rotateOut\",\n \"degrees must be of type number\"\n );\n if (!is_real_number(duration))\n throw this.sequence._customError(\n this,\n \"rotateOut\",\n \"duration must be of type number\"\n );\n if (typeof options.ease !== \"string\")\n throw this.sequence._customError(\n this,\n \"rotateIn\",\n \"options.ease must be of type string\"\n );\n if (!is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"rotateIn\",\n \"options.delay must be of type number\"\n );\n this._rotateIn = {\n value: degrees,\n duration: duration,\n ease: options.ease,\n delay: options.delay,\n };\n return this;\n },\n\n /**\n * Causes the object to rotate at the end of the effect's duration\n *\n * @param {number} degrees\n * @param {number} duration\n * @param {object} [options] options\n * @returns this\n */\n rotateOut(degrees, duration, options = {}) {\n if (typeof options !== \"object\")\n throw this.sequence._customError(\n this,\n \"rotateOut\",\n \"options must be of type object\"\n );\n options = foundry.utils.mergeObject(\n {\n ease: \"linear\",\n delay: 0,\n },\n options\n );\n if (!is_real_number(degrees))\n throw this.sequence._customError(\n this,\n \"rotateOut\",\n \"degrees must be of type number\"\n );\n if (!is_real_number(duration))\n throw this.sequence._customError(\n this,\n \"rotateOut\",\n \"duration must be of type number\"\n );\n if (typeof options.ease !== \"string\")\n throw this.sequence._customError(\n this,\n \"rotateOut\",\n \"options.ease must be of type string\"\n );\n if (!is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"rotateOut\",\n \"options.delay must be of type number\"\n );\n this._rotateOut = {\n value: degrees,\n duration: duration,\n ease: options.ease,\n delay: options.delay,\n };\n return this;\n },\n};\n","import { is_real_number } from \"../../lib/lib.js\";\n\nexport default {\n _scaleMin: null,\n _scaleMax: null,\n _scaleIn: null,\n _scaleOut: null,\n\n /**\n * A method that can take the following:\n * - A number to set the scale uniformly\n * - An object with x and y for non-uniform scaling\n * - Two numbers which the Sequencer will randomly pick a uniform scale between\n *\n * @param {number|object} inScaleMin\n * @param {number} [inScaleMax] inScaleMax\n * @returns this\n */\n scale(inScaleMin, inScaleMax) {\n if (!is_real_number(inScaleMin) && typeof inScaleMin !== \"object\")\n throw this.sequence._customError(\n this,\n \"scale\",\n \"inScale must be of type number or object\"\n );\n if (is_real_number(inScaleMin)) {\n if (inScaleMax && !is_real_number(inScaleMax)) {\n throw this.sequence._customError(\n this,\n \"scale\",\n \"if inScaleMin is a number, inScaleMax must also be of type number\"\n );\n }\n }\n this._scaleMin = inScaleMin;\n this._scaleMax = inScaleMax ?? false;\n return this;\n },\n\n /**\n * Causes the effect to scale when it starts playing\n *\n * @param {number|object} scale\n * @param {number} duration\n * @param {object} [options] options\n * @returns this\n */\n scaleIn(scale, duration, options = {}) {\n if (typeof options !== \"object\")\n throw this.sequence._customError(\n this,\n \"scaleIn\",\n \"options must be of type object\"\n );\n options = foundry.utils.mergeObject(\n {\n ease: \"linear\",\n delay: 0,\n },\n options\n );\n if (!is_real_number(duration))\n throw this.sequence._customError(\n this,\n \"scaleIn\",\n \"duration must be of type number\"\n );\n if (!is_real_number(scale) && typeof scale !== \"object\")\n throw this.sequence._customError(\n this,\n \"scaleIn\",\n \"scale must be of type number or object\"\n );\n if (typeof options.ease !== \"string\")\n throw this.sequence._customError(\n this,\n \"scaleIn\",\n \"options.ease must be of type string\"\n );\n if (!is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"scaleIn\",\n \"options.delay must be of type number\"\n );\n this._scaleIn = {\n value: scale,\n duration: duration,\n ease: options.ease,\n delay: options.delay,\n };\n return this;\n },\n\n /**\n * Causes the effect to scale at the end of the effect's duration\n *\n * @param {number|object} scale\n * @param {number} duration\n * @param {object} [options] options\n * @returns this\n */\n scaleOut(scale, duration, options = {}) {\n if (typeof options !== \"object\")\n throw this.sequence._customError(\n this,\n \"scaleOut\",\n \"options must be of type object\"\n );\n options = foundry.utils.mergeObject(\n {\n ease: \"linear\",\n delay: 0,\n },\n options\n );\n if (!is_real_number(duration))\n throw this.sequence._customError(\n this,\n \"scaleOut\",\n \"duration must be of type number\"\n );\n if (!is_real_number(scale) && typeof scale !== \"object\")\n throw this.sequence._customError(\n this,\n \"scaleOut\",\n \"scale must be of type number or object\"\n );\n if (typeof options.ease !== \"string\")\n throw this.sequence._customError(\n this,\n \"scaleOut\",\n \"options.ease must be of type string\"\n );\n if (!is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"scaleOut\",\n \"options.delay must be of type number\"\n );\n this._scaleOut = {\n value: scale,\n duration: duration,\n ease: options.ease,\n delay: options.delay,\n };\n return this;\n },\n};\n","import { is_real_number } from \"../../lib/lib.js\";\n\nexport default {\n _hasTime: true,\n _isRange: false,\n _startTime: null,\n _startPerc: null,\n _endTime: null,\n _endPerc: null,\n\n /**\n * Sets the start and end time of the section, playing only that range\n *\n * @param {number} inMsStart\n * @param {number} inMsEnd\n * @returns this\n */\n timeRange(inMsStart, inMsEnd) {\n if (!is_real_number(inMsStart))\n throw this.sequence._customError(\n this,\n \"timeRange\",\n \"inMsStart must be of type number\"\n );\n if (!is_real_number(inMsEnd))\n throw this.sequence._customError(\n this,\n \"timeRange\",\n \"inMsEnd must be of type number\"\n );\n this._startTime = inMsStart;\n this._endTime = inMsEnd;\n this._isRange = true;\n return this;\n },\n\n /**\n * Sets the start time of the section.\n *\n * @param {number} inMs\n * @returns this\n */\n startTime(inMs) {\n if (!is_real_number(inMs))\n throw this.sequence._customError(\n this,\n \"startTime\",\n \"inMs must be of type number\"\n );\n this._startTime = inMs;\n this._startPerc = false;\n this._isRange = false;\n return this;\n },\n\n /**\n * Sets the start time of the section based on a percentage from its total duration.\n *\n * @param {number} inPercentage\n * @returns this\n */\n startTimePerc(inPercentage) {\n if (!is_real_number(inPercentage))\n throw this.sequence._customError(\n this,\n \"startTimePerc\",\n \"inPercentage must be of type number\"\n );\n this._startTime = inPercentage;\n this._startPerc = true;\n this._isRange = false;\n return this;\n },\n\n /**\n * Sets the ending time of the section (from the end).\n *\n * @param {number} inMs\n * @returns this\n */\n endTime(inMs) {\n if (!is_real_number(inMs))\n throw this.sequence._customError(\n this,\n \"endTime\",\n \"inMs must be of type number\"\n );\n this._endTime = inMs;\n this._endPerc = false;\n this._isRange = false;\n return this;\n },\n\n /**\n * Sets the ending time of the section based on a percentage from the total duration.\n *\n * @param {number} inPercentage\n * @returns this\n */\n endTimePerc(inPercentage) {\n if (!is_real_number(inPercentage))\n throw this.sequence._customError(\n this,\n \"endTimePerc\",\n \"inPercentage must be of type number\"\n );\n this._endTime = inPercentage;\n this._endPerc = true;\n this._isRange = false;\n return this;\n },\n};\n","export default {\n _users: null,\n\n _addUser(inUser) {\n if (!this._users) this._users = [];\n if (typeof inUser !== \"string\")\n throw this.sequence._customError(\n this,\n \"_addUser\",\n \"inUser must be of type string\"\n );\n if (!game.users.has(inUser)) {\n if (game.users.getName(inUser)) {\n inUser = game.users.getName(inUser).id;\n } else {\n throw this.sequence._customError(\n this,\n \"_addUser\",\n `user with id or name \"${inUser}\" does not exist!`\n );\n }\n }\n\n if (!this._users.includes(inUser)) this._users.push(inUser);\n },\n\n _deleteUser(inUser) {\n if (!this._users) this._users = [];\n if (this._users.includes(inUser)) {\n let index = this._users.indexOf(inUser);\n this._users.splice(index, 1);\n }\n },\n\n /**\n * Causes section to be executed only locally, and not push to other connected clients.\n *\n * @param {boolean} inLocally\n * @returns this\n */\n locally(inLocally = true) {\n if (inLocally) this._addUser(game.userId);\n else this._deleteUser(game.userId);\n return this;\n },\n\n /**\n * Causes the section to be executed for only a set of users.\n *\n * @param {string|User|array<string|User>} inUsers\n * @returns this\n */\n forUsers(inUsers) {\n if (!Array.isArray(inUsers)) {\n if (typeof inUsers !== \"string\")\n throw this.sequence._customError(\n this,\n \"forUsers\",\n \"inUser must be of type string\"\n );\n inUsers = [inUsers];\n }\n inUsers.forEach((u) => this._addUser(u));\n return this;\n },\n};\n","import filters from \"../../lib/filters.js\";\n\nexport default {\n _filters: null,\n\n _addFilter(inFilterName, inData, inName = false) {\n if (!this._filters) this._filters = [];\n this._filters.push({\n className: inFilterName,\n name: inName,\n data: inData,\n });\n },\n\n _testFilter(inFilterName, inData) {\n let filter = new filters[inFilterName](inData);\n if (!filter.isValid)\n throw this.sequence._customError(\n this,\n \"filter\",\n `Could not create ${inFilterName} filter - data is malformed!`\n );\n },\n\n filter(inFilterName, inData = {}, inName = \"\") {\n if (typeof inFilterName !== \"string\")\n throw this.sequence._customError(\n this,\n \"filter\",\n `inFilterName must be of type string`\n );\n if (!Object.keys(filters).includes(inFilterName))\n throw this.sequence._customError(\n this,\n \"filter\",\n `\"${inFilterName}\" does not exist`\n );\n this._testFilter(inFilterName, inData);\n this._addFilter(inFilterName, inData, inName);\n return this;\n },\n};\n","import * as lib from \"../../lib/lib.js\";\nimport { is_real_number } from \"../../lib/lib.js\";\n\nexport default {\n _tint: null,\n\n /**\n * Tints the target of this section by the color given to the\n *\n * @param {number|string} inColor\n * @returns this\n */\n tint(inColor) {\n if (!is_real_number(inColor) && typeof inColor !== \"string\")\n throw this.sequence._customError(\n this,\n \"tint\",\n `inColor must be of type string (hexadecimal) or number (decimal)!`\n );\n this._tint = lib.parseColor(inColor);\n return this;\n },\n};\n","import * as lib from \"../../lib/lib.js\";\nimport * as canvaslib from \"../../lib/canvas-lib.js\";\n\nexport default {\n /**\n * Base properties\n */\n _source: null,\n\n /**\n * A smart method that can take a reference to an object, or a direct on the canvas to play the effect at,\n * or a string reference (see .name())\n *\n * @param {Object|String} inLocation\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n atLocation(inLocation, inOptions = {}) {\n if (!(typeof inLocation === \"object\" || typeof inLocation === \"string\")) {\n throw this.sequence._customError(\n this,\n \"atLocation\",\n `inLocation is invalid, and must be of type of object, string, placeable object, or document`\n );\n }\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"atLocation\",\n `inOptions must be of type object`\n );\n inOptions = foundry.utils.mergeObject(\n {\n cacheLocation: false,\n offset: false,\n randomOffset: false,\n gridUnits: false,\n local: false,\n },\n inOptions\n );\n inLocation = this._validateLocation(inLocation);\n if (inLocation === undefined)\n throw this.sequence._customError(\n this,\n \"atLocation\",\n \"could not find position of given object\"\n );\n if (typeof inOptions.cacheLocation !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"atLocation\",\n \"inOptions.cacheLocation must be of type boolean\"\n );\n if (\n !(\n typeof inOptions.randomOffset === \"boolean\" ||\n lib.is_real_number(inOptions.randomOffset)\n )\n )\n throw this.sequence._customError(\n this,\n \"atLocation\",\n \"inOptions.randomOffset must be of type boolean or number\"\n );\n\n this._temporaryEffect =\n this._temporaryEffect ||\n (inLocation instanceof foundry.abstract.Document\n ? !lib.is_UUID(inLocation?.uuid)\n : false);\n\n if (inOptions.offset) {\n const offsetData = this._validateOffset(\n \"atLocation\",\n inOptions.offset,\n inOptions\n );\n this._offset = {\n source: offsetData,\n target: this._offset?.target ?? false,\n };\n }\n\n this._randomOffset = {\n source: inOptions.randomOffset,\n target: this._randomOffset?.target ?? false,\n };\n\n this._source =\n inOptions.cacheLocation && typeof inLocation !== \"string\"\n ? canvaslib.get_object_canvas_data(inLocation)\n : inLocation;\n return this;\n },\n};\n","import * as lib from \"../../lib/lib.js\";\n\nexport default {\n _offset: null,\n _randomOffset: null,\n\n _validateOffset(functionName, inOffset, inOptions = {}) {\n inOffset = foundry.utils.mergeObject(\n {\n x: 0,\n y: 0,\n },\n inOffset\n );\n inOptions = foundry.utils.mergeObject(\n {\n gridUnits: false,\n local: false,\n },\n inOptions\n );\n if (typeof inOptions.gridUnits !== \"boolean\")\n throw this.sequence._customError(\n this,\n functionName,\n \"inOptions.gridUnits must be of type boolean\"\n );\n if (typeof inOptions.local !== \"boolean\")\n throw this.sequence._customError(\n this,\n functionName,\n \"inOptions.local must be of type boolean\"\n );\n if (!lib.is_real_number(inOffset.x))\n throw this.sequence._customError(\n this,\n functionName,\n `inOffset.x must be of type number!`\n );\n if (!lib.is_real_number(inOffset.y))\n throw this.sequence._customError(\n this,\n functionName,\n `inOffset.y must be of type number!`\n );\n return {\n ...inOffset,\n ...inOptions,\n };\n },\n};\n","export default {\n _text: null,\n\n /**\n * Creates a text element, attached to the sprite. The options for the text are available here:\n * https://pixijs.io/pixi-text-style/\n *\n * @param {String} inText\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n text(inText, inOptions = {}) {\n if (typeof inText !== \"string\")\n throw this.sequence._customError(\n this,\n \"text\",\n \"inText must be of type string\"\n );\n this._text = foundry.utils.mergeObject(\n {\n text: inText,\n },\n inOptions\n );\n return this;\n },\n};\n","import animation from \"./animation.js\";\nimport audio from \"./audio.js\";\nimport files from \"./files.js\";\nimport moves from \"./moves.js\";\nimport opacity from \"./opacity.js\";\nimport rotation from \"./rotation.js\";\nimport scale from \"./scale.js\";\nimport time from \"./time.js\";\nimport users from \"./users.js\";\nimport filter from \"./filter.js\";\nimport tint from \"./tint.js\";\nimport location from \"./location.js\";\nimport offset from \"./offset.js\";\nimport text from \"./text.js\";\n\nexport default {\n animation,\n audio,\n files,\n moves,\n opacity,\n rotation,\n scale,\n time,\n users,\n filter,\n tint,\n location,\n offset,\n text,\n};\n","import * as lib from \"../lib/lib.js\";\nimport { is_real_number } from \"../lib/lib.js\";\nimport * as canvaslib from \"../lib/canvas-lib.js\";\nimport Section from \"./section.js\";\nimport traits from \"./traits/_traits.js\";\nimport CanvasEffect from \"../canvas-effects/canvas-effect.js\";\nimport flagManager from \"../utils/flag-manager.js\";\nimport SequencerFileCache from \"../modules/sequencer-file-cache.js\";\nimport CONSTANTS from \"../constants.js\";\n\nexport default class EffectSection extends Section {\n constructor(inSequence, inFile = \"\") {\n super(inSequence);\n this._deserializedData = null;\n this._file = inFile;\n this._text = null;\n this._source = null;\n this._stretchTo = null;\n this._attachTo = null;\n this._from = null;\n this._origin = null;\n this._anchor = null;\n this._spriteAnchor = null;\n this._randomOffset = null;\n this._missed = null;\n this._private = null;\n this._randomMirrorX = null;\n this._randomMirrorY = null;\n this._mirrorX = null;\n this._mirrorY = null;\n this._playbackRate = null;\n this._template = null;\n this._overrides = [];\n this._name = null;\n this._zIndex = null;\n this._offset = null;\n this._spriteOffset = null;\n this._size = null;\n this._persist = null;\n this._persistOptions = null;\n this._zeroSpriteRotation = null;\n this._extraEndDuration = null;\n this._noLoop = null;\n this._tilingTexture = null;\n this._snapToGrid = null;\n this._scaleToObject = null;\n this._screenSpace = null;\n this._screenSpaceAboveUI = null;\n this._screenSpaceAnchor = null;\n this._screenSpacePosition = null;\n this._screenSpaceScale = null;\n this._elevation = null;\n this._masks = [];\n this._tiedDocuments = [];\n this._selfMask = false;\n this._temporaryEffect = false;\n this._spriteRotation = 0;\n this._randomSpriteRotation = false;\n this._isRangedEffect = null;\n this._offsetLegacy = null;\n this._randomOffsetLegacy = null;\n this._aboveLighting = null;\n this._aboveInterface = null;\n this._spriteScaleMin = 1.0;\n this._spriteScaleMax = null;\n this._isometric = null;\n this._shapes = [];\n this._xray = null;\n this._playEffect = true;\n }\n\n static niceName = \"Effect\";\n\n /**\n * @private\n */\n get _target() {\n return this._stretchTo || this._rotateTowards || this._moveTowards || false;\n }\n\n static debounceWarning() {\n lib.custom_warning(\n \"Sequencer\",\n \"Effect | This user does not have permissions to play effects. This can be configured in Sequencer's module settings.\"\n );\n }\n\n /**\n * Causes the effect's position to be stored and can then be used with .atLocation(), .stretchTowards(),\n * and .rotateTowards() to refer to previous effects' locations\n *\n * @param {String} inName\n * @returns {EffectSection}\n */\n name(inName) {\n if (typeof inName !== \"string\")\n throw this.sequence._customError(\n this,\n \"name\",\n \"inName must be of type string\"\n );\n this._name = lib.safe_str(inName);\n return this;\n }\n\n /**\n * Causes the effect to persist indefinitely on the canvas until _ended via SequencerEffectManager.endAllEffects() or\n * name the effect with .name() and then end it through SequencerEffectManager.endEffect()\n *\n * @param {Boolean} [inBool=true] inBool\n * @param {Object} [inOptions={}] inOptions\n * @returns {EffectSection}\n */\n persist(inBool = true, inOptions = {}) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"persist\",\n \"inBool must be of type boolean\"\n );\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"persist\",\n `inOptions must be of type object`\n );\n inOptions = foundry.utils.mergeObject(\n {\n id: randomID(),\n persistTokenPrototype: false,\n },\n inOptions\n );\n if (typeof inOptions.persistTokenPrototype !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"persist\",\n \"inOptions.persistTokenPrototype must be of type boolean\"\n );\n this._persist = inBool;\n this._persistOptions = inOptions;\n return this;\n }\n\n /**\n * Causes the effect to become temporary, which means it will not be stored in the flags of any object,\n * even if it .persist() is called\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n temporary(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"temporary\",\n \"inBool must be of type boolean\"\n );\n this._temporaryEffect = inBool || this._temporaryEffect;\n return this;\n }\n\n /**\n * Sets the effect's playback rate. A playback rate of 2.0 would make it play 2x as fast, 0.5 would make\n * it play half as fast.\n *\n * @param {Number} inNumber\n * @returns {EffectSection}\n */\n playbackRate(inNumber = 1.0) {\n if (!lib.is_real_number(inNumber))\n throw this.sequence._customError(\n this,\n \"playbackRate\",\n \"inNumber must be of type number\"\n );\n this._playbackRate = inNumber;\n return this;\n }\n\n /**\n * Causes the effect to target a location close to the .stretchTowards() location, but not on it.\n *\n * @param {Boolean} [inBool=true] inBool\n * @returns {EffectSection}\n */\n missed(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"missed\",\n \"inBool must be of type boolean\"\n );\n this._missed = inBool;\n return this;\n }\n\n /**\n * Adds a function that will run at the end of the effect serialization step, but before it is played. Allows direct\n * modifications of effect's data. For example, it could be manipulated to change which file will be used based\n * on the distance to the target.\n *\n * @param {Function} inFunc\n * @returns {EffectSection}\n */\n addOverride(inFunc) {\n if (!lib.is_function(inFunc))\n throw this.sequence._customError(\n this,\n \"addOverride\",\n \"The given function needs to be an actual function.\"\n );\n this._overrides.push(inFunc);\n return this;\n }\n\n /**\n * A smart method that can take a reference to an object, or a direct on the canvas to attach an effect to,\n * or a string reference (see .name())\n *\n * @param {Object|String} inObject\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n attachTo(inObject, inOptions = {}) {\n if (!(typeof inObject === \"object\" || typeof inObject === \"string\")) {\n throw this.sequence._customError(\n this,\n \"attachTo\",\n `inObject is invalid, and must be of type of object, string, placeable object, or document`\n );\n }\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"attachTo\",\n `inOptions must be of type object`\n );\n inOptions = foundry.utils.mergeObject(\n {\n align: \"center\",\n edge: \"on\",\n bindVisibility: true,\n bindAlpha: true,\n bindElevation: true,\n followRotation: true,\n offset: false,\n randomOffset: false,\n gridUnits: false,\n local: false,\n },\n inOptions\n );\n\n const validatedObject = this._validateLocation(inObject);\n if (validatedObject === undefined)\n throw this.sequence._customError(\n this,\n \"attachTo\",\n \"could not find given object\"\n );\n\n let isValidObject = true;\n if (typeof inObject === \"string\") {\n isValidObject =\n validatedObject instanceof Token ||\n validatedObject instanceof TokenDocument ||\n validatedObject instanceof Tile ||\n validatedObject instanceof TileDocument ||\n validatedObject instanceof Drawing ||\n validatedObject instanceof DrawingDocument ||\n validatedObject instanceof MeasuredTemplate ||\n validatedObject instanceof MeasuredTemplateDocument ||\n validatedObject instanceof CanvasEffect;\n if (!isValidObject) {\n this.sequence._showWarning(\n this,\n \"attachTo\",\n \"Only Tokens, Tiles, Drawings, and MeasuredTemplates may have attached effects - will play effect on target's location\"\n );\n }\n }\n\n const aligns = Object.keys(canvaslib.alignments);\n if (\n typeof inOptions.align !== \"string\" ||\n !aligns.includes(inOptions.align)\n ) {\n throw this.sequence._customError(\n this,\n \"attachTo\",\n `inOptions.align must be of type string, one of: ${aligns.join(\", \")}`\n );\n }\n if (\n typeof inOptions.edge !== \"string\" ||\n !(\n inOptions.edge === \"on\" ||\n inOptions.edge === \"inner\" ||\n inOptions.edge === \"outer\"\n )\n ) {\n throw this.sequence._customError(\n this,\n \"attachTo\",\n `inOptions.edge must of type string with the value of either \"on\", \"inner\", or \"outer\"`\n );\n }\n if (typeof inOptions.bindVisibility !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"attachTo\",\n `inOptions.bindVisibility must be of type boolean`\n );\n if (typeof inOptions.followRotation !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"attachTo\",\n `inOptions.followRotation must be of type boolean`\n );\n if (typeof inOptions.bindAlpha !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"attachTo\",\n \"inOptions.bindAlpha must be of type boolean\"\n );\n if (typeof inOptions.bindElevation !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"attachTo\",\n \"inOptions.bindElevation must be of type boolean\"\n );\n if (\n !(\n typeof inOptions.randomOffset === \"boolean\" ||\n lib.is_real_number(inOptions.randomOffset)\n )\n )\n throw this.sequence._customError(\n this,\n \"attachTo\",\n \"inOptions.randomOffset must be of type boolean or number\"\n );\n\n this._source = validatedObject;\n\n this._temporaryEffect =\n this._temporaryEffect ||\n (validatedObject instanceof foundry.abstract.Document ||\n validatedObject instanceof MeasuredTemplate\n ? !lib.is_UUID(validatedObject?.uuid)\n : this._temporaryEffect || false);\n\n if (inOptions.offset) {\n const offsetData = this._validateOffset(\n \"attachTo\",\n inOptions.offset,\n inOptions\n );\n this._offset = {\n source: offsetData,\n target: this._offset?.target ?? false,\n };\n }\n\n this._randomOffset = {\n source: inOptions.randomOffset,\n target: this._randomOffset?.target ?? false,\n };\n\n this._attachTo = {\n active: isValidObject,\n align: inOptions.align,\n edge: inOptions.edge,\n bindVisibility: inOptions.bindVisibility,\n bindAlpha: inOptions.bindAlpha,\n bindElevation: inOptions.bindElevation,\n followRotation: inOptions.followRotation,\n };\n return this;\n }\n\n /**\n * Causes the effect to be rotated and stretched towards an object, or a direct on the canvas to play the effect at, or a string reference (see .name())\n * This effectively calculates the proper X scale for the effect to reach the target\n *\n * @param {Object|String} inLocation\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n stretchTo(inLocation, inOptions = {}) {\n if (!(typeof inLocation === \"object\" || typeof inLocation === \"string\")) {\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n `inLocation is invalid, and must be of type of object, string, placeable object, or document`\n );\n }\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n `inOptions must be of type object`\n );\n inOptions = foundry.utils.mergeObject(\n {\n cacheLocation: false,\n attachTo: false,\n onlyX: false,\n tiling: false,\n offset: false,\n randomOffset: false,\n gridUnits: false,\n local: false,\n requiresLineOfSight: false,\n hideLineOfSight: false,\n },\n inOptions\n );\n const validatedObject = this._validateLocation(inLocation);\n if (validatedObject === undefined)\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"could not find position of given object\"\n );\n if (typeof inOptions.cacheLocation !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"inOptions.cacheLocation must be of type boolean\"\n );\n if (typeof inOptions.attachTo !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"inOptions.attachTo must be of type boolean\"\n );\n if (typeof inOptions.onlyX !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"inOptions.onlyX must be of type boolean\"\n );\n if (typeof inOptions.tiling !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"inOptions.tiling must be of type boolean\"\n );\n if (\n !(\n typeof inOptions.randomOffset === \"boolean\" ||\n lib.is_real_number(inOptions.randomOffset)\n )\n )\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"inOptions.randomOffset must be of type boolean or number\"\n );\n\n if (inOptions.cacheLocation && inOptions.attachTo) {\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"cacheLocation and attachTo cannot both be true - pick one or the other\"\n );\n }\n\n if (typeof inOptions.requiresLineOfSight !== \"boolean\") {\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"requiresLineOfSight must be of type boolean\"\n );\n }\n\n if (!inOptions.attachTo && inOptions.requiresLineOfSight) {\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"requiresLineOfSight requires that attachTo is true\"\n );\n }\n\n if (typeof inOptions.hideLineOfSight !== \"boolean\") {\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"hideLineOfSight must be of type boolean\"\n );\n }\n\n if (!inOptions.requiresLineOfSight && inOptions.hideLineOfSight) {\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"hideLineOfSight requires that requiresLineOfSight is true\"\n );\n }\n\n if (inOptions.tiling) this.tilingTexture();\n\n this._temporaryEffect =\n this._temporaryEffect ||\n (validatedObject instanceof foundry.abstract.Document\n ? !lib.is_UUID(validatedObject?.uuid)\n : this._temporaryEffect || false);\n\n if (inOptions.offset) {\n const offsetData = this._validateOffset(\n \"stretchTo\",\n inOptions.offset,\n inOptions\n );\n this._offset = {\n source: this._offset?.source ?? false,\n target: offsetData,\n };\n }\n\n this._randomOffset = {\n source: this._randomOffset?.source ?? false,\n target: inOptions.randomOffset,\n };\n\n this._stretchTo = {\n target: inOptions.cacheLocation\n ? canvaslib.get_object_canvas_data(validatedObject, { measure: true })\n : validatedObject,\n attachTo: inOptions.attachTo,\n onlyX: inOptions.onlyX,\n requiresLineOfSight: inOptions.requiresLineOfSight,\n hideLineOfSight: inOptions.hideLineOfSight,\n };\n\n return this;\n }\n\n /**\n * Sets the location to rotate the object to\n *\n * @param {object|string} inLocation\n * @param {object} inOptions\n * @returns this\n */\n rotateTowards(inLocation, inOptions = {}) {\n if (!(typeof inLocation === \"object\" || typeof inLocation === \"string\")) {\n throw this.sequence._customError(\n this,\n \"inLocation\",\n `inLocation is invalid, and must be of type of object, string, placeable object, or document`\n );\n }\n inOptions = foundry.utils.mergeObject(\n {\n rotationOffset: 0,\n cacheLocation: false,\n attachTo: false,\n offset: false,\n randomOffset: false,\n local: false,\n gridUnits: false,\n },\n inOptions\n );\n if (!lib.is_real_number(inOptions.rotationOffset))\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"inOptions.rotationOffset must be of type number\"\n );\n if (typeof inOptions.attachTo !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"inOptions.attachTo must be of type boolean\"\n );\n if (typeof inOptions.cacheLocation !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"inOptions.cacheLocation must be of type boolean\"\n );\n const validatedObject = this._validateLocation(inLocation);\n if (!validatedObject)\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"could not find position of given object\"\n );\n\n this._temporaryEffect =\n this._temporaryEffect ||\n (validatedObject instanceof foundry.abstract.Document\n ? !lib.is_UUID(validatedObject?.uuid)\n : this._temporaryEffect || false);\n\n if (inOptions.offset) {\n const offsetData = this._validateOffset(\n \"attachTo\",\n inOptions.offset,\n inOptions\n );\n this._offset = {\n source: offsetData,\n target: this._offset?.target ?? false,\n };\n }\n\n this._randomOffset = {\n source: inOptions.randomOffset,\n target: this._randomOffset?.target ?? false,\n };\n\n this._rotateTowards = {\n target: inOptions.cacheLocation\n ? canvaslib.get_object_canvas_data(validatedObject, { measure: true })\n : validatedObject,\n rotationOffset: inOptions.rotationOffset,\n cacheLocation: inOptions.cacheLocation,\n attachTo: inOptions.attachTo,\n };\n\n return this;\n }\n\n /**\n * Create an effect based on the given object, effectively copying the object as an effect. Useful when you want to do some effect magic on tokens or tiles.\n *\n * @param {Object} inObject\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n from(inObject, inOptions = {}) {\n if (\n !(\n inObject instanceof Token ||\n inObject instanceof Tile ||\n inObject instanceof TokenDocument ||\n inObject instanceof TileDocument\n )\n ) {\n throw this.sequence._customError(\n this,\n \"from\",\n \"inObject must be of type Token, Tile, TokenDocument, or TileDocument\"\n );\n }\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"from\",\n `inOptions must be of type object`\n );\n inObject = inObject.document ?? inObject;\n if (!inObject?.texture?.src)\n throw this.sequence._customError(\n this,\n \"from\",\n \"could not find the image for the given object\"\n );\n inOptions = foundry.utils.mergeObject(\n {\n cacheLocation: false,\n offset: false,\n randomOffset: false,\n local: false,\n gridUnits: false,\n },\n inOptions\n );\n if (typeof inOptions.cacheLocation !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"from\",\n \"inOptions.cacheLocation must be of type boolean\"\n );\n if (\n !(\n typeof inOptions.randomOffset === \"boolean\" ||\n lib.is_real_number(inOptions.randomOffset)\n )\n )\n throw this.sequence._customError(\n this,\n \"from\",\n \"inOptions.randomOffset must be of type boolean or number\"\n );\n\n this._temporaryEffect =\n this._temporaryEffect ||\n (inObject instanceof foundry.abstract.Document\n ? !lib.is_UUID(inObject?.uuid)\n : this._temporaryEffect || false);\n\n if (inOptions.offset) {\n const offsetData = this._validateOffset(\n \"attachTo\",\n inOptions.offset,\n inOptions\n );\n this._offset = {\n source: offsetData,\n target: this._offset?.target ?? false,\n };\n }\n\n this._randomOffset = {\n source: inOptions.randomOffset,\n target: this._randomOffset?.target ?? false,\n };\n\n this._from = {\n object: inObject,\n options: inOptions,\n };\n return this;\n }\n\n shape(inType, inOptions = {}) {\n if (typeof inType !== \"string\")\n throw this.sequence._customError(\n this,\n \"shape\",\n \"type must be of type string\"\n );\n\n if (!Object.values(CONSTANTS.SHAPES).includes(inType)) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"type must be one of: \" + Object.values(CONSTANTS.SHAPES).join(\", \")\n );\n }\n\n if (inType === CONSTANTS.SHAPES.POLY) {\n if (!Array.isArray(inOptions.points)) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"if creating polygon, inOptions.points must be of type array\"\n );\n }\n inOptions.points = inOptions.points.map((point) => {\n if (Array.isArray(point)) {\n if (!is_real_number(point[0]) || !is_real_number(point[1])) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.points must be an array, containing an array of two numbers or objects with x and y number properties\"\n );\n }\n return point;\n }\n if (typeof point === \"object\") {\n if (!is_real_number(point?.x) || !is_real_number(point?.y)) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.points must be an array, containing an array of two numbers or objects with x and y number properties\"\n );\n }\n return [point.x, point.y];\n }\n });\n } else if (inType === CONSTANTS.SHAPES.CIRC) {\n if (typeof inOptions.radius !== \"number\") {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"if creating circle, inOptions.radius must be of type number\"\n );\n }\n } else if (\n inType === CONSTANTS.SHAPES.RECT ||\n inType === CONSTANTS.SHAPES.RREC ||\n inType === CONSTANTS.SHAPES.ELIP\n ) {\n if (inOptions.width ^ inOptions.height) {\n inOptions.width = inOptions.width ?? inOptions.height;\n inOptions.height = inOptions.height ?? inOptions.width;\n }\n if (typeof inOptions.width !== \"number\") {\n throw this.sequence._customError(\n this,\n \"shape\",\n `if creating rectangle, rounded rectangle, or an ellipse, inOptions.width must be of type number`\n );\n }\n if (typeof inOptions.height !== \"number\") {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"if creating rectangle, rounded rectangle, or an ellipse, inOptions.height must be of type number\"\n );\n }\n if (\n inType === CONSTANTS.SHAPES.RREC &&\n typeof inOptions.radius !== \"number\"\n ) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"if creating rounded border rectangle, inOptions.radius must be of type number\"\n );\n }\n }\n\n if (\n inOptions.gridUnits !== undefined &&\n typeof inOptions.gridUnits !== \"boolean\"\n ) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.gridUnits must be of type boolean\"\n );\n }\n\n if (inOptions.name && typeof inOptions.name !== \"string\") {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.name must be of type string\"\n );\n }\n\n if (\n inOptions.fillColor &&\n !is_real_number(inOptions.fillColor) &&\n typeof inOptions.fillColor !== \"string\"\n ) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.fillColor must be of type string (hexadecimal) or number (decimal)\"\n );\n } else {\n inOptions.fillColor = lib.parseColor(inOptions.fillColor).decimal;\n }\n\n if (inOptions.fillAlpha && !is_real_number(inOptions.fillAlpha)) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.fillAlpha must be of type number\"\n );\n }\n\n if (inOptions.alpha && !is_real_number(inOptions.alpha)) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.alpha must be of type number\"\n );\n }\n\n if (inOptions.lineSize && !is_real_number(inOptions.lineSize)) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.lineSize must be of type number\"\n );\n }\n\n if (\n inOptions.lineColor &&\n !is_real_number(inOptions.lineColor) &&\n typeof inOptions.lineColor !== \"string\"\n ) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.lineColor must be of type string (hexadecimal) or number (decimal)\"\n );\n } else {\n inOptions.lineColor = lib.parseColor(inOptions.lineColor).decimal;\n }\n\n if (inOptions.offset) {\n inOptions.offset = this._validateOffset(\n \"shape\",\n inOptions.offset,\n inOptions.offset\n );\n }\n\n if (\n inOptions.texture !== undefined &&\n typeof inOptions.texture !== \"string\"\n ) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.texture must be of type string\"\n );\n }\n\n if (\n inOptions.isMask !== undefined &&\n typeof inOptions.isMask !== \"boolean\"\n ) {\n throw this.sequence._customError(\n this,\n \"shape\",\n \"inOptions.isMask must be of type boolean\"\n );\n }\n\n this._shapes.push({\n ...inOptions,\n type: inType,\n });\n\n return this;\n }\n\n /**\n * Causes the effect to be offset relative to its location based on a given vector\n *\n * @param {Object} inOffset\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n offset(inOffset, inOptions = {}) {\n this.sequence._showWarning(\n this,\n \"offset\",\n \"This method is becoming deprecated, please use the secondary offset option in atLocation, attachTo, stretchTo instead.\",\n true\n );\n if (inOffset === undefined)\n throw this.sequence._customError(\n this,\n \"offset\",\n \"inOffset must not be undefined\"\n );\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"offset\",\n \"options must be of type object\"\n );\n this._offsetLegacy = this._validateOffset(\"offset\", inOffset, inOptions);\n return this;\n }\n\n /**\n * Causes the effect's sprite to be offset relative to its location based on a given vector\n *\n * @param {Object} inOffset\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n spriteOffset(inOffset, inOptions = {}) {\n if (inOffset === undefined)\n throw this.sequence._customError(\n this,\n \"spriteOffset\",\n \"inOffset must not be undefined\"\n );\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"spriteOffset\",\n \"options must be of type object\"\n );\n this._spriteOffset = this._validateOffset(\n \"spriteOffset\",\n inOffset,\n inOptions\n );\n return this;\n }\n\n /**\n * Causes the final effect location to be snapped to the grid\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n snapToGrid(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"snapToGrid\",\n \"inBool must be of type boolean\"\n );\n this._snapToGrid = inBool;\n return this;\n }\n\n /**\n * Causes the effect to be scaled to the target object's width\n *\n * @param {Number} inScale\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n scaleToObject(inScale = 1.0, inOptions = {}) {\n if (!lib.is_real_number(inScale))\n throw this.sequence._customError(\n this,\n \"scaleToObject\",\n `inScale must be of type number!`\n );\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"scaleToObject\",\n \"inOptions must be of type object\"\n );\n inOptions = foundry.utils.mergeObject(\n {\n scale: inScale,\n considerTokenScale: false,\n uniform: false,\n },\n inOptions\n );\n if (typeof inOptions.uniform !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"scaleToObject\",\n \"inBool must be of type boolean\"\n );\n this._scaleToObject = inOptions;\n return this;\n }\n\n /**\n * Sets the width and the height of the effect in pixels, this size is set before any scaling\n *\n * @param {Number|Object<{width: {Number}, height: {Number}}>} inSize\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n size(inSize, inOptions = {}) {\n if (!lib.is_real_number(inSize) && typeof inSize !== \"object\")\n throw this.sequence._customError(\n this,\n \"size\",\n \"inSize must be of type number or object\"\n );\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"size\",\n \"inOptions must be of type object\"\n );\n if (lib.is_real_number(inSize)) {\n inSize = {\n width: inSize,\n height: inSize,\n };\n }\n\n if ((inSize.width === undefined) ^ (inSize.height === undefined)) {\n if (inSize.width) {\n if (!lib.is_real_number(inSize.width))\n throw this.sequence._customError(\n this,\n \"size\",\n \"inSize.width must be of type number or string 'auto'\"\n );\n inSize[\"height\"] = \"auto\";\n } else {\n if (!lib.is_real_number(inSize.height))\n throw this.sequence._customError(\n this,\n \"size\",\n \"inSize.height must be of type number or string 'auto'\"\n );\n inSize[\"width\"] = \"auto\";\n }\n }\n\n inOptions = foundry.utils.mergeObject(\n {\n gridUnits: false,\n },\n inOptions\n );\n\n if (!lib.is_real_number(inSize.width) && inSize.width !== \"auto\")\n throw this.sequence._customError(\n this,\n \"size\",\n \"inSize.width must be of type number or string 'auto'\"\n );\n if (!lib.is_real_number(inSize.height) && inSize.height !== \"auto\")\n throw this.sequence._customError(\n this,\n \"size\",\n \"inSize.height must be of type number or string 'auto'\"\n );\n if (typeof inOptions.gridUnits !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"size\",\n \"inOptions.gridUnits must be of type boolean\"\n );\n\n this._size = {\n width: inSize.width ?? canvas.grid.size,\n height: inSize.height ?? canvas.grid.size,\n ...inOptions,\n };\n return this;\n }\n\n /**\n * This scales the sprite of the effect, and this method can take the following:\n * - A number to set the scale uniformly\n * - An object with x and y for non-uniform scaling\n * - Two numbers which the Sequencer will randomly pick a uniform scale between\n *\n * @param {number|object} inScaleMin\n * @param {number} [inScaleMax] inScaleMax\n * @returns this\n */\n spriteScale(inScaleMin, inScaleMax) {\n if (!lib.is_real_number(inScaleMin) && typeof inScaleMin !== \"object\")\n throw this.sequence._customError(\n this,\n \"spriteScale\",\n \"inScale must be of type number or object\"\n );\n if (lib.is_real_number(inScaleMin)) {\n if (inScaleMax && !lib.is_real_number(inScaleMax)) {\n throw this.sequence._customError(\n this,\n \"spriteScale\",\n \"if inScaleMin is a number, inScaleMax must also be of type number\"\n );\n }\n }\n this._spriteScaleMin = inScaleMin;\n this._spriteScaleMax = inScaleMax ?? false;\n return this;\n }\n\n /**\n * This defines the internal padding of this effect. Gridsize determines the internal grid size of this effect which will determine how big it is on the canvas\n * relative to the canvas's grid size. Start and end point defines padding at the left and right of the effect\n *\n * @param {Number} gridSize\n * @param {Number} startPoint\n * @param {Number} endPoint\n * @returns {EffectSection}\n */\n template({ gridSize, startPoint, endPoint } = {}) {\n if (gridSize && !lib.is_real_number(gridSize))\n throw this.sequence._customError(\n this,\n \"template\",\n \"gridSize must be of type number\"\n );\n if (startPoint && !lib.is_real_number(startPoint))\n throw this.sequence._customError(\n this,\n \"template\",\n \"startPoint must be of type number\"\n );\n if (endPoint && !lib.is_real_number(endPoint))\n throw this.sequence._customError(\n this,\n \"template\",\n \"endPoint must be of type number\"\n );\n if (!gridSize && !startPoint && !endPoint)\n throw this.sequence._customError(\n this,\n \"template\",\n \"You need to define at least one parameter!\"\n );\n if (!this._template) this._template = {};\n if (gridSize) this._template[\"gridSize\"] = gridSize;\n if (startPoint) this._template[\"startPoint\"] = startPoint;\n if (endPoint) this._template[\"endPoint\"] = endPoint;\n return this;\n }\n\n /**\n * This makes the texture of the effect tile, effectively repeat itself within the sprite's dimensions\n *\n * @param {Object|Number} scale\n * @param {Object} position\n * @returns {EffectSection}\n */\n tilingTexture(scale = { x: 1.0, y: 1.0 }, position = { x: 0, y: 0 }) {\n if (lib.is_real_number(scale)) {\n scale = { x: scale, y: scale };\n }\n\n scale = { x: scale?.x ?? 1.0, y: scale?.y ?? 1.0 };\n\n if (!lib.is_real_number(scale.x))\n throw this.sequence._customError(\n this,\n \"tilingTexture\",\n `scale.x must be of type number!`\n );\n if (!lib.is_real_number(scale.y))\n throw this.sequence._customError(\n this,\n \"tilingTexture\",\n `scale.y must be of type number!`\n );\n\n position = { x: position?.x ?? 0, y: position?.y ?? 0 };\n\n if (!lib.is_real_number(position.x))\n throw this.sequence._customError(\n this,\n \"tilingTexture\",\n `position.x must be of type number!`\n );\n if (!lib.is_real_number(position.y))\n throw this.sequence._customError(\n this,\n \"tilingTexture\",\n `position.y must be of type number!`\n );\n\n this._tilingTexture = {\n scale,\n position,\n };\n\n return this;\n }\n\n /**\n * Anchors the sprite's container according to the given x and y coordinates, or uniformly based on a single number\n *\n * @param {Number|Object} inAnchor\n * @returns {EffectSection}\n */\n anchor(inAnchor) {\n if (lib.is_real_number(inAnchor)) {\n inAnchor = {\n x: inAnchor,\n y: inAnchor,\n };\n }\n\n inAnchor = {\n x: inAnchor?.x ?? 0.5,\n y: inAnchor?.y ?? 0.5,\n };\n\n if (!lib.is_real_number(inAnchor.x))\n throw this.sequence._customError(\n this,\n \"anchor\",\n `inAnchor.x must be of type number!`\n );\n if (!lib.is_real_number(inAnchor.y))\n throw this.sequence._customError(\n this,\n \"anchor\",\n `inAnchor.y must be of type number!`\n );\n\n this._anchor = inAnchor;\n return this;\n }\n\n /**\n * Anchors the sprite according to the given x and y coordinates, or uniformly based on a single number\n *\n * @param {Number|Object} inAnchor\n * @returns {EffectSection}\n */\n spriteAnchor(inAnchor) {\n if (lib.is_real_number(inAnchor)) {\n inAnchor = {\n x: inAnchor,\n y: inAnchor,\n };\n }\n\n inAnchor = {\n x: inAnchor?.x ?? 0.5,\n y: inAnchor?.y ?? 0.5,\n };\n\n if (!lib.is_real_number(inAnchor.x))\n throw this.sequence._customError(\n this,\n \"anchor\",\n `inAnchor.x must be of type number!`\n );\n if (!lib.is_real_number(inAnchor.y))\n throw this.sequence._customError(\n this,\n \"anchor\",\n `inAnchor.y must be of type number!`\n );\n\n this._spriteAnchor = inAnchor;\n return this;\n }\n\n /**\n * Centers the sprite, effectively giving it an anchor of {x: 0.5, y: 0.5}\n *\n * Note: If this is used, it will override the anchor set by Aim Towards, which sets the sprite's anchor to the\n * outermost edge of the location the sprite is played at\n *\n * @returns {EffectSection}\n */\n center() {\n this.anchor(0.5);\n return this;\n }\n\n /**\n * The sprite gets a random offset on its target location, usually within the object's bounds. The optional parameter\n * scales how much offset should be added. Defaults to 1.0, which covers the entire target position, 0.5 would cover half.\n *\n * @param {Number} inOffsetScale\n * @returns {EffectSection}\n */\n randomOffset(inOffsetScale = 1.0) {\n this.sequence._showWarning(\n this,\n \"randomOffset\",\n \"This method has been deprecated, please use randomOffset as a second parameter on atLocation, stretchTo, etc.\",\n true\n );\n if (!lib.is_real_number(inOffsetScale))\n throw this.sequence._customError(\n this,\n \"randomOffset\",\n \"inBool must be of type number\"\n );\n this._randomOffsetLegacy = inOffsetScale;\n return this;\n }\n\n /**\n * The sprite gets a randomized flipped X scale. If the scale on that axis was 1, it can\n * become 1 or -1, effectively mirroring the sprite on its horizontal axis\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n randomizeMirrorX(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"randomizeMirrorX\",\n \"inBool must be of type boolean\"\n );\n this._randomMirrorX = inBool;\n return this;\n }\n\n /**\n * The sprite gets a randomized flipped Y scale. If the scale on that axis was 1, it can\n * become 1 or -1, effectively mirroring the sprite on its vertical axis\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n randomizeMirrorY(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"randomizeMirrorY\",\n \"inBool must be of type boolean\"\n );\n this._randomMirrorY = inBool;\n return this;\n }\n\n /**\n * The sprite gets a flipped X scale. If the scale on that axis was 1, it will become 1 or -1, effectively\n * mirroring the sprite on its horizontal axis\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n mirrorX(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"mirrorX\",\n \"inBool must be of type boolean\"\n );\n this._mirrorX = inBool;\n return this;\n }\n\n /**\n * The sprite gets a flipped Y scale. If the scale on that axis was 1, it will become 1 or -1, effectively\n * mirroring the sprite on its vertical axis\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n mirrorY(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"mirrorY\",\n \"inBool must be of type boolean\"\n );\n this._mirrorY = inBool;\n return this;\n }\n\n /**\n * Causes the effect to play beneath most tokens\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n belowTokens(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"belowTokens\",\n \"inBool must be of type boolean\"\n );\n if (!inBool) return this;\n return this.elevation(0, { absolute: true });\n }\n\n /**\n * Causes the effect to play beneath most tiles\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n belowTiles(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"belowTokens\",\n \"inBool must be of type boolean\"\n );\n if (!inBool) return this;\n return this.elevation(-1, { absolute: true });\n }\n\n /**\n * Causes the effect to be played on top of the vision mask\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n aboveLighting(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"aboveLighting\",\n \"inBool must be of type boolean\"\n );\n this._aboveLighting = inBool;\n return this;\n }\n\n /**\n * Causes the effect to be played on top of interface\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n aboveInterface(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"aboveInterface\",\n \"inBool must be of type boolean\"\n );\n this._aboveInterface = inBool;\n return this;\n }\n\n /**\n * Changes the effect's elevation\n *\n * @param {Number} inElevation\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n elevation(inElevation, inOptions = {}) {\n if (typeof inElevation !== \"number\")\n throw this.sequence._customError(\n this,\n \"elevation\",\n \"inElevation must be of type number\"\n );\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"elevation\",\n `inOptions must be of type object`\n );\n\n inOptions = foundry.utils.mergeObject(\n {\n elevation: 1,\n absolute: false,\n },\n inOptions\n );\n\n if (typeof inOptions.absolute !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"elevation\",\n \"inOptions.absolute must be of type boolean\"\n );\n this._elevation = {\n elevation: inElevation,\n absolute: inOptions.absolute,\n };\n return this;\n }\n\n /**\n * Sets the zIndex of the effect, potentially displaying it on top of other effects the same elevation\n *\n * @param {Number} inZIndex\n * @returns {EffectSection}\n */\n zIndex(inZIndex) {\n if (!lib.is_real_number(inZIndex))\n throw this.sequence._customError(\n this,\n \"zIndex\",\n \"inZIndex must be of type number\"\n );\n this._zIndex = inZIndex;\n return this;\n }\n\n /**\n * This method only modifies .persist()ed effects and causes them to not immediately end, but stick around for the given duration passed to this method.\n *\n * @param {Number} inExtraDuration\n * @returns {EffectSection}\n */\n extraEndDuration(inExtraDuration) {\n if (!lib.is_real_number(inExtraDuration))\n throw this.sequence._customError(\n this,\n \"extraEndDuration\",\n \"inExtraDuration must be of type number\"\n );\n this._extraEndDuration = inExtraDuration;\n return this;\n }\n\n /**\n * Rotates the sprite\n *\n * @param {Number} inAngle\n * @returns {EffectSection}\n */\n spriteRotation(inAngle) {\n if (!lib.is_real_number(inAngle))\n throw this.sequence._customError(\n this,\n \"spriteRotation\",\n \"inAngle must be of type number\"\n );\n this._spriteRotation = inAngle;\n return this;\n }\n\n /**\n * Rotates the sprite\n *\n * @param {Boolean} inBool\n * @returns {EffectSection}\n */\n randomSpriteRotation(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"randomSpriteRotation\",\n \"inBool must be of type boolean\"\n );\n this._randomSpriteRotation = inBool;\n return this;\n }\n\n /**\n * Causes the effect to not rotate should its container rotate\n *\n * @param {Boolean} [inBool=true] inBool\n * @returns {EffectSection}\n */\n zeroSpriteRotation(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"zeroSpriteRotation\",\n \"inBool must be of type boolean\"\n );\n this._zeroSpriteRotation = inBool;\n return this;\n }\n\n /**\n * If the effect would loop due to its duration or persistence, this causes it not to\n *\n * @param {Boolean} [inBool=true] inBool\n * @returns {EffectSection}\n */\n noLoop(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"noLoop\",\n \"inBool must be of type boolean\"\n );\n this._noLoop = inBool;\n return this;\n }\n\n /**\n * Causes the effect to not show up in the Effect Manager UI - DO NOT USE UNLESS YOU KNOW WHAT YOU ARE DOING\n *\n * @param inBool\n * @returns {EffectSection}\n */\n private(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"private\",\n \"inBool must be of type boolean\"\n );\n this._private = inBool;\n return this;\n }\n\n /**\n * Causes the effect to be played in screen space instead of world space (where tokens are)\n *\n * @param {Boolean} [inBool=true] inBool\n * @returns {EffectSection}\n */\n screenSpace(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"screenSpace\",\n \"inBool must be of type boolean\"\n );\n this._screenSpace = inBool;\n this._screenSpaceAnchor = this._screenSpaceAnchor ?? { x: 0.5, y: 0.5 };\n return this;\n }\n\n /**\n * Causes the effect to be played above all of the UI elements\n *\n * @param {Boolean} [inBool=true] inBool\n * @returns {EffectSection}\n */\n screenSpaceAboveUI(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"screenSpaceAboveUI\",\n \"inBool must be of type boolean\"\n );\n this._screenSpaceAboveUI = inBool;\n return this;\n }\n\n /**\n * Positions the effect in a screen space position, offset from its .screenSpaceAnchor()\n *\n * @param {Object} inPosition\n * @returns {EffectSection}\n */\n screenSpacePosition(inPosition) {\n inPosition = {\n x: inPosition?.x ?? 0,\n y: inPosition?.y ?? 0,\n };\n if (!lib.is_real_number(inPosition.x))\n throw this.sequence._customError(\n this,\n \"screenSpacePosition\",\n `inPosition.x must be of type number!`\n );\n if (!lib.is_real_number(inPosition.y))\n throw this.sequence._customError(\n this,\n \"screenSpacePosition\",\n `inPosition.y must be of type number!`\n );\n this._screenSpacePosition = inPosition;\n return this;\n }\n\n /**\n * Anchors the sprite according to the given x and y coordinates, or uniformly based on a single number in screen space\n *\n * @param {Number|Object} inAnchor\n * @returns {EffectSection}\n */\n screenSpaceAnchor(inAnchor) {\n if (lib.is_real_number(inAnchor)) {\n inAnchor = {\n x: inAnchor,\n y: inAnchor,\n };\n }\n\n inAnchor = {\n x: inAnchor?.x ?? 0.5,\n y: inAnchor?.y ?? 0.5,\n };\n\n if (!lib.is_real_number(inAnchor.x))\n throw this.sequence._customError(\n this,\n \"screenSpaceAnchor\",\n `inAnchor.x must be of type number!`\n );\n if (!lib.is_real_number(inAnchor.y))\n throw this.sequence._customError(\n this,\n \"screenSpaceAnchor\",\n `inAnchor.y must be of type number!`\n );\n\n this._screenSpaceAnchor = inAnchor;\n return this;\n }\n\n /**\n * Sets up various properties relating to scale of the effect on the screen\n *\n * @param {Object} inOptions\n * @returns {EffectSection}\n */\n screenSpaceScale(inOptions) {\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"screenSpaceScale\",\n `inOptions must be of type object`\n );\n\n inOptions = foundry.utils.mergeObject(\n {\n x: 1.0,\n y: 1.0,\n fitX: false,\n fitY: false,\n ratioX: false,\n ratioY: false,\n },\n inOptions\n );\n\n if (!lib.is_real_number(inOptions.x))\n throw this.sequence._customError(\n this,\n \"screenSpaceScale\",\n `inOptions.x must be of type number!`\n );\n if (!lib.is_real_number(inOptions.y))\n throw this.sequence._customError(\n this,\n \"screenSpaceScale\",\n `inOptions.y must be of type number!`\n );\n if (typeof inOptions.fitX !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"screenSpaceScale\",\n \"inOptions.fitX must be of type boolean\"\n );\n if (typeof inOptions.fitY !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"screenSpaceScale\",\n \"inOptions.fitY must be of type boolean\"\n );\n if (typeof inOptions.ratioX !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"screenSpaceScale\",\n \"inOptions.ratioX must be of type boolean\"\n );\n if (typeof inOptions.ratioY !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"screenSpaceScale\",\n \"inOptions.ratioY must be of type boolean\"\n );\n\n if (inOptions.ratioX && inOptions.ratioY)\n throw this.sequence._customError(\n this,\n \"screenSpaceScale\",\n \"both ratioX and ratioY cannot be true, one axis must fit or be set directly\"\n );\n\n this._screenSpaceScale = inOptions;\n\n return this;\n }\n\n /**\n * This is for adding extra information to an effect, like the origin of the effect in the form of the item's uuid.\n * The method accepts a string or a Document that has an UUID.\n *\n * @param {string|document} inOrigin\n * @returns {Section}\n */\n origin(inOrigin) {\n inOrigin = lib.validate_document(inOrigin);\n if (inOrigin instanceof foundry.abstract.Document) {\n inOrigin = inOrigin?.uuid;\n if (!inOrigin)\n throw this.sequence._customError(\n this,\n \"origin\",\n \"could not find the UUID for the given Document\"\n );\n }\n if (typeof inOrigin !== \"string\")\n throw this.sequence._customError(\n this,\n \"origin\",\n \"inOrigin must be of type string\"\n );\n this._origin = inOrigin;\n return this;\n }\n\n /**\n * Ties the effect to any number of documents in Foundry - if those get deleted, the effect is ended.\n *\n * @param {String|PlaceableObject|foundry.abstract.Document|Array<String|PlaceableObject|foundry.abstract.Document>} inDocuments\n * @returns {EffectSection}\n */\n tieToDocuments(inDocuments) {\n if (!Array.isArray(inDocuments)) {\n inDocuments = [inDocuments];\n }\n for (let doc of inDocuments) {\n if (\n typeof doc !== \"string\" &&\n !(doc instanceof PlaceableObject) &&\n !(doc instanceof foundry.abstract.Document)\n ) {\n throw this.sequence._customError(\n this,\n \"tieToDocument\",\n \"inOrigin must be of type string, PlaceableObject, or Document, or an array thereof\"\n );\n }\n if (typeof doc === \"string\") {\n const obj = fromUuidSync(doc);\n if (!obj)\n throw this.sequence._customError(\n this,\n \"tieToDocument\",\n `could not find document with UUID \"${doc}\"`\n );\n } else {\n doc = lib.validate_document(doc);\n if (doc instanceof foundry.abstract.Document) {\n doc = doc?.uuid;\n if (!doc)\n throw this.sequence._customError(\n this,\n \"tieToDocument\",\n \"could not find the UUID for the given object\"\n );\n }\n }\n this._tiedDocuments.push(doc);\n }\n return this;\n }\n\n /**\n * Masks the effect to the given object or objects. If no object is given, the effect will be masked to the source\n * of the effect.\n *\n * @param {Token/TokenDocument/Tile/TileDocument/Drawing/DrawingDocument/MeasuredTemplate/MeasuredTemplateDocument/Array} inObject\n * @returns {Section}\n */\n mask(inObject) {\n if (!inObject) {\n this._selfMask = true;\n return this;\n }\n\n if (Array.isArray(inObject)) {\n for (let obj of inObject) {\n this.mask(obj);\n }\n return this;\n }\n\n const validatedObject = this._validateLocation(inObject);\n\n const isValidObject =\n validatedObject instanceof TokenDocument ||\n validatedObject instanceof TileDocument ||\n validatedObject instanceof DrawingDocument ||\n validatedObject instanceof MeasuredTemplateDocument;\n if (!isValidObject) {\n throw this.sequence._customError(\n this,\n \"mask\",\n \"A foundry object was provided, but only Tokens, Tiles, Drawings, and MeasuredTemplates may be used to create effect masks\"\n );\n }\n\n this._masks.push(lib.get_object_identifier(validatedObject));\n\n return this;\n }\n\n /**\n * Causes the effect to be visible through walls\n *\n * @param inBool\n * @returns {EffectSection}\n */\n xray(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"xray\",\n \"inBool must be of type boolean\"\n );\n this._xray = inBool;\n return this;\n }\n\n /**\n * Configures the isometric configuration of this effect\n *\n * @param inOptions\n * @returns {EffectSection}\n */\n isometric(inOptions = {}) {\n if (typeof inOptions !== \"object\")\n throw this.sequence._customError(\n this,\n \"isometric\",\n `inOptions must be of type object`\n );\n inOptions = foundry.utils.mergeObject(\n {\n overlay: false,\n },\n inOptions\n );\n if (typeof inOptions?.overlay !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"isometric\",\n \"inOptions.overlay must be of type boolean\"\n );\n this._isometric = inOptions;\n return this;\n }\n\n /**\n * @private\n */\n _expressWarnings() {\n if (this._stretchTo && this._anchor?.x) {\n this.sequence._showWarning(\n this,\n \"stretchTo\",\n \"you have called .stretchTo() and .anchor() - stretchTo will manually set the X axis of the anchor and may not behave like you expect.\",\n true\n );\n }\n if (this._stretchTo && this._scaleToObject) {\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"You're trying to stretch towards an object, while scaling to fit another??? Make up your mind!\"\n );\n }\n if (this._stretchTo && this._randomRotation) {\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"You're trying to stretch towards an object, while trying to randomly rotate the effect? What?\"\n );\n }\n if (this._stretchTo && this._moveTowards) {\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"You're trying to stretch towards an object, while moving towards it? You're insane.\"\n );\n }\n if (\n this._attachTo &&\n this._stretchTo?.attachTo &&\n (this._startTime || this._endTime) &&\n this._isRangedEffect\n ) {\n throw this.sequence._customError(\n this,\n \"stretchTo\",\n \"Dual-attached range-finding effects combined while using any of the time methods is stable - modern web browsers cannot handle it and it may crash them, so this feature has been disabled.\"\n );\n }\n\n const source = this._getSourceObject();\n const target = this._getTargetObject();\n\n if (\n !this._screenSpace &&\n this._persistOptions?.persistTokenPrototype &&\n this._masks.filter((uuid) => uuid !== source).length > 0\n ) {\n this.sequence._showWarning(\n this,\n \"persist\",\n \"You have applied persistTokenPrototype with multiple masks from objects in the scene - these will not be persisted across scenes!\",\n true\n );\n }\n\n if (!source && !target && !this._screenSpace) {\n throw this.sequence._customError(\n this,\n \"play\",\n \"Could not determine where to play the effect!\"\n );\n }\n }\n\n /**\n * @OVERRIDE\n */\n async preRun() {\n if (this._from) {\n this._file = this._file || this._from.object?.texture?.src;\n\n if (this._source === null) {\n this._source = this._validateLocation(this._from.object);\n }\n\n if (this._size === null) {\n const size = canvaslib.get_object_dimensions(this._from.object);\n this._size = {\n width: size?.width ?? canvas.grid.size,\n height: size?.height ?? canvas.grid.size,\n gridUnits: false,\n };\n }\n\n if (\n this._mirrorX === null &&\n (this._from.object.mirrorX ||\n (this._from.object?.tile && this._from.object?.tile.scale.x < 0))\n ) {\n this._mirrorX = true;\n }\n\n if (\n this._mirrorY === null &&\n (this._from.object.mirrorY ||\n (this._from.object?.tile && this._from.object?.tile.scale.y < 0))\n ) {\n this._mirrorY = true;\n }\n\n if (this._angle === null && this._from.object?.rotation) {\n this._angle = -this._from.object.rotation;\n }\n\n this._randomOffset = {\n source: this._randomOffset?.source ?? this._from.options.randomOffset,\n target: this._randomOffset?.target ?? false,\n };\n }\n }\n\n /**\n * @OVERRIDE\n * @returns {Promise<void>}\n */\n async run() {\n if (!lib.user_can_do(\"permissions-effect-create\") || !this._playEffect) {\n if (!lib.user_can_do(\"permissions-effect-create\")) {\n debounce(EffectSection.debounceWarning, 1000);\n }\n return new Promise((resolve) => {\n resolve();\n });\n }\n if (!this._deserializedData) this._expressWarnings();\n const data = await this._sanitizeEffectData();\n if (Hooks.call(\"preCreateSequencerEffect\", data) === false) return;\n let push =\n !(data?.users?.length === 1 && data?.users?.includes(game.userId)) &&\n !this.sequence.localOnly;\n let canvasEffectData = await Sequencer.EffectManager.play(data, push);\n let totalDuration = this._currentWaitTime;\n if (this._persist) {\n totalDuration += await canvasEffectData.promise;\n } else {\n totalDuration += await canvasEffectData.duration;\n }\n await new Promise((resolve) => setTimeout(resolve, totalDuration));\n }\n\n /**\n * @private\n */\n _applyTraits() {\n Object.assign(this.constructor.prototype, traits.files);\n Object.assign(this.constructor.prototype, traits.audio);\n Object.assign(this.constructor.prototype, traits.moves);\n Object.assign(this.constructor.prototype, traits.opacity);\n Object.assign(this.constructor.prototype, traits.rotation);\n Object.assign(this.constructor.prototype, traits.scale);\n Object.assign(this.constructor.prototype, traits.time);\n Object.assign(this.constructor.prototype, traits.users);\n Object.assign(this.constructor.prototype, traits.animation);\n Object.assign(this.constructor.prototype, traits.filter);\n Object.assign(this.constructor.prototype, traits.tint);\n Object.assign(this.constructor.prototype, traits.location);\n Object.assign(this.constructor.prototype, traits.offset);\n Object.assign(this.constructor.prototype, traits.text);\n }\n\n /**\n * @private\n */\n async _initialize() {\n if (this._name) {\n if (!this.sequence.nameOffsetMap) {\n this.sequence.nameOffsetMap = {};\n }\n\n if (!this.sequence.nameOffsetMap[this._name]) {\n const source = this._getSourceObject();\n const target = this._getTargetObject();\n\n if (this._offsetLegacy && !this._offset) {\n this._offset = {\n source: !target ? this._offsetLegacy : false,\n target: !!target ? this._offsetLegacy : false,\n };\n }\n\n if (this._randomOffsetLegacy && !this._randomOffset) {\n this._randomOffset = {\n source: !target ? this._randomOffsetLegacy : false,\n target: !!target ? this._randomOffsetLegacy : false,\n };\n }\n\n this.sequence.nameOffsetMap[this._name] = {\n seed: `${this._name}-${randomID()}`,\n source: source,\n target: target,\n randomOffset: this._randomOffset,\n missed: this._missed,\n offset: this._offset,\n repetitions: this._repetitions,\n twister: {},\n };\n }\n }\n\n if (\n !this._file &&\n !this._from &&\n !this._text &&\n !this._shapes.length &&\n this.sequence.softFail\n ) {\n this._playEffect = false;\n return;\n }\n\n let fileData = this._file\n ? await this._determineFile(this._file)\n : {\n file: this._file,\n forcedIndex: false,\n customRange: false,\n };\n\n this._isRangedEffect = fileData?.file?.rangeFind;\n\n if (fileData.customRange || fileData.file?.dbPath) return;\n\n let exists = false;\n try {\n exists = await SequencerFileCache.srcExists(fileData.file);\n } catch (err) {}\n\n if (!exists) {\n if (this.sequence.softFail) {\n this._playEffect = false;\n return;\n }\n throw this.sequence._customError(\n this,\n \"Play\",\n `Could not find file:<br>${fileData.file}`\n );\n }\n }\n\n /**\n * @private\n */\n _getSourceObject() {\n if (!this._source || typeof this._source !== \"object\") return this._source;\n if (this._source?.cachedLocation || !this._attachTo) {\n return canvaslib.get_object_canvas_data(this._source);\n }\n return (\n lib.get_object_identifier(this._source) ??\n canvaslib.get_object_canvas_data(this._source)\n );\n }\n\n /**\n * @private\n */\n _getTargetObject() {\n if (!this._target?.target) return this._target;\n if (typeof this._target.target !== \"object\") return this._target.target;\n if (\n this._target?.target?.cachedLocation ||\n !(this._stretchTo?.attachTo || this._rotateTowards?.attachTo)\n ) {\n return canvaslib.get_object_canvas_data(this._target.target, true);\n }\n return (\n lib.get_object_identifier(this._target.target) ??\n canvaslib.get_object_canvas_data(this._target.target, true)\n );\n }\n\n /**\n * @private\n */\n async _sanitizeEffectData() {\n if (this._deserializedData) {\n this._deserializedData.creationTimestamp = +new Date();\n this._deserializedData.remote = true;\n return this._deserializedData;\n }\n\n const { file, forcedIndex, customRange } =\n this._file && this._playEffect\n ? await this._determineFile(this._file)\n : {\n file: this._file,\n forcedIndex: false,\n customRange: false,\n };\n\n const source = this._getSourceObject();\n const target = this._getTargetObject();\n\n if (this._offsetLegacy) {\n this._offset = {\n source:\n !target && this._offset?.source\n ? this._offsetLegacy\n : this._offset?.source,\n target:\n !!target && this._offset?.target\n ? this._offsetLegacy\n : this._offset?.target,\n };\n }\n\n if (this._randomOffsetLegacy) {\n this._randomOffset = {\n source:\n !target && this._randomOffset?.source\n ? this._randomOffsetLegacy\n : this._randomOffset?.source,\n target:\n !!target && this._randomOffset?.target\n ? this._randomOffsetLegacy\n : this._randomOffset?.target,\n };\n }\n\n if (this._selfMask) {\n this._masks.push(\n lib.get_object_identifier(this._source) ??\n canvaslib.get_object_canvas_data(this._source)\n );\n }\n\n let sceneId = game.user.viewedScene;\n if (lib.is_UUID(source)) {\n const potentialSceneId = source.split(\".\")[1];\n if (game.scenes.get(potentialSceneId)) {\n sceneId = potentialSceneId;\n }\n } else if (lib.is_UUID(target)) {\n const potentialSceneId = target.split(\".\")[1];\n if (game.scenes.get(potentialSceneId)) {\n sceneId = potentialSceneId;\n }\n }\n\n let data = foundry.utils.duplicate({\n /**\n * Core properties\n */\n _id: randomID(),\n flagVersion: flagManager.latestFlagVersion,\n sequenceId: this.sequence.id,\n creationTimestamp: +new Date(),\n sceneId,\n creatorUserId: game.userId,\n moduleName: this.sequence.moduleName,\n users: this._users ? Array.from(this._users) : false,\n name: this._name,\n origin: this._origin,\n index: this.sequence.effectIndex,\n repetition: this._currentRepetition,\n private: this._private,\n temporary: this._temporaryEffect,\n tiedDocuments: Array.from(new Set(this._tiedDocuments)),\n\n /**\n * Source/target properties\n */\n source: source,\n target: target,\n rotateTowards: this._rotateTowards,\n stretchTo: this._stretchTo\n ? {\n attachTo: this._stretchTo.attachTo,\n onlyX: this._stretchTo.onlyX,\n requiresLineOfSight: this._stretchTo.requiresLineOfSight,\n hideLineOfSight: this._stretchTo.hideLineOfSight,\n }\n : false,\n moveTowards: this._moveTowards\n ? {\n ease: this._moveTowards.ease,\n rotate: this._moveTowards.rotate,\n }\n : false,\n\n attachTo: this._attachTo,\n missed: this._missed,\n\n /**\n * Sprite properties\n */\n file: file?.dbPath ?? file,\n customRange,\n forcedIndex,\n text: this._text,\n tilingTexture: this._tilingTexture,\n masks: Array.from(new Set(this._masks)),\n shapes: this._shapes,\n volume: this._volume,\n isometric: this._isometric,\n\n // Transforms\n scale: this._getCalculatedScale(\"scale\"),\n spriteScale: this._getCalculatedScale(\"spriteScale\"),\n angle: this._angle,\n size: this._size,\n offset: this._offset,\n anchor: this._anchor,\n spriteOffset: this._spriteOffset,\n spriteAnchor: this._spriteAnchor,\n template: this._template,\n zeroSpriteRotation: this._zeroSpriteRotation,\n randomOffset: this._randomOffset,\n randomRotation: this._randomRotation,\n scaleToObject: this._scaleToObject,\n elevation: this._elevation,\n aboveLighting: this._aboveLighting,\n aboveInterface: this._aboveInterface,\n xray: this._xray,\n\n // Appearance\n zIndex: this._zIndex,\n opacity: lib.is_real_number(this._opacity) ? this._opacity : 1.0,\n filters: this._filters,\n noLoop: this._noLoop,\n spriteRotation: this._spriteRotation,\n randomSpriteRotation: this._randomSpriteRotation,\n tint: this._tint?.decimal,\n flipX: this._mirrorX || (this._randomMirrorX && Math.random() < 0.5),\n flipY: this._mirrorY || (this._randomMirrorY && Math.random() < 0.5),\n\n /**\n * Time properties\n */\n duration: this._duration,\n persist: this._persist,\n persistOptions: this._persistOptions,\n playbackRate: this._playbackRate,\n extraEndDuration: this._extraEndDuration,\n time:\n this._startTime || this._endTime\n ? {\n start: lib.is_real_number(this._startTime)\n ? {\n value: this._startTime,\n isPerc: this._startPerc,\n }\n : false,\n end: lib.is_real_number(this._endTime)\n ? {\n value: this._endTime,\n isPerc: this._endPerc,\n }\n : false,\n isRange: this._isRange,\n }\n : false,\n\n /**\n * Animation properties\n */\n moves: this._moveTowards,\n moveSpeed: this._moveSpeed,\n fadeIn: this._fadeIn,\n fadeOut: this._fadeOut,\n scaleIn: this._scaleIn,\n scaleOut: this._scaleOut,\n rotateIn: this._rotateIn,\n rotateOut: this._rotateOut,\n fadeInAudio: this._fadeInAudio,\n fadeOutAudio: this._fadeOutAudio,\n animations: this._animations,\n\n /**\n * Screenspace properties\n */\n screenSpace: this._screenSpace,\n screenSpaceAboveUI: this._screenSpaceAboveUI,\n screenSpaceAnchor: this._screenSpaceAnchor,\n screenSpacePosition: this._screenSpacePosition,\n screenSpaceScale: this._screenSpaceScale,\n\n nameOffsetMap: this.sequence.nameOffsetMap,\n });\n\n for (let override of this._overrides) {\n data = await override(this, data);\n }\n\n if (\n (typeof data.file !== \"string\" || data.file === \"\") &&\n !data.text &&\n !data.shapes &&\n !data.customRange\n ) {\n throw this.sequence._customError(\n this,\n \"file\",\n \"an effect must have a file, text, or have a shape!\"\n );\n }\n\n // TODO: Revisit this at some point?\n // data = Object.fromEntries(Object.entries(data).filter(entry => entry[1] !== null && entry[1] !== false));\n\n return data;\n }\n\n async _serialize() {\n const data = await super._serialize();\n await this.preRun();\n const sectionData = await this._sanitizeEffectData();\n return {\n ...data,\n type: \"effect\",\n sectionData,\n };\n }\n\n async _deserialize(data) {\n this._deserializedData = data.sectionData;\n return super._deserialize(data);\n }\n\n /**\n * @private\n */\n _getCalculatedScale(type) {\n const min = this[\"_\" + type + \"Min\"];\n const max = this[\"_\" + type + \"Max\"];\n\n let scale = min;\n if (lib.is_real_number(min)) {\n if (max && lib.is_real_number(max)) {\n scale = lib.random_float_between(min, max);\n }\n scale = {\n x: scale,\n y: scale,\n };\n }\n return {\n x: scale?.x ?? 1.0,\n y: scale?.y ?? 1.0,\n };\n }\n}\n","import * as lib from \"../lib/lib.js\";\nimport SequencerAudioHelper from \"../modules/sequencer-audio-helper.js\";\nimport Section from \"./section.js\";\nimport traits from \"./traits/_traits.js\";\nimport { SequencerFileBase } from \"../modules/sequencer-file.js\";\n\nclass SoundSection extends Section {\n constructor(inSequence, inFile = \"\") {\n super(inSequence);\n this._file = inFile;\n this._volume = 0.8;\n this._overrides = [];\n }\n\n static niceName = \"Sound\";\n\n /**\n * Adds a function that will run at the end of the sound serialization step, but before it is played. Allows direct\n * modifications of sound's data.\n *\n * @param {function} inFunc\n * @returns {SoundSection}\n */\n addOverride(inFunc) {\n if (!lib.is_function(inFunc))\n throw this.sequence._customError(\n this,\n \"addOverride\",\n \"The given function needs to be an actual function.\"\n );\n this._overrides.push(inFunc);\n return this;\n }\n\n /**\n * @private\n */\n _applyTraits() {\n Object.assign(this.constructor.prototype, traits.files);\n Object.assign(this.constructor.prototype, traits.audio);\n Object.assign(this.constructor.prototype, traits.time);\n Object.assign(this.constructor.prototype, traits.users);\n }\n\n /**\n * @OVERRIDE\n * @returns {Promise}\n */\n async run() {\n const playData = await this._sanitizeSoundData();\n\n if (!playData.play && this.sequence.softFail) {\n return new Promise((reject) => {\n reject();\n });\n }\n\n if (!playData?.play) {\n this.sequence._customError(\n this,\n \"Play\",\n `File not found: ${playData.src}`\n );\n return new Promise((reject) => reject());\n }\n\n if (Hooks.call(\"preCreateSequencerSound\", playData) === false) return;\n\n let push =\n !(\n playData?.users?.length === 1 && playData?.users?.includes(game.userId)\n ) && !this.sequence.localOnly;\n\n SequencerAudioHelper.play(playData, push);\n\n await new Promise((resolve) =>\n setTimeout(resolve, this._currentWaitTime + playData.duration)\n );\n }\n\n /**\n * @returns {Promise}\n * @private\n */\n async _sanitizeSoundData() {\n if (this._deserializedData) {\n return this._deserializedData;\n }\n\n if (!this._file) {\n return {\n play: false,\n src: false,\n };\n }\n\n let { file, forcedIndex } = await this._determineFile(this._file);\n\n if (!file) {\n return {\n play: false,\n src: false,\n };\n }\n\n if (file instanceof SequencerFileBase) {\n file.forcedIndex = forcedIndex;\n if (file.timeRange) {\n [this._startTime, this._endTime] = file.timeRange;\n this._isRange = true;\n }\n file = file.getFile();\n }\n\n let soundFile = await AudioHelper.preloadSound(file);\n if (!soundFile || soundFile.failed) {\n return {\n play: false,\n src: this._file,\n };\n }\n let duration = soundFile.duration * 1000;\n\n let startTime =\n (this._startTime\n ? !this._startPerc\n ? this._startTime\n : this._startTime * duration\n : 0) / 1000;\n\n if (this._endTime) {\n duration = !this._endPerc\n ? Number(\n this._isRange\n ? this._endTime - this._startTime\n : duration - this._endTime\n )\n : this._endTime * duration;\n }\n\n let data = {\n id: randomID(),\n play: true,\n src: file,\n loop: this._duration > duration,\n volume: this._volume,\n fadeIn: this._fadeInAudio,\n fadeOut: this._fadeOutAudio,\n startTime: startTime,\n duration: this._duration || duration,\n sceneId: game.user.viewedScene,\n users: this._users ? Array.from(this._users) : null,\n };\n\n for (let override of this._overrides) {\n data = await override(this, data);\n }\n\n if (typeof data.src !== \"string\" || data.src === \"\") {\n throw this.sequence._customError(\n this,\n \"file\",\n \"a sound must have a src of type string!\"\n );\n }\n\n return data;\n }\n\n async _serialize() {\n const data = await super._serialize();\n const sectionData = await this._sanitizeSoundData();\n return {\n ...data,\n type: \"sound\",\n sectionData,\n };\n }\n\n async _deserialize(data) {\n this._deserializedData = data.sectionData;\n return super._deserialize(data);\n }\n}\n\nexport default SoundSection;\n","import * as lib from \"../lib/lib.js\";\nimport * as canvaslib from \"../lib/canvas-lib.js\";\nimport Section from \"./section.js\";\nimport traits from \"./traits/_traits.js\";\nimport { sequencerSocket, SOCKET_HANDLERS } from \"../sockets.js\";\n\nclass AnimationSection extends Section {\n constructor(inSequence, inTarget) {\n super(inSequence);\n this._teleportTo = false;\n this._originObject = false;\n this._moveSpeed = 23;\n this._offset = { x: 0, y: 0 };\n this._closestSquare = false;\n this._snapToGrid = false;\n this._hide = undefined;\n if (inTarget) this.on(inTarget);\n }\n\n static niceName = \"Animation\";\n\n /**\n * Sets the target object to be animated\n *\n * @param {object|string} inTarget\n * @returns {AnimationSection}\n */\n on(inTarget) {\n inTarget = this._validateLocation(inTarget);\n if (!inTarget)\n throw this.sequence._customError(\n this,\n \"on\",\n \"could not find position of given object\"\n );\n this._originObject = this._validateLocation(inTarget);\n return this;\n }\n\n /**\n * Sets the location to teleport the target object to\n *\n * @param {object|string} inTarget\n * @param {object} options\n * @returns {AnimationSection}\n */\n teleportTo(inTarget, options = {}) {\n options = foundry.utils.mergeObject(\n {\n delay: 0,\n relativeToCenter: false,\n },\n options\n );\n if (!lib.is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"teleportTo\",\n \"options.delay must be of type number\"\n );\n inTarget = this._validateLocation(inTarget);\n if (!inTarget)\n throw this.sequence._customError(\n this,\n \"teleportTo\",\n \"could not find position of given object\"\n );\n options.target = this._validateLocation(inTarget);\n this._teleportTo = options;\n return this;\n }\n\n /**\n * Sets the location to rotate the object to\n *\n * @param {object|string} inLocation\n * @param {object} options\n * @returns this\n */\n rotateTowards(inLocation, options = {}) {\n options = foundry.utils.mergeObject(\n {\n duration: 0,\n ease: \"linear\",\n delay: 0,\n rotationOffset: 0,\n towardsCenter: true,\n cacheLocation: false,\n },\n options\n );\n if (!lib.is_real_number(options.duration))\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"options.duration must be of type number\"\n );\n if (typeof options.ease !== \"string\")\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"options.ease must be of type string\"\n );\n if (!lib.is_real_number(options.delay))\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"options.delay must be of type number\"\n );\n if (!lib.is_real_number(options.rotationOffset))\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"options.rotationOffset must be of type number\"\n );\n if (typeof options.towardsCenter !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"options.towardsCenter must be of type boolean\"\n );\n if (typeof options.cacheLocation !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"options.cacheLocation must be of type boolean\"\n );\n options.target = this._validateLocation(inLocation);\n if (!options.target)\n throw this.sequence._customError(\n this,\n \"rotateTowards\",\n \"could not find position of given object\"\n );\n options.target = options.cacheLocation\n ? canvaslib.get_object_position(options.target, { measure: true })\n : options.target;\n this._rotateTowards = options;\n return this;\n }\n\n /**\n * Causes the movement or teleportation to be offset in the X and/or Y axis\n *\n * @param {object} inOffset\n * @returns {AnimationSection}\n */\n offset(inOffset) {\n inOffset = foundry.utils.mergeObject({ x: 0, y: 0 }, inOffset);\n this._offset = this._validateLocation(inOffset);\n return this;\n }\n\n /**\n * Causes the movement or teleportation to pick the closest non-intersecting square, if the target is a token or tile\n *\n * @param {boolean} inBool\n * @returns {AnimationSection}\n */\n closestSquare(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"closestSquare\",\n \"inBool must be of type boolean\"\n );\n this._closestSquare = inBool;\n return this;\n }\n\n /**\n * Causes the final location to be snapped to the grid\n *\n * @param {boolean} inBool\n * @returns {AnimationSection}\n */\n snapToGrid(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"snapToGrid\",\n \"inBool must be of type boolean\"\n );\n this._snapToGrid = inBool;\n return this;\n }\n\n /**\n * Causes the object to become hidden\n *\n * @param {boolean} inBool\n * @returns {AnimationSection}\n */\n hide(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"hide\",\n \"inBool must be of type boolean\"\n );\n this._hide = inBool;\n return this;\n }\n\n /**\n * Causes the object to become visible\n *\n * @param {boolean} inBool\n * @returns {AnimationSection}\n */\n show(inBool = true) {\n if (typeof inBool !== \"boolean\")\n throw this.sequence._customError(\n this,\n \"show\",\n \"inBool must be of type boolean\"\n );\n this._hide = !inBool;\n return this;\n }\n\n /**\n * @private\n */\n async run() {\n return this._runAnimate();\n }\n\n /**\n * @private\n */\n _applyTraits() {\n Object.assign(this.constructor.prototype, traits.moves);\n Object.assign(this.constructor.prototype, traits.opacity);\n Object.assign(this.constructor.prototype, traits.rotation);\n Object.assign(this.constructor.prototype, traits.audio);\n Object.assign(this.constructor.prototype, traits.tint);\n }\n\n /**\n * @private\n */\n async _updateObject(obj, updates, animate = false, animation = {}) {\n const uuid = obj?.uuid ?? obj?.document?.uuid;\n await sequencerSocket.executeAsGM(\n SOCKET_HANDLERS.UPDATE_DOCUMENT,\n uuid,\n updates,\n { animate, animation }\n );\n }\n\n /**\n * @private\n */\n async _waitForTokenRefresh(obj) {\n let token;\n\n if (obj instanceof Token) {\n token = obj;\n }\n\n if (obj instanceof TokenDocument) {\n token = obj.object;\n }\n\n if (token == null || token.mesh != null) {\n return;\n }\n\n let refreshTokenID;\n\n return await new Promise((resolve) => {\n refreshTokenID = Hooks.on(\"refreshToken\", async (tokenDoc) => {\n if (tokenDoc.document.actorId !== token.document.actorId || !token.mesh)\n return;\n Hooks.off(\"refreshToken\", refreshTokenID);\n resolve();\n });\n });\n }\n\n /**\n * @private\n */\n async _execute() {\n if (!(await this._shouldPlay())) return;\n let self = this;\n this._basicDelay = lib.random_float_between(this._delayMin, this._delayMax);\n return new Promise(async (resolve) => {\n setTimeout(async () => {\n await this._waitForTokenRefresh(this._originObject);\n if (this._shouldAsync) {\n await self.run();\n } else {\n self.run();\n }\n resolve();\n }, this._basicDelay);\n });\n }\n\n /**\n * @private\n */\n _getClosestSquare(origin, target) {\n let originLoc = canvaslib.get_object_position(origin, { exact: true });\n let targetLoc = canvaslib.get_object_position(target, { exact: true });\n\n let originDimensions = canvaslib.get_object_dimensions(origin);\n let targetDimensions = canvaslib.get_object_dimensions(target);\n\n let originBottom = Math.max(\n originDimensions.width - canvas.grid.size,\n canvas.grid.size\n );\n let originRight = Math.max(\n originDimensions.height - canvas.grid.size,\n canvas.grid.size\n );\n\n let ray = new Ray(originLoc, targetLoc);\n\n let dx = ray.dx;\n let dy = ray.dy;\n\n if (dx > 0 && Math.abs(dx) > originRight) {\n dx -= originDimensions.width;\n } else if (dx < 0 && Math.abs(dx) > targetDimensions.width) {\n dx += targetDimensions.height;\n } else {\n dx = 0;\n }\n\n if (dy > 0 && Math.abs(dy) > originBottom) {\n dy -= originDimensions.height;\n } else if (dy < 0 && Math.abs(dy) > targetDimensions.height) {\n dy += targetDimensions.height;\n } else {\n dy = 0;\n }\n\n const pos = {\n x: originLoc.x + dx,\n y: originLoc.y + dy,\n elevation: targetLoc?.elevation,\n };\n\n if (!pos.elevation) {\n delete pos[\"elevation\"];\n }\n\n return pos;\n }\n\n /**\n * @private\n */\n _snapLocationToGrid(inLocation) {\n return canvas.grid.getSnappedPosition(inLocation.x, inLocation.y);\n }\n\n /**\n * This needs a rewrite, jeesus.\n */\n async _runAnimate() {\n let animData = {\n attributes: [],\n maxFPS: 1000 / game.settings.get(\"core\", \"maxFPS\"),\n lastTimespan: performance.now(),\n totalDt: 0,\n };\n\n let overallDuration = this._duration ? this._duration : 0;\n const originLocation = canvaslib.get_object_position(this._originObject, {\n exact: true,\n });\n\n if (this._rotateTowards) {\n let offset =\n (this._angle ? this._angle : 0) + this._rotateTowards.rotationOffset;\n\n let targetLoc =\n this._moveTowards?.target ||\n this._teleportTo?.target ||\n this._originObject;\n\n targetLoc = this._closestSquare\n ? this._getClosestSquare(this._originObject, targetLoc)\n : canvaslib.get_object_position(targetLoc, { exact: true });\n\n targetLoc.x += this._offset.x;\n targetLoc.y += this._offset.y;\n\n if (this._snapToGrid) {\n targetLoc = this._snapLocationToGrid(targetLoc);\n }\n\n if (this._originObject instanceof TokenDocument) {\n setTimeout(async () => {\n let startLocation = this._originObject.object?.center ?? targetLoc;\n let targetLocation =\n this._rotateTowards.target?.object ?? this._rotateTowards.target;\n if (this._rotateTowards.towardsCenter) {\n targetLocation = targetLocation?.center ?? targetLocation;\n }\n let ray = new Ray(startLocation, targetLocation);\n let angle = Math.normalizeDegrees((ray.angle * 180) / Math.PI - 90);\n angle += offset;\n await this._updateObject(\n this._originObject,\n { rotation: angle },\n this._rotateTowards.duration > 0,\n {\n duration: this._rotateTowards.duration,\n easing: this._rotateTowards.ease,\n }\n );\n }, this._rotateTowards.delay ?? 0);\n } else {\n animData.attributes.push({\n name: \"rotationTowards\",\n offset: offset,\n origin: this._originObject,\n originLocation: targetLoc,\n target:\n this._rotateTowards.target?.object ?? this._rotateTowards.target,\n towardsCenter: this._rotateTowards.towardsCenter,\n from: false,\n to: false,\n progress: 0,\n done: false,\n duration: this._rotateTowards.duration,\n durationDone: 0,\n delay: this._rotateTowards.delay,\n ease: this._rotateTowards.ease,\n });\n }\n\n let rotateDuration =\n this._rotateTowards.duration + this._rotateTowards.delay;\n\n overallDuration =\n overallDuration > rotateDuration ? overallDuration : rotateDuration;\n }\n\n if (this._fadeIn) {\n let to = lib.is_real_number(this._opacity) ? this._opacity : 1.0;\n\n if (this._originObject instanceof TokenDocument) {\n setTimeout(async () => {\n await this._updateObject(this._originObject, { alpha: to }, true, {\n duration: this._fadeIn.duration,\n easing: this._fadeIn.ease,\n });\n }, this._fadeIn.delay ?? 0);\n } else {\n animData.attributes.push({\n name: \"alpha\",\n from: 0.0,\n to: to,\n progress: 0,\n done: false,\n duration: this._fadeIn.duration,\n durationDone: 0,\n delay: this._fadeIn.delay,\n ease: this._fadeIn.ease,\n });\n }\n\n let fadeDuration = this._fadeIn.duration + this._fadeIn.delay;\n\n overallDuration =\n overallDuration > fadeDuration ? overallDuration : fadeDuration;\n }\n\n if (this._fadeInAudio && this._originObject?.video?.volume !== undefined) {\n let to = lib.is_real_number(this._volume) ? this._volume : 1.0;\n\n animData.attributes.push({\n name: \"video.volume\",\n from: 0.0,\n to: to,\n progress: 0,\n done: false,\n duration: this._fadeInAudio.duration,\n durationDone: 0,\n delay: this._fadeInAudio.delay,\n ease: this._fadeInAudio.ease,\n });\n\n let fadeDuration = this._fadeInAudio.duration + this._fadeInAudio.delay;\n\n overallDuration =\n overallDuration > fadeDuration ? overallDuration : fadeDuration;\n }\n\n if (this._rotateIn) {\n let from = this._angle ? this._angle : this._originObject.rotation;\n let to = this._rotateIn.value;\n\n if (Math.abs(from - to) > 180) {\n if (to < 0) {\n to += 360;\n } else if (from > to) {\n from -= 360;\n }\n }\n\n if (this._originObject instanceof TokenDocument) {\n setTimeout(async () => {\n if (this._originObject.rotation !== from) {\n await this._updateObject(\n this._originObject,\n { rotation: from },\n false\n );\n }\n await this._updateObject(this._originObject, { rotation: to }, true, {\n duration: this._rotateIn.duration,\n easing: this._rotateIn.ease,\n });\n }, this._rotateIn.delay ?? 0);\n } else {\n animData.attributes.push({\n name: \"rotation\",\n from: from,\n to: to,\n progress: 0,\n done: false,\n duration: this._rotateIn.duration,\n durationDone: 0,\n delay: this._rotateIn.delay,\n ease: this._rotateIn.ease,\n });\n }\n\n let rotateDuration = this._rotateIn.duration + this._rotateIn.delay;\n\n overallDuration =\n overallDuration > rotateDuration ? overallDuration : rotateDuration;\n }\n\n if (this._moveTowards) {\n let originLocation = canvaslib.get_object_position(this._originObject, {\n exact: true,\n });\n let targetLocation = this._closestSquare\n ? this._getClosestSquare(this._originObject, this._moveTowards.target)\n : canvaslib.get_object_position(this._moveTowards.target, {\n exact: true,\n });\n\n targetLocation.x += this._offset.x;\n targetLocation.y += this._offset.y;\n targetLocation.elevation =\n targetLocation?.elevation ?? this._originObject?.elevation;\n\n if (this._moveTowards.relativeToCenter) {\n const dimensions = canvaslib.get_object_dimensions(this._originObject);\n targetLocation.x -= dimensions.width / 2;\n targetLocation.y -= dimensions.height / 2;\n if (this._snapToGrid) {\n targetLocation.x -= 0.01;\n targetLocation.y -= 0.01;\n }\n }\n\n if (this._snapToGrid) {\n targetLocation = this._snapLocationToGrid(targetLocation);\n }\n\n let originalDx = targetLocation.x - originLocation.x;\n let originalDy = targetLocation.y - originLocation.y;\n let originalDistance = Math.sqrt(\n originalDx * originalDx + originalDy * originalDy\n );\n\n let duration = this._duration\n ? this._duration\n : (originalDistance / this._moveSpeed) * animData.maxFPS;\n\n let moveDuration = duration + this._moveTowards.delay;\n\n overallDuration =\n overallDuration > moveDuration ? overallDuration : moveDuration;\n\n if (this._originObject instanceof TokenDocument) {\n setTimeout(async () => {\n await this._updateObject(this._originObject, targetLocation, true, {\n movementSpeed: this._moveSpeed,\n duration,\n easing: this._moveTowards.ease,\n });\n }, this._moveTowards.delay ?? 0);\n } else {\n if (!(duration === 0 || originalDistance === 0)) {\n animData.attributes.push({\n name: \"position\",\n origin: originLocation,\n target: targetLocation,\n originalDistance: originalDistance,\n currentDistance: 0,\n progress: 0,\n speed: 0,\n duration: duration,\n done: false,\n ease: this._moveTowards.ease,\n delay: this._moveTowards.delay,\n });\n }\n }\n }\n\n if (this._fadeOut) {\n let from = lib.is_real_number(this._opacity)\n ? this._opacity\n : this._originObject.alpha ?? 1.0;\n\n if (this._originObject instanceof TokenDocument) {\n setTimeout(async () => {\n await this._updateObject(this._originObject, { alpha: 0 }, true, {\n duration: this._fadeOut.duration,\n easing: this._fadeOut.ease,\n });\n }, this._fadeOut.delay ?? 0);\n } else {\n animData.attributes.push({\n name: \"alpha\",\n from: from,\n to: 0.0,\n progress: 0,\n done: false,\n duration: this._fadeOut.duration,\n durationDone: 0,\n delay: overallDuration - this._fadeOut.duration,\n ease: this._fadeOut.ease,\n });\n }\n\n let fadeOutDuration = this._fadeOut.duration + this._fadeOut.delay;\n\n overallDuration =\n overallDuration > fadeOutDuration ? overallDuration : fadeOutDuration;\n }\n\n if (this._fadeOutAudio && this._originObject?.video?.volume !== undefined) {\n let from = lib.is_real_number(this._volume)\n ? this._volume\n : this._originObject.video.volume;\n\n animData.attributes.push({\n name: \"video.volume\",\n from: from,\n to: 0.0,\n progress: 0,\n done: false,\n duration: this._fadeOutAudio.duration,\n durationDone: 0,\n delay: overallDuration - this._fadeOutAudio.duration,\n ease: this._fadeOutAudio.ease,\n });\n\n let fadeOutAudioDuration =\n this._fadeOutAudio.duration + this._fadeOutAudio.delay;\n\n overallDuration =\n overallDuration > fadeOutAudioDuration\n ? overallDuration\n : fadeOutAudioDuration;\n }\n\n if (this._rotateOut) {\n let from = this._rotateOut.value;\n let to = this._angle ? this._angle : this._originObject.rotation;\n\n if (this._rotateIn) from += this._rotateIn.value;\n\n if (Math.abs(from - to) > 180) {\n if (to < 0) {\n to += 360;\n } else if (from > to) {\n from -= 360;\n }\n }\n\n if (this._originObject instanceof TokenDocument) {\n setTimeout(async () => {\n if (this._originObject.rotation !== from) {\n await this._updateObject(\n this._originObject,\n { rotation: from },\n false\n );\n }\n await this._updateObject(this._originObject, { rotation: to }, true, {\n duration: this._rotateOut.duration,\n easing: this._rotateOut.ease,\n });\n }, this._rotateOut.delay ?? 0);\n } else {\n animData.attributes.push({\n name: \"rotation\",\n from: from,\n to: to,\n progress: 0,\n done: false,\n duration: this._rotateOut.duration,\n durationDone: 0,\n delay: overallDuration - this._rotateOut.duration,\n ease: this._rotateOut.ease,\n });\n }\n\n let rotateOutDuration = this._rotateOut.duration + this._rotateOut.delay;\n\n overallDuration =\n overallDuration > rotateOutDuration\n ? overallDuration\n : rotateOutDuration;\n }\n\n if (this._teleportTo) {\n setTimeout(async () => {\n let targetLocation = this._closestSquare\n ? this._getClosestSquare(this._originObject, this._teleportTo.target)\n : canvaslib.get_object_position(this._teleportTo.target, {\n exact: true,\n });\n if (targetLocation.x === undefined) targetLocation.x = originLocation.x;\n if (targetLocation.y === undefined) targetLocation.y = originLocation.y;\n if (targetLocation.elevation === undefined)\n targetLocation.elevation = originLocation.elevation;\n targetLocation.x += this._offset.x;\n targetLocation.y += this._offset.y;\n targetLocation.elevation =\n targetLocation?.elevation ?? this._originObject?.elevation;\n const dimensions = canvaslib.get_object_dimensions(this._originObject);\n if (this._teleportTo.relativeToCenter) {\n targetLocation.x -= dimensions.width / 2;\n targetLocation.y -= dimensions.height / 2;\n if (this._snapToGrid) {\n targetLocation.x -= 0.01;\n targetLocation.y -= 0.01;\n }\n }\n if (this._snapToGrid) {\n targetLocation.x -= dimensions.width / 2;\n targetLocation.y -= dimensions.height / 2;\n targetLocation = this._snapLocationToGrid(targetLocation);\n }\n await this._updateObject(this._originObject, targetLocation, false);\n }, this._teleportTo.delay);\n if (overallDuration <= this._teleportTo.delay) {\n this._waitUntilFinished = true;\n }\n overallDuration =\n overallDuration > this._teleportTo.delay\n ? overallDuration\n : this._teleportTo.delay;\n }\n\n let updateAttributes = {};\n if (\n lib.is_real_number(this._angle) &&\n !this._rotateIn &&\n !this._rotateOut\n ) {\n updateAttributes[\"rotation\"] = this._angle;\n }\n\n if (lib.is_real_number(this._opacity) && !this._fadeIn && !this._fadeOut) {\n updateAttributes[\"alpha\"] = this._opacity;\n }\n\n if (\n lib.is_real_number(this._volume) &&\n !this._fadeInAudio &&\n !this._fadeOutAudio &&\n this._originObject?.video?.volume !== undefined\n ) {\n updateAttributes[\"video.volume\"] = this._volume;\n }\n\n if (this._tint) {\n updateAttributes[\"tint\"] = this._tint.hexadecimal;\n }\n\n if (this._hide !== undefined) {\n updateAttributes[\"hidden\"] = this._hide;\n }\n\n if (Object.keys(updateAttributes).length) {\n await lib.wait(1);\n await this._updateObject(this._originObject, updateAttributes);\n await lib.wait(1);\n }\n\n return new Promise(async (resolve) => {\n this._animate(animData, resolve);\n setTimeout(\n resolve,\n Math.max(0, overallDuration + this._currentWaitTime + animData.maxFPS)\n );\n });\n }\n\n /**\n * @private\n */\n async _animate(animData, resolve, timespan) {\n // If it's not the first tick\n if (timespan) {\n let animatedAttributes = {};\n\n let dt = timespan - animData.lastTimespan;\n\n // Limit to set FPS\n if (dt >= animData.maxFPS) {\n animData.totalDt += dt;\n\n for (let attribute of animData.attributes) {\n if (attribute.done) continue;\n\n if (animData.totalDt < attribute.delay) continue;\n\n if (attribute.name === \"position\") {\n attribute.speed =\n attribute.originalDistance / (attribute.duration / dt);\n\n attribute.currentDistance += attribute.speed;\n\n attribute.progress =\n attribute.currentDistance / attribute.originalDistance;\n\n let x = lib.interpolate(\n attribute.origin.x,\n attribute.target.x,\n attribute.progress,\n attribute.ease\n );\n let y = lib.interpolate(\n attribute.origin.y,\n attribute.target.y,\n attribute.progress,\n attribute.ease\n );\n\n if (attribute.currentDistance >= attribute.originalDistance) {\n x = attribute.target.x;\n y = attribute.target.y;\n attribute.done = true;\n }\n\n animatedAttributes[\"x\"] = x;\n animatedAttributes[\"y\"] = y;\n } else {\n if (\n attribute.name === \"rotationTowards\" &&\n !attribute.from &&\n !attribute.to\n ) {\n let target = attribute.target;\n if (this._rotateTowards.towardsCenter)\n target = target?.center ?? target;\n let ray = new Ray(attribute.originLocation, target);\n let angle = (ray.angle * 180) / Math.PI - 90;\n angle += attribute.offset;\n attribute.from = attribute.origin.rotation;\n attribute.to = angle;\n if (Math.abs(attribute.from - attribute.to) > 180) {\n if (attribute.to < 0) {\n attribute.to += 360;\n } else if (attribute.from > attribute.to) {\n attribute.from -= 360;\n }\n }\n attribute.name = \"rotation\";\n }\n\n attribute.durationDone += dt;\n\n attribute.progress = attribute.durationDone / attribute.duration;\n\n let val = lib.interpolate(\n attribute.from,\n attribute.to,\n attribute.progress,\n attribute.ease\n );\n\n if (attribute.progress >= 1.0) {\n val = attribute.to;\n attribute.done = true;\n }\n\n animatedAttributes[attribute.name] = val;\n }\n }\n\n if (Object.keys(animatedAttributes).length > 0) {\n await this._updateObject(this._originObject, animatedAttributes);\n }\n\n animData.attributes = animData.attributes.filter((a) => !a.done);\n\n if (animData.attributes.length === 0) return;\n\n animData.lastTimespan = timespan;\n }\n }\n\n let self = this;\n requestAnimationFrame(function (timespan) {\n self._animate(animData, resolve, timespan);\n });\n }\n}\n\nexport default AnimationSection;\n","import Section from \"./section.js\";\nimport traits from \"./traits/_traits.js\";\nimport * as lib from \"../lib/lib.js\";\nimport * as canvaslib from \"../lib/canvas-lib.js\";\nimport SequencerFoundryReplicator from \"../modules/sequencer-foundry-replicator.js\";\n\nexport default class ScrollingTextSection extends Section {\n constructor(inSequence, target, text, textOptions) {\n super(inSequence);\n this._deserializedData = null;\n this._source = null;\n this._text = \"\";\n this._duration = 2000;\n this._distance = null;\n this._jitter = 0;\n this._anchor = null;\n this._direction = null;\n this._seed = lib.get_hash(randomID());\n if (target) {\n this.atLocation(target);\n }\n if (text) {\n this.text(text, textOptions);\n }\n }\n\n static niceName = \"Scrolling Text\";\n\n /**\n * @private\n */\n _applyTraits() {\n Object.assign(this.constructor.prototype, traits.users);\n Object.assign(this.constructor.prototype, traits.location);\n Object.assign(this.constructor.prototype, traits.offset);\n Object.assign(this.constructor.prototype, traits.text);\n }\n\n direction(inDirection) {\n if (!(typeof inDirection === \"string\" || lib.is_real_number(inDirection))) {\n throw this.sequence._customError(\n this,\n \"direction\",\n \"inDirection must be of type string (CONST.TEXT_ANCHOR_POINTS) or number\"\n );\n }\n if (\n typeof inDirection === \"string\" &&\n !CONST.TEXT_ANCHOR_POINTS[inDirection]\n ) {\n throw this.sequence._customError(\n this,\n \"direction\",\n `${inDirection} does not exist in CONST.TEXT_ANCHOR_POINTS!`\n );\n } else if (typeof inDirection === \"string\") {\n this._direction = CONST.TEXT_ANCHOR_POINTS[inDirection];\n } else {\n this._direction = inDirection;\n }\n return this;\n }\n\n anchor(inAnchor) {\n if (!(typeof inAnchor === \"string\" || lib.is_real_number(inAnchor))) {\n throw this.sequence._customError(\n this,\n \"direction\",\n \"inAnchor must be of type string (CONST.TEXT_ANCHOR_POINTS) or number\"\n );\n }\n if (\n (typeof inAnchor === \"string\" && !CONST.TEXT_ANCHOR_POINTS[inAnchor]) ||\n (lib.is_real_number(inAnchor) &&\n !Object.values(CONST.TEXT_ANCHOR_POINTS).includes(inAnchor))\n ) {\n throw this.sequence._customError(\n this,\n \"direction\",\n `${inAnchor} does not exist in CONST.TEXT_ANCHOR_POINTS!`\n );\n } else if (typeof inAnchor === \"string\") {\n this._anchor = CONST.TEXT_ANCHOR_POINTS[inAnchor];\n } else {\n this._anchor = inAnchor;\n }\n return this;\n }\n\n jitter(inJitter) {\n if (!(lib.is_real_number(inJitter) && inJitter >= 0 && inJitter <= 1.0)) {\n throw this.sequence._customError(\n this,\n \"jitter\",\n \"inJitter must be of type number between 0 and 1\"\n );\n }\n this._jitter = inJitter;\n return this;\n }\n\n async run() {\n const data = await this._sanitizeTextData();\n if (Hooks.call(\"preCreateScrollingText\", data) === false) return;\n const push =\n !(data?.users?.length === 1 && data?.users?.includes(game.userId)) &&\n !this.sequence.localOnly;\n const duration = SequencerFoundryReplicator.playScrollingText(data, push);\n await new Promise((resolve) =>\n setTimeout(resolve, this._currentWaitTime + duration)\n );\n }\n\n _getSourceObject() {\n if (!this._source || typeof this._source !== \"object\") return this._source;\n return (\n lib.get_object_identifier(this._source) ??\n canvaslib.get_object_canvas_data(this._source)\n );\n }\n\n async _sanitizeTextData() {\n if (this._deserializedData) {\n return this._deserializedData;\n }\n\n return {\n sceneId: game.user.viewedScene,\n seed: this._seed,\n sequenceId: this.sequence.id,\n creatorUserId: game.userId,\n users: this._users ? Array.from(this._users) : false,\n moduleName: this.sequence.moduleName,\n source: this._getSourceObject(),\n offset: this._offset?.source ?? false,\n randomOffset: this._randomOffset?.source ?? false,\n content: this._text?.text ?? \"\",\n options: {\n anchor: this._anchor,\n direction: this._direction,\n duration: this._duration,\n distance: this._distance,\n jitter: this._jitter,\n ...this._text,\n },\n };\n }\n\n async _serialize() {\n const data = await super._serialize();\n const sectionData = await this._sanitizeTextData();\n return {\n ...data,\n type: \"scrollingText\",\n sectionData,\n };\n }\n\n async _deserialize(data) {\n this._deserializedData = data.sectionData;\n return super._deserialize(data);\n }\n}\n","import Section from \"./section.js\";\nimport traits from \"./traits/_traits.js\";\nimport * as lib from \"../lib/lib.js\";\nimport { is_real_number } from \"../lib/lib.js\";\nimport * as canvaslib from \"../lib/canvas-lib.js\";\nimport SequencerFoundryReplicator from \"../modules/sequencer-foundry-replicator.js\";\n\nexport default class CanvasPanSection extends Section {\n constructor(inSequence, target, duration, scale) {\n super(inSequence);\n this._deserializedData = null;\n this._source = null;\n this._duration = duration ?? 250;\n this._speed = null;\n this._scale = scale ?? 1.0;\n this._lockView = null;\n this._shake = null;\n this._seed = lib.get_hash(randomID());\n if (target) {\n this.atLocation(target);\n }\n }\n\n static niceName = \"Canvas Pan\";\n\n /**\n * @private\n */\n _applyTraits() {\n Object.assign(this.constructor.prototype, traits.users);\n Object.assign(this.constructor.prototype, traits.location);\n Object.assign(this.constructor.prototype, traits.offset);\n }\n\n /**\n * Sets the speed (pixels per frame) of the canvas pan\n *\n * @param {number} inSpeed\n * @returns this\n */\n speed(inSpeed) {\n if (!is_real_number(inSpeed))\n throw this.sequence._customError(\n this,\n \"speed\",\n \"inSpeed must be of type number\"\n );\n if (inSpeed < 0) {\n throw this.sequence._customError(\n this,\n \"speed\",\n \"inSpeed must be greater or equal to 0\"\n );\n }\n this._speed = inSpeed;\n return this;\n }\n\n /**\n * Sets the zoom level of the canvas pan\n *\n * @param {number} inScale\n * @returns this\n */\n scale(inScale) {\n if (!is_real_number(inScale))\n throw this.sequence._customError(\n this,\n \"scale\",\n \"inScale must be of type number\"\n );\n if (inScale <= 0) {\n throw this.sequence._customError(\n this,\n \"scale\",\n \"inScale must be greater than 0\"\n );\n }\n this._scale = inScale;\n return this;\n }\n\n /**\n * Locks the canvas at the given location for the given duration\n *\n * @param {number} inDuration\n * @returns this\n */\n lockView(inDuration) {\n if (!is_real_number(inDuration))\n throw this.sequence._customError(\n this,\n \"lockView\",\n \"inDuration must be of type number\"\n );\n if (inDuration < 0) {\n throw this.sequence._customError(\n this,\n \"lockView\",\n \"inDuration must be greater or equal to 0\"\n );\n }\n this._lockView = inDuration;\n return this;\n }\n\n /**\n * Shakes the canvas\n *\n * @param {number} duration\n * @param {number} strength\n * @param {number} frequency\n * @param {number} fadeInDuration\n * @param {number} fadeOutDuration\n * @param {boolean} rotation\n * @returns this\n */\n shake({\n duration = 250,\n strength = 20,\n frequency = 10,\n fadeInDuration = 0,\n fadeOutDuration = 200,\n rotation = true,\n } = {}) {\n if (!is_real_number(duration)) {\n throw this.sequence._customError(\n this,\n \"shake\",\n \"duration must be of type number\"\n );\n }\n if (!is_real_number(strength)) {\n throw this.sequence._customError(\n this,\n \"shake\",\n \"strength must be of type number\"\n );\n }\n if (!is_real_number(strength)) {\n throw this.sequence._customError(\n this,\n \"shake\",\n \"frequency must be of type number\"\n );\n }\n if (!is_real_number(fadeInDuration)) {\n throw this.sequence._customError(\n this,\n \"shake\",\n \"fadeInDuration must be of type number\"\n );\n }\n if (!is_real_number(fadeOutDuration)) {\n throw this.sequence._customError(\n this,\n \"shake\",\n \"fadeOutDuration must be of type number\"\n );\n }\n if (typeof rotation !== \"boolean\") {\n throw this.sequence._customError(\n this,\n \"shake\",\n \"rotation must be of type boolean\"\n );\n }\n this._shake = {\n duration,\n strength,\n frequency,\n fadeInDuration,\n fadeOutDuration,\n rotation,\n };\n return this;\n }\n\n async run() {\n const data = await this._sanitizeData();\n if (Hooks.call(\"preCanvasPan\", data) === false) return;\n const push =\n !(data?.users?.length === 1 && data?.users?.includes(game.userId)) &&\n !this.sequence.localOnly;\n const duration = SequencerFoundryReplicator.panCanvas(data, push);\n await new Promise((resolve) =>\n setTimeout(resolve, this._currentWaitTime + duration)\n );\n }\n\n _getSourceObject() {\n if (!this._source || typeof this._source !== \"object\") return this._source;\n return (\n lib.get_object_identifier(this._source) ??\n canvaslib.get_object_canvas_data(this._source)\n );\n }\n\n async _sanitizeData() {\n if (this._deserializedData) {\n return this._deserializedData;\n }\n\n return {\n sceneId: game.user.viewedScene,\n seed: this._seed,\n sequenceId: this.sequence.id,\n creatorUserId: game.userId,\n users: this._users ? Array.from(this._users) : false,\n moduleName: this.sequence.moduleName,\n source: this._getSourceObject(),\n offset: this._offset?.source ?? false,\n randomOffset: this._randomOffset?.source ?? false,\n duration: this._duration,\n speed: this._speed,\n scale: this._scale,\n lockView: this._lockView,\n shake: this._shake,\n };\n }\n\n async _serialize() {\n const data = await super._serialize();\n const sectionData = await this._sanitizeData();\n return {\n ...data,\n type: \"canvasPan\",\n sectionData,\n };\n }\n\n async _deserialize(data) {\n this._deserializedData = data.sectionData;\n return super._deserialize(data);\n }\n}\n","import * as lib from \"../lib/lib.js\";\nimport Section from \"./section.js\";\n\nexport default class WaitSection extends Section {\n constructor(inSequence, msMin, msMax) {\n super(inSequence);\n this._waitUntilFinished = true;\n this._waitDuration = lib.random_int_between(msMin, Math.max(msMin, msMax));\n }\n\n static niceName = \"Wait\";\n\n /**\n * @returns {Promise<void>}\n */\n async run() {\n lib.debug(\"Running wait\");\n await new Promise(async (resolve) => {\n setTimeout(resolve, this._waitDuration);\n });\n }\n\n /**\n * @returns {Promise}\n * @private\n */\n async _execute() {\n await this.run();\n }\n\n async _serialize() {\n const data = await super._serialize();\n return {\n ...data,\n type: \"wait\",\n sectionData: {\n waitDuration: this._waitDuration,\n },\n };\n }\n\n async _deserialize(data) {\n this._waitDuration = data.sectionData.waitDuration;\n return super._deserialize(data);\n }\n}\n","import * as lib from \"../lib/lib.js\";\nimport FunctionSection from \"../sections/func.js\";\nimport EffectSection from \"../sections/effect.js\";\nimport SoundSection from \"../sections/sound.js\";\nimport AnimationSection from \"../sections/animation.js\";\nimport Section from \"../sections/section.js\";\nimport SequencerPresets from \"./sequencer-presets.js\";\nimport ScrollingTextSection from \"../sections/scrollingText.js\";\nimport { sequencerSocket, SOCKET_HANDLERS } from \"../sockets.js\";\nimport CanvasPanSection from \"../sections/canvasPan.js\";\nimport SequenceManager from \"./sequence-manager.js\";\nimport { get, writable } from \"svelte/store\";\nimport CONSTANTS from \"../constants.js\";\nimport WaitSection from \"../sections/wait.js\";\n\nexport default class Sequence {\n constructor(\n options = {\n moduleName: \"Sequencer\",\n softFail: false,\n },\n softFail = false\n ) {\n this.id = randomID();\n this.moduleName =\n typeof options === \"string\"\n ? options\n : options?.moduleName ?? \"Sequencer\";\n this.softFail = options?.softFail ?? softFail;\n this.sections = [];\n this.nameOffsetMap = false;\n this.effectIndex = 0;\n this.sectionToCreate = undefined;\n this.localOnly = false;\n this._status = writable(CONSTANTS.STATUS.READY);\n return lib.sequence_proxy_wrap(this);\n }\n\n /**\n * Plays all of this sequence's sections\n *\n * @returns {Promise}\n */\n async play({ remote = false } = {}) {\n if (remote) {\n this.localOnly = true;\n const data = await this.toJSON();\n sequencerSocket.executeForOthers(\n SOCKET_HANDLERS.RUN_SEQUENCE_LOCALLY,\n data\n );\n return new Sequence().fromJSON(data).play();\n }\n Hooks.callAll(\"createSequencerSequence\", this);\n lib.debug(\"Initializing sections\");\n for (let section of this.sections) {\n await section._initialize();\n }\n SequenceManager.RunningSequences.add(this.id, this);\n this.effectIndex = 0;\n lib.debug(\"Playing sections\");\n this.status = CONSTANTS.STATUS.RUNNING;\n const promises = [];\n for (let section of this.sections) {\n if (section instanceof EffectSection) this.effectIndex++;\n if (section.shouldWaitUntilFinished) {\n promises.push(await section._execute());\n } else {\n promises.push(section._execute());\n }\n if (get(this.status) === CONSTANTS.STATUS.ABORTED) {\n continue;\n }\n if (!section._isLastSection) {\n await new Promise((resolve) => setTimeout(resolve, 1));\n }\n }\n\n return Promise.allSettled(promises).then(() => {\n Hooks.callAll(\"endedSequencerSequence\");\n lib.debug(\"Finished playing sections\");\n this.status = CONSTANTS.STATUS.COMPLETE;\n });\n }\n\n /**\n * Creates a section that will run a function.\n *\n * @param {function} inFunc\n * @returns {Sequence} this\n */\n thenDo(inFunc) {\n const func = lib.section_proxy_wrap(new FunctionSection(this, inFunc));\n this.sections.push(func);\n return func;\n }\n\n /**\n * Creates a section that will run a macro based on a name or a direct reference to a macro.\n *\n * @param {string|Macro} inMacro\n * @param {object} args\n * @returns {Sequence} this\n */\n macro(inMacro, ...args) {\n let macro;\n let compendium = false;\n if (typeof inMacro === \"string\") {\n if (inMacro.startsWith(\"Compendium\")) {\n let packArray = inMacro.split(\".\");\n let pack = game.packs.get(`${packArray[1]}.${packArray[2]}`);\n // Catch invalid compendium pack\n if (!pack) {\n if (this.softFail) {\n return this;\n }\n throw lib.custom_error(\n this.moduleName,\n `macro - Compendium '${packArray[1]}.${packArray[2]}' was not found`\n );\n }\n macro = packArray;\n compendium = pack;\n } else {\n macro = game.macros.getName(inMacro);\n if (!macro) {\n if (this.softFail) {\n return this;\n }\n throw lib.custom_error(\n this.moduleName,\n `macro - Macro '${inMacro}' was not found`\n );\n }\n }\n } else if (inMacro instanceof Macro) {\n macro = inMacro;\n } else {\n throw lib.custom_error(\n this.moduleName,\n `macro - inMacro must be of instance string or Macro`\n );\n }\n\n if (isNewerVersion(game.version, \"11\")) {\n args = args.length ? args?.[0] : {};\n if (typeof args !== \"object\") {\n throw lib.custom_error(\n this.moduleName,\n `macro - Secondary argument must be an object`\n );\n }\n } else if (\n args &&\n args.length &&\n !game.modules.get(\"advanced-macros\")?.active\n ) {\n lib.custom_warning(\n this.moduleName,\n `macro - Supplying macros with arguments require the advanced-macros module to be active`,\n true\n );\n }\n\n const func = lib.section_proxy_wrap(\n new FunctionSection(\n this,\n async () => {\n if (compendium) {\n const macroData = (await compendium.getDocuments())\n .find((i) => i.name === macro[3])\n ?.toObject();\n if (!macroData) {\n if (this.softFail) {\n return;\n }\n throw lib.custom_error(\n this.moduleName,\n `macro - Macro '${macro[3]}' was not found in compendium '${macro[1]}.${macro[2]}'`\n );\n }\n macro = new Macro(macroData);\n macro.ownership.default = CONST.DOCUMENT_PERMISSION_LEVELS.OWNER;\n }\n\n if (isNewerVersion(game.version, \"11\")) {\n await macro.execute(args);\n } else {\n const version = game.modules.get(\"advanced-macros\")?.version;\n const bugAdvancedMacros =\n game.modules.get(\"advanced-macros\")?.active &&\n isNewerVersion(\n version.startsWith(\"v\") ? version.slice(1) : version,\n \"1.18.2\"\n ) &&\n !isNewerVersion(\n version.startsWith(\"v\") ? version.slice(1) : version,\n \"1.19.1\"\n );\n if (bugAdvancedMacros) {\n await macro.execute([...args]);\n } else {\n await macro.execute(...args);\n }\n }\n },\n true\n )\n );\n this.sections.push(func);\n return this;\n }\n\n /**\n * Creates an effect section. Until you call .then(), .effect(), .sound(), or .wait(), you'll be working on the Effect section.\n *\n * @param {string} [inFile] inFile\n * @returns {Section}\n */\n effect(inFile = \"\") {\n const effect = lib.section_proxy_wrap(new EffectSection(this, inFile));\n this.sections.push(effect);\n return effect;\n }\n\n /**\n * Creates a sound section. Until you call .then(), .effect(), .sound(), or .wait(), you'll be working on the Sound section.\n *\n * @param {string} [inFile] inFile\n * @returns {Section}\n */\n sound(inFile = \"\") {\n const sound = lib.section_proxy_wrap(new SoundSection(this, inFile));\n this.sections.push(sound);\n return sound;\n }\n\n /**\n * Creates an animation. Until you call .then(), .effect(), .sound(), or .wait(), you'll be working on the Animation section.\n *\n * @param {Token|Tile} [inTarget=false] inTarget\n * @returns {AnimationSection}\n */\n animation(inTarget) {\n const animation = lib.section_proxy_wrap(\n new AnimationSection(this, inTarget)\n );\n this.sections.push(animation);\n return animation;\n }\n\n /**\n * Creates a scrolling text. Until you call .then(), .effect(), .sound(), or .wait(), you'll be working on the Scrolling Text section.\n *\n * @param {Object|String|Boolean} [inTarget=false] inTarget\n * @param {String|Boolean} [inText=false] inText\n * @param {Object} [inTextOptions={}] inTextOptions\n * @returns {AnimationSection}\n */\n scrollingText(inTarget = false, inText = false, inTextOptions = {}) {\n const scrolling = lib.section_proxy_wrap(\n new ScrollingTextSection(this, inTarget, inText, inTextOptions)\n );\n this.sections.push(scrolling);\n return scrolling;\n }\n\n /**\n * Pans the canvas text. Until you call any other sections you'll be working on the Canvas Pan section.\n *\n * @param {Object|String|Boolean} [inTarget=false] inTarget\n * @param {Boolean|Number} inDuration\n * @param {Boolean|Number} inSpeed\n * @returns {AnimationSection}\n */\n canvasPan(inTarget = false, inDuration = null, inSpeed = null) {\n const panning = lib.section_proxy_wrap(\n new CanvasPanSection(this, inTarget)\n );\n this.sections.push(panning);\n return panning;\n }\n\n /**\n * Causes the sequence to wait after the last section for as many milliseconds as you pass to this method. If given\n * a second number, a random wait time between the two given numbers will be generated.\n *\n * @param {number} [msMin=1] minMs\n * @param {number} [msMax=1] maxMs\n * @returns {Sequence} this\n */\n wait(msMin = 1, msMax = 1) {\n if (msMin < 1)\n throw lib.custom_error(\n this.moduleName,\n `wait - Wait ms cannot be less than 1`\n );\n if (msMax < 1)\n throw lib.custom_error(\n this.moduleName,\n `wait - Max wait ms cannot be less than 1`\n );\n const section = lib.section_proxy_wrap(new WaitSection(this, msMin, msMax));\n this.sections.push(section);\n return this;\n }\n\n /**\n * Applies a preset to the sequence\n *\n * @param {string} presetName\n * @param {*} args\n * @returns {Sequence|FunctionSection|EffectSection|AnimationSection|SoundSection}\n */\n preset(presetName, ...args) {\n if (typeof presetName !== \"string\") {\n throw this._customError(this, \"name\", `inName must be of type string`);\n }\n const preset = SequencerPresets.get(presetName);\n if (!preset) {\n lib.custom_warning(\n \"Sequencer\",\n `preset | Could not find preset with name \"${presetName}\"`\n );\n return this;\n }\n const lastSection = this.sections[this.sections.length - 1];\n return preset(lastSection, ...args);\n }\n\n /**\n * Adds the sections from a given Sequence to this Sequence\n *\n * @param {Sequence|FunctionSection|EffectSection|AnimationSection|SoundSection} inSequence\n * @returns {Sequence} this\n */\n addSequence(inSequence) {\n if (inSequence instanceof Section) inSequence = inSequence.sequence;\n if (!(inSequence instanceof Sequence)) {\n throw lib.custom_error(\n this.moduleName,\n `addSequence - could not find the sequence from the given parameter`\n );\n }\n const newSections = inSequence.sections.map((section) => {\n const newSection = Object.assign(\n Object.create(Object.getPrototypeOf(section)),\n section\n );\n newSection.sequence = this;\n return newSection;\n });\n this.sections = this.sections.concat(newSections);\n return this;\n }\n\n async toJSON() {\n const data = {\n options: { moduleName: this.moduleName, softFail: this.softFail },\n sections: [],\n };\n for (const section of this.sections) {\n const sectionData = await section._serialize();\n if (!sectionData.type) {\n throw new Error(\n `Sequencer | toJson | ${section.constructor.name} does not support serialization!`\n );\n }\n data.sections.push(sectionData);\n }\n return data;\n }\n\n fromJSON(data) {\n this.moduleName = data.options.moduleName;\n this.softFail = data.options.softFail;\n this.localOnly = true;\n for (const section of data.sections) {\n this[section.type]()._deserialize(section);\n }\n return this;\n }\n\n _createCustomSection(...args) {\n const func = lib.section_proxy_wrap(\n new this.sectionToCreate(this, ...args)\n );\n this.sectionToCreate = undefined;\n this.sections.push(func);\n return func;\n }\n\n _showWarning(self, func, warning, notify) {\n lib.custom_warning(\n this.moduleName,\n `${self.constructor.name.replace(\"Section\", \"\")} | ${func} - ${warning}`,\n notify\n );\n }\n\n _customError(self, func, error) {\n return lib.custom_error(\n this.moduleName,\n `${self.constructor.name.replace(\"Section\", \"\")} | ${func} - ${error}`\n );\n }\n\n set status(inStatus) {\n this._status.update((currentStatus) => {\n if (\n currentStatus === CONSTANTS.STATUS.READY ||\n currentStatus === CONSTANTS.STATUS.RUNNING\n ) {\n return inStatus;\n }\n return currentStatus;\n });\n }\n\n get status() {\n return this._status;\n }\n\n _abort() {\n this.status = CONSTANTS.STATUS.ABORTED;\n for (const section of this.sections) {\n section._abortSection();\n }\n }\n}\n","import { sequencerSocket, SOCKET_HANDLERS } from \"../sockets.js\";\nimport SequencerFileCache from \"./sequencer-file-cache.js\";\nimport LoadingBar from \"../utils/loadingBar.js\";\nimport * as lib from \"../lib/lib.js\";\n\nconst SequencerPreloader = {\n _usersToRespond: new Set(),\n _clientsDone: [],\n _resolve: () => {},\n\n /**\n * Caches provided file(s) locally, vastly improving loading speed of those files.\n *\n * @param {Array|String} inSrcs\n * @param {Boolean} showProgressBar\n * @returns {Promise<void>}\n */\n preload(inSrcs, showProgressBar = false) {\n if (Array.isArray(inSrcs)) {\n inSrcs.forEach((str) => {\n if (typeof str !== \"string\") {\n throw lib.custom_error(\n \"Sequencer\",\n \"preload | each entry in inSrcs must be of type string\"\n );\n }\n });\n } else if (typeof inSrcs !== \"string\") {\n throw lib.custom_error(\n \"Sequencer\",\n \"preload | inSrcs must be of type string or array of strings\"\n );\n }\n\n if (typeof showProgressBar !== \"boolean\") {\n throw lib.custom_error(\n \"Sequencer\",\n \"preload | showProgressBar must be of type of boolean\"\n );\n }\n\n const srcs = this._cleanSrcs(inSrcs);\n\n if (srcs.length === 0) return;\n\n return this._preloadLocal(srcs, showProgressBar);\n },\n\n /**\n * Causes each connected client (including the caller) to fetch and cache the provided file(s) locally, vastly\n * improving loading speed of those files.\n *\n * @param {Array|String} inSrcs\n * @param {Boolean} showProgressBar\n * @returns {Promise<void>}\n */\n preloadForClients(inSrcs, showProgressBar = false) {\n if (Array.isArray(inSrcs)) {\n inSrcs.forEach((str) => {\n if (typeof str !== \"string\") {\n throw lib.custom_error(\n \"Sequencer\",\n \"preloadForClients | each entry in inSrcs must be of type string\"\n );\n }\n });\n } else if (typeof inSrcs !== \"string\") {\n throw lib.custom_error(\n \"Sequencer\",\n \"preloadForClients | inSrcs must be of type string or array of strings\"\n );\n }\n\n if (typeof showProgressBar !== \"boolean\") {\n throw lib.custom_error(\n \"Sequencer\",\n \"preloadForClients | showProgressBar must be of type of boolean\"\n );\n }\n\n const srcs = this._cleanSrcs(inSrcs);\n\n if (srcs.length === 0) return;\n\n if (!lib.user_can_do(\"permissions-preload\")) {\n lib.custom_warning(\n \"Sequencer\",\n \"preloadForClients - You do not have permission to force other clients to preload. Preloading locally instead.\"\n );\n return this._preloadLocal(srcs, showProgressBar);\n }\n\n const promise = new Promise((resolve) => {\n this._resolve = resolve;\n });\n\n this._usersToRespond = new Set(\n game.users.filter((user) => user.active).map((user) => user.id)\n );\n\n sequencerSocket.executeForEveryone(\n SOCKET_HANDLERS.PRELOAD,\n game.user.id,\n srcs,\n showProgressBar\n );\n\n return promise;\n },\n\n async respond(inSenderId, inSrcs, showProgressBar) {\n const numFilesFailedToLoad = await this._preloadLocal(\n inSrcs,\n showProgressBar\n );\n return sequencerSocket.executeAsUser(\n SOCKET_HANDLERS.PRELOAD_RESPONSE,\n inSenderId,\n game.user.id,\n numFilesFailedToLoad\n );\n },\n\n handleResponse(inUserId, numFilesFailedToLoad) {\n this._usersToRespond.delete(inUserId);\n this._clientsDone.push({\n userId: inUserId,\n numFilesFailedToLoad: numFilesFailedToLoad,\n });\n if (this._usersToRespond.size > 0) return;\n\n this._clientsDone.forEach((user) => {\n if (user.numFilesFailedToLoad > 0) {\n lib.debug(\n `${\n game.users.get(user.userId).name\n } preloaded files, failed to preload ${\n user.numFilesFailedToLoad\n } files`\n );\n } else {\n lib.debug(\n `${game.users.get(user.userId).name} preloaded files successfully`\n );\n }\n });\n lib.debug(`All clients responded to file preloads`);\n\n this._resolve();\n\n this._usersToRespond = new Set();\n this._clientsDone = [];\n this._resolve = () => {};\n },\n\n /**\n * Filters and cleans up file paths given to the preload methods\n *\n * @private\n */\n _cleanSrcs(inSrcs) {\n if (!Array.isArray(inSrcs)) {\n inSrcs = [inSrcs];\n }\n\n if (inSrcs.length === 0) {\n lib.custom_warning(\"Sequencer\", \"You need to provide files to preload\");\n return [];\n }\n\n inSrcs = lib\n .make_array_unique(\n inSrcs.filter(Boolean).map((src) => {\n if (Sequencer.Database.entryExists(src)) {\n return Sequencer.Database.getAllFileEntries(src);\n }\n return src;\n })\n )\n .deepFlatten();\n\n if (inSrcs.length >= 750) {\n lib.custom_warning(\n \"Sequencer\",\n \"You are preloading over 750 files, you are most likely preloading more files than the system can cache.\",\n true\n );\n }\n\n return inSrcs;\n },\n\n /**\n * The method that actually preloads files locally, with an optional progress bar\n *\n * @private\n */\n _preloadLocal(inSrcs, showProgressBar) {\n let startTime = performance.now();\n let numFilesToLoad = inSrcs.length;\n\n lib.debug(`Preloading ${numFilesToLoad} files...`);\n if (showProgressBar)\n LoadingBar.init(\n `Sequencer - Preloading ${numFilesToLoad} files`,\n numFilesToLoad\n );\n\n return new Promise(async (resolve) => {\n let numFilesFailedToLoad = 0;\n for (let src of inSrcs) {\n const blob = await SequencerFileCache.loadFile(src, true);\n if (showProgressBar) LoadingBar.incrementProgress();\n if (!blob) {\n numFilesFailedToLoad++;\n }\n }\n const timeTaken = (performance.now() - startTime) / 1000;\n let failedToLoad = ` (${numFilesFailedToLoad} failed to load)`;\n lib.debug(\n `Preloading ${numFilesToLoad} files took ${timeTaken}s` + failedToLoad\n );\n resolve(numFilesFailedToLoad);\n });\n },\n};\n\nexport default SequencerPreloader;\n","import Section from \"../sections/section.js\";\nimport * as lib from \"../lib/lib.js\";\n\nexport default class SequencerSectionManager {\n constructor() {\n this.externalSections = {};\n }\n\n /**\n * Registers a class by a name that will then be available through the Sequencer\n *\n * @param {String} inModuleName\n * @param {String} inMethodName\n * @param {Class} inClass\n * @param {Boolean} overwrite\n * @returns {Boolean} Whether the registration succeeded\n */\n registerSection(inModuleName, inMethodName, inClass, overwrite = false) {\n if (!(inClass.prototype instanceof Section)) {\n throw lib.custom_error(\n inModuleName,\n `inClass must be instance of Sequencer.BaseSection`\n );\n }\n\n let coreMethods = Object.getOwnPropertyNames(Sequence.prototype).filter(\n (method) => {\n return !method.startsWith(\"_\") && method !== \"constructor\";\n }\n );\n\n if (coreMethods.includes(inMethodName)) {\n throw lib.custom_error(\n inModuleName,\n `${inMethodName} is an existing protected method of the Sequence class - please register with another method name!`\n );\n }\n\n if (this.externalSections[inMethodName] && !overwrite) {\n throw lib.custom_error(\n inModuleName,\n `${inMethodName} is already a registered Section with the class ${this.externalSections[inMethodName].constructor.name}`\n );\n }\n\n coreMethods = coreMethods.concat(Object.keys(this.externalSections));\n\n const clashingMethods = Object.getOwnPropertyNames(\n inClass.prototype\n ).filter((method) => coreMethods.includes(method));\n\n if (clashingMethods.length) {\n let errors = clashingMethods.join(\", \");\n throw lib.custom_error(\n inModuleName,\n `${inMethodName} cannot contain the following methods: ${errors}<br>These methods are existing methods on the Sequence or from already registered Sections. Please rename these methods to avoid conflicts.`\n );\n }\n\n lib.debug(\n `SectionManager | Successfully registered ${inMethodName} with Sequencer!`\n );\n\n this.externalSections[inMethodName] = inClass;\n\n return true;\n }\n}\n","// SPDX-License-Identifier: MIT\n// Copyright © 2021 fvtt-lib-wrapper Rui Pinheiro\n\n\"use strict\";\n\n// A shim for the libWrapper library\nexport let libWrapper = undefined;\n\nexport const VERSIONS = [1, 12, 2];\nexport const TGT_SPLIT_RE = new RegExp(\n \"([^.[]+|\\\\[('([^'\\\\\\\\]|\\\\\\\\.)+?'|\\\"([^\\\"\\\\\\\\]|\\\\\\\\.)+?\\\")\\\\])\",\n \"g\"\n);\nexport const TGT_CLEANUP_RE = new RegExp(\"(^\\\\['|'\\\\]$|^\\\\[\\\"|\\\"\\\\]$)\", \"g\");\n\n// Main shim code\nHooks.once(\"init\", () => {\n // Check if the real module is already loaded - if so, use it\n if (globalThis.libWrapper && !(globalThis.libWrapper.is_fallback ?? true)) {\n libWrapper = globalThis.libWrapper;\n return;\n }\n\n // Fallback implementation\n libWrapper = class {\n static get is_fallback() {\n return true;\n }\n\n static get WRAPPER() {\n return \"WRAPPER\";\n }\n static get MIXED() {\n return \"MIXED\";\n }\n static get OVERRIDE() {\n return \"OVERRIDE\";\n }\n\n static register(\n package_id,\n target,\n fn,\n type = \"MIXED\",\n { chain = undefined, bind = [] } = {}\n ) {\n const is_setter = target.endsWith(\"#set\");\n target = !is_setter ? target : target.slice(0, -4);\n const split = target\n .match(TGT_SPLIT_RE)\n .map((x) => x.replace(/\\\\(.)/g, \"$1\").replace(TGT_CLEANUP_RE, \"\"));\n const root_nm = split.splice(0, 1)[0];\n\n let obj, fn_name;\n if (split.length == 0) {\n obj = globalThis;\n fn_name = root_nm;\n } else {\n const _eval = eval;\n fn_name = split.pop();\n obj = split.reduce(\n (x, y) => x[y],\n globalThis[root_nm] ?? _eval(root_nm)\n );\n }\n\n let iObj = obj;\n let descriptor = null;\n while (iObj) {\n descriptor = Object.getOwnPropertyDescriptor(iObj, fn_name);\n if (descriptor) break;\n iObj = Object.getPrototypeOf(iObj);\n }\n if (!descriptor || descriptor?.configurable === false)\n throw new Error(\n `libWrapper Shim: '${target}' does not exist, could not be found, or has a non-configurable descriptor.`\n );\n\n let original = null;\n const wrapper =\n chain ?? (type.toUpperCase?.() != \"OVERRIDE\" && type != 3)\n ? function (...args) {\n return fn.call(this, original.bind(this), ...bind, ...args);\n }\n : function (...args) {\n return fn.call(this, ...bind, ...args);\n };\n if (!is_setter) {\n if (descriptor.value) {\n original = descriptor.value;\n descriptor.value = wrapper;\n } else {\n original = descriptor.get;\n descriptor.get = wrapper;\n }\n } else {\n if (!descriptor.set)\n throw new Error(\n `libWrapper Shim: '${target}' does not have a setter`\n );\n original = descriptor.set;\n descriptor.set = wrapper;\n }\n\n descriptor.configurable = true;\n Object.defineProperty(obj, fn_name, descriptor);\n }\n };\n});\n","import CONSTANTS from \"./constants.js\";\nimport { libWrapper } from \"./lib/libWrapper/shim.js\";\n\nexport default function registerLibwrappers() {\n const override = isNewerVersion(game.version, \"11\")\n ? \"PIXI.BaseImageResource.prototype.upload\"\n : \"PIXI.resources.BaseImageResource.prototype.upload\";\n libWrapper.register(CONSTANTS.MODULE_NAME, override, PIXIUPLOAD);\n}\n\nfunction PIXIUPLOAD(wrapped, ...args) {\n let baseTexture = args[1];\n\n if (\n baseTexture.sequencer_patched ||\n !game.settings.get(CONSTANTS.MODULE_NAME, \"enable-global-fix-pixi\")\n ) {\n return wrapped(...args);\n }\n\n let source = args[3];\n source = source || this.source;\n const isVideo = !!source.videoWidth;\n if (isVideo) {\n baseTexture.alphaMode = PIXI.ALPHA_MODES.PREMULTIPLIED_ALPHA;\n baseTexture.sequencer_patched = true;\n }\n return wrapped(...args);\n}\n","import CONSTANTS from \"./constants.js\";\nimport { custom_warning, debug } from \"./lib/lib.js\";\n\nexport default async function runMigrations() {\n const sortedMigrations = Object.entries(migrations).sort((a, b) => {\n return isNewerVersion(b[0], a[0]) ? -1 : 1;\n });\n\n for (const [version, migration] of sortedMigrations) {\n try {\n await migration(version);\n } catch (err) {\n custom_warning(\n \"Sequencer\",\n `Something went wrong when migrating to version ${version}. Please check the console for the error!`,\n true\n );\n console.error(err);\n }\n }\n}\n\nfunction getSequencerEffectTokens(version, tokenFilter = false) {\n return Array.from(game.scenes)\n .map((scene) => [\n scene,\n Array.from(scene.tokens)\n .filter((token) => token.isOwner)\n .filter((token, index) => {\n if (tokenFilter) {\n return tokenFilter(token, index);\n }\n const effects = getProperty(token, CONSTANTS.EFFECTS_FLAG) ?? [];\n const effectsOutOfDate = effects.filter((e) =>\n isNewerVersion(version, e[1].flagVersion)\n );\n return effectsOutOfDate.length;\n }),\n ])\n .filter(([_, tokens]) => tokens.length);\n}\n\nfunction getSequencerEffectActors(version, actorFilter = false) {\n return Array.from(game.actors)\n .filter((actor) => actor.isOwner)\n .filter((actor, index) => {\n if (actorFilter) {\n return actorFilter(actor, index);\n }\n const effects = getProperty(actor, CONSTANTS.EFFECTS_FLAG) ?? [];\n const effectsOutOfDate = effects.filter((e) =>\n isNewerVersion(version, e[1].flagVersion)\n );\n return effectsOutOfDate.length;\n });\n}\n\nconst migrations = {\n \"3.0.0\": async (version) => {\n const actorsToUpdate = getSequencerEffectActors(version, (actor) => {\n const effects =\n getProperty(actor, \"prototypeToken.\" + CONSTANTS.EFFECTS_FLAG) ?? [];\n const effectsOutOfDate = effects.filter((e) =>\n isNewerVersion(version, e[1].flagVersion)\n );\n return effectsOutOfDate.length;\n });\n\n const actorUpdateArray = actorsToUpdate.map((actor) => {\n const effectsToMoveFromTokenPrototype = getProperty(\n actor.prototypeToken,\n CONSTANTS.EFFECTS_FLAG\n )\n .filter(([_, effect]) => {\n return effect.persistOptions?.persistTokenPrototype;\n })\n .map(([id, effect]) => {\n effect.flagVersion = version;\n return [id, effect];\n });\n\n const effectsToKeepOnTokenPrototype = getProperty(\n actor.prototypeToken,\n CONSTANTS.EFFECTS_FLAG\n )\n .filter(([_, effect]) => {\n return !effect.persistOptions?.persistTokenPrototype;\n })\n .map(([id, effect]) => {\n effect.flagVersion = version;\n return [id, effect];\n });\n\n return {\n _id: actor.id,\n [CONSTANTS.EFFECTS_FLAG]: effectsToMoveFromTokenPrototype,\n [\"prototypeToken.\" + CONSTANTS.EFFECTS_FLAG]:\n effectsToKeepOnTokenPrototype,\n };\n });\n\n const tokensOnScenes = getSequencerEffectTokens(version, (t) => {\n let actor;\n try {\n actor = t.actor;\n } catch (err) {\n return false;\n }\n const effects = getProperty(t, CONSTANTS.EFFECTS_FLAG) ?? [];\n const prototypeTokenEffects =\n getProperty(actor, \"prototypeToken.\" + CONSTANTS.EFFECTS_FLAG) ?? [];\n const effectsOutOfDate = effects.filter((e) =>\n isNewerVersion(version, e[1].flagVersion)\n );\n const prototypeEffectsOutOfDate = prototypeTokenEffects.filter((e) =>\n isNewerVersion(version, e[1].flagVersion)\n );\n return (\n t.actorLink &&\n (effectsOutOfDate.length || prototypeEffectsOutOfDate.length)\n );\n });\n\n for (const [scene, tokens] of tokensOnScenes) {\n const updates = [];\n for (const token of tokens) {\n const effectsToKeepOnToken = getProperty(token, CONSTANTS.EFFECTS_FLAG)\n .filter(([_, effect]) => {\n return !effect.persistOptions?.persistTokenPrototype;\n })\n .map(([id, effect]) => {\n effect.flagVersion = version;\n return [id, effect];\n });\n\n updates.push({\n _id: token.id,\n [CONSTANTS.EFFECTS_FLAG]: effectsToKeepOnToken,\n });\n }\n\n if (updates.length) {\n debug(\n `Sequencer | Updated ${updates.length} tokens' effects on scene ${scene.id} to version ${version}`\n );\n await scene.updateEmbeddedDocuments(\"Token\", updates);\n }\n }\n\n if (actorUpdateArray.length) {\n debug(\n `Sequencer | Updated ${actorUpdateArray.length} actors' effects to version ${version}`\n );\n await Actor.updateDocuments(actorUpdateArray);\n }\n },\n};\n","import \"./styles/module.scss\";\n\nimport { registerSettings, migrateSettings } from \"./settings.js\";\nimport registerLayers from \"./layers.js\";\nimport registerHotkeys from \"./hotkeys.js\";\nimport registerTypes from \"../typings/typings.js\";\nimport { registerSocket } from \"./sockets.js\";\nimport { EASE, easeFunctions, registerEase } from \"./canvas-effects/ease.js\";\n\nimport Sequence from \"./modules/sequencer.js\";\nimport SequencerDatabase from \"./modules/sequencer-database.js\";\nimport SequencerPreloader from \"./modules/sequencer-preloader.js\";\nimport SequencerEffectManager from \"./modules/sequencer-effect-manager.js\";\nimport SequencerSectionManager from \"./modules/sequencer-section-manager.js\";\nimport {\n EffectPlayer,\n InteractionManager,\n} from \"./modules/sequencer-interaction-manager.js\";\nimport Section from \"./sections/section.js\";\nimport * as lib from \"./lib/lib.js\";\nimport { SequencerAboveUILayer } from \"./canvas-effects/effects-layer.js\";\nimport SequencerPresets from \"./modules/sequencer-presets.js\";\nimport registerLibwrappers from \"./libwrapper.js\";\nimport { DatabaseViewerApp } from \"./formapplications/database/database-viewer-app.js\";\nimport { EffectsUIApp } from \"./formapplications/effects-ui/effects-ui-app.js\";\nimport CONSTANTS from \"./constants.js\";\nimport { PlayerSettings } from \"./formapplications/effects-ui/effect-player-store.js\";\nimport runMigrations from \"./migrations.js\";\nimport SequencerFoundryReplicator from \"./modules/sequencer-foundry-replicator.js\";\n\nlet moduleValid = false;\nlet moduleReady = false;\nlet canvasReady = false;\n\nHooks.once(\"init\", async function () {\n // CONFIG.debug.hooks = true;\n if (!game.modules.get(\"socketlib\")?.active) return;\n moduleValid = true;\n CONSTANTS.INTEGRATIONS.ISOMETRIC.ACTIVE = false;\n // !!game.modules.get(\n // CONSTANTS.INTEGRATIONS.ISOMETRIC.MODULE_NAME\n // )?.active;\n initializeModule();\n registerSocket();\n});\n\nHooks.once(\"socketlib.ready\", registerSocket);\n\nHooks.once(\"ready\", async function () {\n if (!game.modules.get(\"socketlib\")?.active) {\n ui.notifications.error(\n \"Sequencer requires the SocketLib module to be active and will not work without it!\",\n { console: true }\n );\n return;\n }\n\n for (const [name, func] of Object.entries(easeFunctions)) {\n if (!CanvasAnimation[name]) {\n CanvasAnimation[name] = func;\n }\n }\n\n if (game.user.isGM) {\n await runMigrations();\n await migrateSettings();\n await PlayerSettings.migrateOldPresets();\n }\n\n SequencerFoundryReplicator.registerHooks();\n InteractionManager.initialize();\n});\n\nHooks.on(\"canvasTearDown\", () => {\n canvasReady = false;\n SequencerEffectManager.tearDownPersists();\n});\n\nconst setupModule = debounce(() => {\n if (!moduleValid) return;\n if (!moduleReady) {\n moduleReady = true;\n lib.debug(\"Ready to go!\");\n Hooks.callAll(\"sequencer.ready\");\n Hooks.callAll(\"sequencerReady\");\n }\n if (!canvasReady) {\n canvasReady = true;\n SequencerEffectManager.initializePersistentEffects();\n }\n}, 25);\n\nHooks.on(\"canvasReady\", () => {\n setTimeout(() => {\n setupModule();\n }, 450);\n});\n\nHooks.on(\"refreshToken\", setupModule);\nHooks.on(\"refreshDrawing\", setupModule);\nHooks.on(\"refreshTile\", setupModule);\nHooks.on(\"refreshMeasuredTemplate\", setupModule);\n\n/**\n * Creation & delete hooks for persistent effects\n */\nfunction initializeModule() {\n window.Sequence = Sequence;\n window.Sequencer = {\n Player: EffectPlayer,\n Presets: SequencerPresets,\n Database: SequencerDatabase,\n DatabaseViewer: DatabaseViewerApp,\n Preloader: SequencerPreloader,\n EffectManager: SequencerEffectManager,\n SectionManager: new SequencerSectionManager(),\n registerEase: registerEase,\n BaseSection: Section,\n CONSTANTS: {\n EASE,\n },\n Helpers: {\n wait: lib.wait,\n clamp: lib.clamp,\n interpolate: lib.interpolate,\n random_float_between: lib.random_float_between,\n random_int_between: lib.random_int_between,\n shuffle_array: lib.shuffle_array,\n random_array_element: lib.random_array_element,\n random_object_element: lib.random_object_element,\n make_array_unique: lib.make_array_unique,\n },\n };\n\n registerSettings();\n registerLayers();\n registerHotkeys();\n registerLibwrappers();\n\n SequencerAboveUILayer.setup();\n SequencerEffectManager.setup();\n}\n\nHooks.once(\"monaco-editor.ready\", registerTypes);\n"],"names":["lib.custom_error","lib.is_function","lib.debug","is_function","wait","document","hash","now","text","element","animation","detach","create_each_block","insert","update","instance","create_fragment","debug","children","writable","subscribe","run","storage","readable","writable$2","get","derived","scale","offset","constants.animateKeys","constants.relativeRegex","interpolate","lerp","duration","ease","options","width","linear","constants.transformOriginDefault","constants.transformKeysBitwise","constants.transformKeys","s_VALIDATION_DATA","constants.transformOrigins","parent","constants.numericDefaults","constants.setNumericDefaults","rotation","promise","draggable","active","ctx","create_if_block","booleanStore","dragDefault","storeResizing","audio","lib.getFiles","lib.is_real_number","lib.random_array_element","files","lib.interpolate","module","lib.make_array_unique","lib.custom_warning","lib\n .str_to_search_regex_str","lib.flatten_object","create_if_block_1","create_if_block_2","lib.str_to_search_regex_str","key","resizeObserver","dispatch","keeps","data","selectedPackStore","packStore","visibleTreeStore","cleanSearchStore","entriesStore","DatabaseShell","lib.wait","lib.get_object_identifier","delta","lib.deep_get","lib.deep_set","getProperty","lib.is_UUID","canvaslib.is_object_canvas_data","lib.get_object_from_scene","canvaslib.get_object_position","canvaslib.get_random_offset","canvaslib.rotateAroundPoint","lib.random_float_between","lib.flip_negate","FlagManager","canvaslib.get_object_dimensions","lib.user_can_do","filters","lib.safe_str","lib\n .get_all_documents_from_scene","lib.get_all_documents_from_scene","lib.group_by","canvaslib.rotate_coordinate","child","lib.throttled_custom_warning","canvaslib.calculate_missed_position","obj","multiplier","lib.get_hash","reject","canvaslib.validateAnimation","canvaslib.validateLoopingAnimation","canvaslib.is_position_within_bounds","layer","spriteType","canvaslib.distance_between","sprite","filter","canvaslib.createShape","canvaslib.get_object_elevation","shape","scaleX","scaleY","lib.debug_error","canvaslib.align","moves","angle","x","y","align","lib.getCanvasMouse","canvaslib.get_mouse_position","canvaslib.get_closest_token","effect","users","EffectsUIShell","lib.random_int_between","lib.validate_document","lib.parseColor","canvaslib.get_object_canvas_data","canvaslib.alignments","originLocation","timespan","Sequence","lib.sequence_proxy_wrap","func","lib.section_proxy_wrap","lib\n .make_array_unique","bind"],"mappings":"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AAC,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,MAAM,GAAG,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,MAAM,GAAG,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,MAAM,GAAG,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,MAAM,GAAG,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,MAAM,GAAG,KAAK,UAAU,KAAK,IAAI,GAAK,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,MAAM,GAAG,K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","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,57,58,59]}
|