diff --git a/.vscode/settings.json b/.vscode/settings.json index 4cb9716..e8b18e1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,8 +5,9 @@ "ckeditor", "easings", "linebreak", - "songplayer" + "musicplayer" ], "javascript.preferences.importModuleSpecifierEnding": "js", - "html.format.wrapLineLength": 0 + "html.format.wrapLineLength": 0, + "liveServer.settings.port": 5501 } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dc46558..e84f726 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "mocha-junit-reporter": "^2.0.2", "nodemon": "^2.0.15", "style-loader": "^3.3.1", + "sync-directory": "^4.0.12", "webpack": "^5.72.0", "webpack-cli": "^4.9.2", "webpack-merge": "^5.8.0" @@ -2880,6 +2881,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3507,6 +3514,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4049,6 +4062,20 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4497,6 +4524,19 @@ "node": ">= 0.10" } }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -4734,6 +4774,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -4794,6 +4846,18 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -4818,6 +4882,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", @@ -6116,6 +6189,23 @@ "node": ">=0.10.0" } }, + "node_modules/readdir-enhanced": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/readdir-enhanced/-/readdir-enhanced-1.5.2.tgz", + "integrity": "sha1-YUYwSGkKxqRVt1ti+nioj43IXlM=", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "es6-promise": "^4.1.0", + "glob-to-regexp": "^0.3.0" + } + }, + "node_modules/readdir-enhanced/node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6597,6 +6687,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sync-directory": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/sync-directory/-/sync-directory-4.0.12.tgz", + "integrity": "sha512-ZpBeMXL60flA1jbuhNJoCE6EjzInjTuoh6f7cArruYwQ9V8DEZNzN9FI3Q9CkWz4VzF4IvcKG38xLO1rZaysow==", + "dev": true, + "dependencies": { + "chokidar": "^3.3.1", + "commander": "^6.2.0", + "fs-extra": "^7.0.1", + "is-absolute": "^1.0.0", + "readdir-enhanced": "^1.5.2" + }, + "bin": { + "syncdir": "cmd.js" + } + }, + "node_modules/sync-directory/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -6781,6 +6896,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -9403,6 +9527,12 @@ "get-intrinsic": "^1.0.2" } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -9870,6 +10000,12 @@ "is-symbol": "^1.0.2" } }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -10291,6 +10427,17 @@ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -10609,6 +10756,16 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -10765,6 +10922,15 @@ "has-tostringtag": "^1.0.0" } }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -10804,6 +10970,15 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -10819,6 +10994,12 @@ "call-bind": "^1.0.2" } }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", @@ -11795,6 +11976,25 @@ } } }, + "readdir-enhanced": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/readdir-enhanced/-/readdir-enhanced-1.5.2.tgz", + "integrity": "sha1-YUYwSGkKxqRVt1ti+nioj43IXlM=", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "es6-promise": "^4.1.0", + "glob-to-regexp": "^0.3.0" + }, + "dependencies": { + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + } + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -12142,6 +12342,27 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "sync-directory": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/sync-directory/-/sync-directory-4.0.12.tgz", + "integrity": "sha512-ZpBeMXL60flA1jbuhNJoCE6EjzInjTuoh6f7cArruYwQ9V8DEZNzN9FI3Q9CkWz4VzF4IvcKG38xLO1rZaysow==", + "dev": true, + "requires": { + "chokidar": "^3.3.1", + "commander": "^6.2.0", + "fs-extra": "^7.0.1", + "is-absolute": "^1.0.0", + "readdir-enhanced": "^1.5.2" + }, + "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + } + } + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -12271,6 +12492,12 @@ "which-boxed-primitive": "^1.0.2" } }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, "undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", diff --git a/package.json b/package.json index b9b3614..75624c9 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,12 @@ "build:dev": "webpack --config webpack.dev.cjs", "test:junit": "mocha tests/** --reporter mocha-junit-reporter --reporter-options mochaFile=./junit/test_results.xml", "test:console": "mocha tests/**", - "watch:docs": "nodemon --watch dist/ --watch tutorials/ --watch src/ --exec 'npm run docs' -e js,mjs,json,htm,html,xml,markdown,md,xhtml", + "watch:docs": "nodemon --watch dist/ --watch tutorials/ --watch src/ --exec 'npm run docs' -e js,mjs,json,htm,html,xml,markdown,md,xhtml --ignore ./tutorials/assets/js/audioshowkit.js", "watch:lib": "webpack --watch --config webpack.dev.cjs", "build": "npm run build:dev", "test": "npm run test:console", "watch": "npm run watch:lib", - "docs": "jsdoc -c jsdoc.config.json" + "docs": "jsdoc -c jsdoc.config.json && cp ./dist/audioshowkit.js ./tutorials/assets/js/audioshowkit.js && syncdir ./tutorials/assets/ ./docs/assets/" }, "author": "", "license": "ISC", @@ -36,6 +36,7 @@ "mocha-junit-reporter": "^2.0.2", "nodemon": "^2.0.15", "style-loader": "^3.3.1", + "sync-directory": "^4.0.12", "webpack": "^5.72.0", "webpack-cli": "^4.9.2", "webpack-merge": "^5.8.0" diff --git a/src/mapping/numeric.js b/src/mapping/numeric.js index 0dd72ac..338b3bf 100644 --- a/src/mapping/numeric.js +++ b/src/mapping/numeric.js @@ -1,6 +1,4 @@ -// TODO: add for width -// TODO: add for height -// TODO: add for background +import VisualizerUpdateManager from "../visualization/VisualizerUpdateManager.js"; /** * @@ -13,6 +11,8 @@ * @param {number} value The new numerical value to update to. */ +// FIXME: Warnings about interpolator not being defined are broken. Docs generate fine. + /** * Maps the average of a range of bins to numerical value defined by a getter and a setter. * @@ -42,7 +42,7 @@ function mapRangedAvgNumerical({ minVal, maxVal, lowerBin = undefined, upperBin, } average /= normalBins.length; const range = maxVal - minVal; - let interpolated = interpolator(getter(), average, timeDelta); // TODO: May be optimized by allowing for transferring of previous style state. + let interpolated = interpolator(getter(), average, timeDelta); if (reversed) interpolated = 1 - interpolated; setter(minVal + range * interpolated); } diff --git a/src/player/PlaylistSong.js b/src/player/Music.js similarity index 74% rename from src/player/PlaylistSong.js rename to src/player/Music.js index 0269b05..48b810c 100644 --- a/src/player/PlaylistSong.js +++ b/src/player/Music.js @@ -8,10 +8,10 @@ import Visualizer from "../visualization/Visualizer.js"; */ /** - * A song with metadata that can be used as part of a {@link SongPlaylist}. + * A music with metadata that can be used as part of a {@link MusicPlaylist}. * */ -export default class PlayListSong { +export default class Music { #displayName; #author; #url; @@ -20,11 +20,11 @@ export default class PlayListSong { #ready = false; /** - * Constructs a song for a {@link SongPlaylist}. + * Constructs a music for a {@link MusicPlaylist}. * - * @param {string} url the url to fetch the song from. - * @param {string} name the name of the song. - * @param {string} author the author of the song. + * @param {string} url the url to fetch the music from. + * @param {string} name the name of the music. + * @param {string} author the author of the music. */ constructor(url, name, author) { this.#displayName = name; @@ -35,14 +35,12 @@ export default class PlayListSong { /** * - * @param {AudioEventCallback} [onReady] called when the song is ready, including right away if the song is already ready. - * @returns {HTMLAudioElement} The audio element that represents this song. + * @param {AudioEventCallback} [onReady] called when the music is ready, including right away if the music is already ready. + * @returns {HTMLAudioElement} The audio element that represents this music. */ fetchAudio(onReady) { - console.log("Fetching audio..."); if (this.#audio) { if (this.#ready) { - console.log("Already ready."); if (onReady) onReady(this.#audio); } else if (onReady) { this.#audio.addEventListener("canplaythrough", () => { @@ -52,35 +50,31 @@ export default class PlayListSong { return this.#audio; } this.#audio = new Audio(this.#url); - console.log("Fetching from url: " + this.#url); this.#audio.addEventListener("canplaythrough", () => { this.#ready = true; - console.log("attempting to invoke onReady."); - console.log(onReady); if (onReady && this.isAudioInstantiated()) { onReady(this.#audio); - console.log("onReady invoked."); } }, { once: true }); return this.#audio; } /** - * @returns {string} The name of the song to be displayed. + * @returns {string} The name of the music to be displayed. */ get displayName() { return this.#displayName; } /** - * @returns {string} The author of the song. + * @returns {string} The author of the music. */ get author() { return this.#author; } /** - * @returns {string} The url at which the file for this song can be found. + * @returns {string} The url at which the file for this music can be found. */ get url() { return this.#url; @@ -96,7 +90,7 @@ export default class PlayListSong { /** * Begins audio playback as soon as possible. * - * This function uses the {@link PlaylistSong#getAudio} function and specifically, the {@link AudioEventCallback}. + * This function uses the {@link PlaylistMusic#getAudio} function and specifically, the {@link AudioEventCallback}. */ play() { this.fetchAudio((audio) => { @@ -131,7 +125,7 @@ export default class PlayListSong { } /** * - * @returns {number} The number of seconds into the song. + * @returns {number} The number of seconds into the music. */ get currentTime() { return this.fetchAudio().currentTime; @@ -139,7 +133,7 @@ export default class PlayListSong { /** * - * The time position in the song to jump to in seconds. + * The time position in the music to jump to in seconds. */ set currentTime(currentTime) { this.fetchAudio().currentTime = currentTime; @@ -147,7 +141,7 @@ export default class PlayListSong { /** * - * @returns {number} The duration of the song. + * @returns {number} The duration of the music. */ get duration() { return this.fetchAudio().duration; @@ -157,7 +151,7 @@ export default class PlayListSong { * Unloads the audio data. * Makes sure the audio is paused. * - * Also calls {@link PlaylistSong#unloadVisualizer}. + * Also calls {@link PlaylistMusic#unloadVisualizer}. */ unloadAudio() { if (!this.isAudioInstantiated()) return; diff --git a/src/player/SongPlayer.js b/src/player/MusicPlayer.js similarity index 66% rename from src/player/SongPlayer.js rename to src/player/MusicPlayer.js index c5dc1b5..b1fa02a 100644 --- a/src/player/SongPlayer.js +++ b/src/player/MusicPlayer.js @@ -1,6 +1,5 @@ -import "../styles/songPlayer.css"; -import PlayListSong from "./PlaylistSong.js"; -import SongPlaylist from "./SongPlaylist.js"; +import "../styles/musicPlayer.css"; +import MusicPlaylist from "./MusicPlaylist.js"; /**@module */ @@ -11,22 +10,20 @@ import SongPlaylist from "./SongPlaylist.js"; */ /** - * A player that keeps track of global properties for playback as well as traversing a playlist. Additionally keeps track of song audio data and attempts to reduce memory usage when possible. + * A player that keeps track of global properties for playback as well as traversing a playlist. Additionally keeps track of music audio data and attempts to reduce memory usage when possible. */ -export default class SongPlayer { +export default class MusicPlayer { #playlist; - #current = 0; #volume = 1; #autoplay = false; #wasPlaying = false; #playlistChangeListeners = []; - #currentSongChangeListeners = []; #volumeChangeListeners = []; #allAudioEventListeners = {}; /** * - * @param {SongPlaylist} playlist the playlist of songs that this player is in charge of. + * @param {MusicPlaylist} playlist the playlist of musics that this player is in charge of. */ constructor(playlist) { this.playlist = playlist; @@ -36,15 +33,15 @@ export default class SongPlayer { } /** - * The new playlist of songs that this player is in charge of. + * The new playlist of musics that this player is in charge of. */ set playlist(playlist) { - this.#playlist?.unloadAllAudio(); + if (this.playlist) this.unloadAllAudio(); + if (this.playlist) this.playlist.removePositionChangeListener(this.#onMusicChange); const old = this.#playlist; this.#playlist = playlist; - if (!this.changeCurrentSongIndex(0)) { - throw new Error("The provided playlist has no songs."); - } + this.#playlist.addPositionChangeListener(this.#onMusicChange); + this.#playlist.currentPosition = 0; // Updates the listener. this.#playlistChangeListeners.forEach(playlistChangeListener => { playlistChangeListener(old, this.getPlaylist()); }); @@ -52,9 +49,9 @@ export default class SongPlayer { } /** - * The current playlist of songs that this player is in charge of. + * The current playlist of musics that this player is in charge of. * - * @returns {SongPlaylist} The song playlist this player is currently using. + * @returns {MusicPlaylist} The music playlist this player is currently using. */ get playlist() { return this.#playlist; @@ -62,65 +59,51 @@ export default class SongPlayer { /** * - * @returns {boolean} true if and only if successful in going to the next song. + * @returns {boolean} true if and only if successful in going to the next music. */ next() { - return this.changeCurrentSongIndex(this.currentSongIndex + 1); + return this.playlist.currentPosition += 1; } /** - * attempts to go to the previous song. + * attempts to go to the previous music. * - * @returns {boolean} true if and only if successful in going to the previous song. + * @returns {boolean} true if and only if successful in going to the previous music. */ previous() { - return this.changeCurrentSongIndex(this.currentSongIndex - 1); + return this.playlist.currentPosition -= 1; } /** - * - * @param {number} index the index of the song to jump to. + * @param {number} old the index of the previous music. + * @param {number} current the index of the current music. * @returns {boolean} true if and only if successful jumping to the given index. */ - changeCurrentSongIndex(index) { - console.log("Changing current song to " + index); - if (index >= this.#playlist.total()) return false; - if (index < 0) return false; + #onMusicChange = (old, current) => { // Anonymous to avoid overriding "this". + const oldMusic = this.playlist.musicAtIndex(old); + const currentMusic = this.playlist.musicAtIndex(current); Object.keys(this.#allAudioEventListeners).forEach(key => { const listeners = this.#allAudioEventListeners[key]; listeners.forEach(listener => { - this.currentSong.fetchAudio().removeEventListener(key, listener); + oldMusic.fetchAudio().removeEventListener(key, listener); }); }); - this.currentSong.unloadAudio(); - const old = this.currentSong; - this.#current = index; - this.#currentSongChangeListeners.forEach(currentChangeListener => { - currentChangeListener(old, this.currentSong); - }); + oldMusic.unloadAudio(); + Object.keys(this.#allAudioEventListeners).forEach(key => { const listeners = this.#allAudioEventListeners[key]; listeners.forEach(listener => { - this.currentSong.fetchAudio().addEventListener(key, listener); + currentMusic.fetchAudio().addEventListener(key, listener); }); }); if (this.#wasPlaying || this.#autoplay) { this.playCurrent(); } return true; - } - - /** - * - * @returns {number} The current song's index in the playlist. - */ - get currentSongIndex() { - return this.#current; - } + }; playCurrent() { - console.log("playing " + this.#current); - this.currentSong.fetchAudio((audio) => { + this.playlist.currentMusic.fetchAudio((audio) => { audio.volume = this.volume; audio.play(); }); @@ -128,15 +111,14 @@ export default class SongPlayer { } /** - * Pauses the current playing song (if there is one playing). + * Pauses the current playing music (if there is one playing). */ pauseCurrent() { - console.log("Pausing."); - this.currentSong.fetchAudio().pause(); + this.playlist.currentMusic.fetchAudio().pause(); } /** - * Toggles whether or not the current song is playing. + * Toggles whether or not the current music is playing. */ togglePlay() { if (this.playing) { @@ -153,7 +135,7 @@ export default class SongPlayer { if (volume > 1) volume = 1; if (volume < 0) volume = 0; this.#volume = volume; - this.currentSong.fetchAudio().volume = this.#volume; + this.playlist.currentMusic.fetchAudio().volume = this.#volume; } /** @@ -171,8 +153,8 @@ export default class SongPlayer { * @returns {boolean} true if and only if the position to seek to is within the duration of the track. This also means that if the track has not finished loading the duration data, than this will always return false. */ seek(position) { - if (position > this.currentSong.fetchAudio().duration || position < 0) return false; - this.currentSong.fetchAudio(audio => { + if (position > this.playlist.playlist.currentMusic.fetchAudio().duration || position < 0) return false; + this.playlist.playlist.currentMusic.fetchAudio(audio => { audio.currentTime = position; }); return true; @@ -183,15 +165,15 @@ export default class SongPlayer { * @returns {number} How many seconds into the audio track has been played in seconds. */ get currentPosition() { - return this.currentSong.fetchAudio().currentTime; + return this.playlist.playlist.currentMusic.fetchAudio().currentTime; } /** * - * @returns {number} The total length of the song, or NaN if this information has not loaded yet. + * @returns {number} The total length of the music, or NaN if this information has not loaded yet. */ get currentDuration() { - return this.currentSong.fetchAudio().duration; + return this.playlist.playlist.currentMusic.fetchAudio().duration; } /** @@ -208,7 +190,6 @@ export default class SongPlayer { if (this.playing) playButton.classList.add("pause"); playButton.addEventListener("click", () => { - console.log("Generated play button has been pressed."); this.togglePlay(); }); @@ -241,37 +222,6 @@ export default class SongPlayer { return previousButton; } - /** - * @returns {PlayListSong} The current playlist being used. - */ - get currentSong() { - return this.#playlist.songAtIndex(this.#current); - } - - /** - * - * @param {changeListener} listener the listener to receive the updates. - * @returns {boolean} true if and only if successfully added the listener. - */ - addCurrentSongChangeListener(listener) { - if (this.#currentSongChangeListeners.includes(listener)) return false; - this.#currentSongChangeListeners.push(listener); - return true; - } - - /** - * - * @param {changeListener} listener the song change listener to remove. - * @returns {boolean} true if and only if the song change listener given was successfully removed. - */ - removeCurrentSongChangeListener(listener) { - const removeIndex = this.#currentSongChangeListeners.indexOf(listener); - if (removeIndex < 0) return false; - - this.#currentSongChangeListeners.splice(removeIndex, 1); - return true; - } - /** * * @param {changeListener} listener the playlist change listener to add to the callback list. @@ -336,7 +286,7 @@ export default class SongPlayer { } if (typeListeners.includes(eventListener)) return false; typeListeners.push(eventListener); - this.currentSong.fetchAudio().addEventListener(type, eventListener); + this.playlist.currentMusic.fetchAudio().addEventListener(type, eventListener); return true; } @@ -352,14 +302,23 @@ export default class SongPlayer { const removeIndex = typeListeners.indexOf(eventListener); if (removeIndex < 0) return false; typeListeners.splice(removeIndex, 1); - this.currentSong.fetchAudio().removeEventListener(type, eventListener); + this.playlist.playlist.currentMusic.fetchAudio().removeEventListener(type, eventListener); return true; } /** - * @returns {boolean} If the player is playing any songs right now. + * @returns {boolean} If the player is playing any musics right now. */ get playing() { - return this.currentSong.isAudioInstantiated() && !this.currentSong.fetchAudio().paused; + return this.playlist.currentMusic.isAudioInstantiated() && !this.playlist.currentMusic.fetchAudio().paused; + } + + /** + * Unloads the audio data of all musics in this playlist. + */ + unloadAllAudio() { + this.playlist.forEach(music => { + music.unloadAudio(); + }); } } \ No newline at end of file diff --git a/src/player/MusicPlaylist.js b/src/player/MusicPlaylist.js new file mode 100644 index 0000000..6abe16e --- /dev/null +++ b/src/player/MusicPlaylist.js @@ -0,0 +1,250 @@ +import Music from "./Music.js"; + +/**@module */ + +/** + * @callback positionChangeListener + * @param {number} old the previous position. + * @param {number} current the the current (new) position. + */ + +/** + * @callback lengthChangeListener + * @param {number} changed The index of the music that has changed. + * @param {boolean} added True if and only if the change was caused by adding music. + * @param {Music} music The music that was added or removed. + */ + +/** + * A playlist that holds a multitude of musics in the form of {@link Music}. + */ +export default class MusicPlaylist { + #list = []; + #name; + #current = 0; + #positionChangeListeners = []; + #lengthChangeListeners = []; + + /** + * Instantiates a playlist for musics. + * + * @param {string} name The name of the playlist. + */ + constructor(name) { + this.#name = name; + } + + /** + * @returns {string} The name of the playlist. + */ + get name() { + return this.#name; + } + + /** + * + * @param {number} index the index of the music to retrieve. + * @returns {Music} the music at the given index. + */ + musicAtIndex(index) { + if (index >= this.total) { + return null; + } + return this.#list[index]; + } + + /** + * Automatically creates and adds a {@link Music} to this playlist. + * + * @param {string} url where the audio data can be found. + * @param {string} name the name of the music. + * @param {string} author the author(s) of the music. + */ + add(url, name, author) { + const music = new Music(url, name, author, this); + this.#list.push(music); + this.#onAdd(this.total - 1, music); + } + + /** + * Adds an existing {@link Music} object to this playlist. Alternatively, use {@link MusicPlaylist#add} to automatically instantiate a new one. + * + * @param {Music} music The existing music to add. + */ + addExisting(music) { + this.#list.push(music); + this.#onAdd(this.total - 1, music); + } + + /** + * Calls all playlist length change listeners. + * + * @param {number} index The index at which the new music was added. + * @param {Music} music The music that was added. + */ + #onAdd(index, music) { + this.#lengthChangeListeners.forEach(listener => { + listener(index, true, music); + }); + } + + /** + * Removes a {@link Music} from this playlist. + * + * @param {number} index the index of the music to be removed. + * @returns {Music} the music that was removed, or null if the index of was invalid. + */ + remove(index) { + if (index >= this.#list.length) { + return null; + } + let removed = this.#list.splice(index, 1)[0]; + this.#lengthChangeListeners.forEach(listener => { + listener(index, false, removed); + }); + if (removed.length > 0) { + return removed[0]; + } + } + + /** + * Attempts to find a {@link Music} given a name. Returns the first one found. + * + * @param {string} name the name of the music to be found. + * @returns {number} the index of the music found, or -1 if it was not found. + */ + findMusicIndex(name) { + return this.#list.findIndex((item) => item.getDisplayName() == name); + } + + /** + * The number of {@link Music} in this playlist. + * + * @returns {number} total number of musics in this playlist. + */ + get total() { + return this.#list.length; + } + + /** + * @returns {number} The current position in the playlist. + */ + get currentPosition() { + return this.#current; + } + + /** + * The current position in the playlist. + */ + set currentPosition(position) { + if (typeof position !== "number") throw new Error("Given position is invalid."); + if (position >= this.#list.length || position < 0) return; + const old = this.#current; + this.#current = position; + this.#positionChangeListeners.forEach(positionChangeListener => { + positionChangeListener(old, position); + }); + } + + /** + * @returns {Music} The current music in the playlist being used. + */ + get currentMusic() { + return this.musicAtIndex(this.currentPosition); + } + + /** + * + * @param {positionChangeListener} listener the listener to receive the updates. + * @returns {boolean} true if and only if successfully added the listener. + */ + addPositionChangeListener(listener) { + if (this.#positionChangeListeners.includes(listener)) return false; + this.#positionChangeListeners.push(listener); + return true; + } + + /** + * + * @param {positionChangeListener} listener the music change listener to remove. + * @returns {boolean} true if and only if the music change listener given was successfully removed. + */ + removePositionChangeListener(listener) { + const removeIndex = this.#positionChangeListeners.indexOf(listener); + if (removeIndex < 0) return false; + + this.#positionChangeListeners.splice(removeIndex, 1); + return true; + } + + /** + * Adds a listener for whether music was added or removed to the playlist. + * + * @param {lengthChangeListener} listener The listener to be added. + * @returns {boolean} True if and only if the listener was successfully added. + */ + addLengthChangeListener(listener) { + if (this.#lengthChangeListeners.includes(listener)) return false; + this.#lengthChangeListeners.push(listener); + return true; + } + + /** + * Removes a listener for whether music is added or removed to the playlist. + * + * @param {lengthChangeListener} listener The listener to be removed. + * @returns {boolean} True if and only if the provided listener was successfully removed. + */ + removeLengthChangeListener(listener) { + const removeIndex = this.#lengthChangeListeners.indexOf(listener); + if (removeIndex < 0) return false; + this.#lengthChangeListeners.splice(removeIndex, 1); + return true; + } + + generatePlaylistElement() { + const element = document.createElement("table"); + element.createTHead().textContent = "Playlist"; + const headers = element.insertRow(); + const musicHeader = document.createElement("th"); + musicHeader.textContent = "Music"; + headers.appendChild(musicHeader); + const authorHeader = document.createElement("th"); + authorHeader.textContent = "Author"; + headers.appendChild(authorHeader); + + const insertMusic = (music, musicPos = undefined) => { + if (musicPos) musicPos++; + const row = element.insertRow(musicPos); + row.insertCell().textContent = music.displayName; + row.insertCell().textContent = music.author; + }; + for (const music of this) { + insertMusic(music); + } + + this.addLengthChangeListener((changed, added, music) => { + if (added) { + insertMusic(music, changed); + } else { + element.deleteRow(changed); + } + }); + + element.rows[this.currentPosition + 1].classList.add("active"); + + this.addPositionChangeListener((old, current) => { + element.rows[old + 1].classList.remove("active"); + element.rows[current + 1].classList.add("active"); + }); + return element; + } + + [Symbol.iterator]() { + let index = -1; + const data = this.#list; + return { + next: () => ({ value: data[++index], done: index >= data.length }) // Brackets so not read as a body of anonymous function. + }; + } +} \ No newline at end of file diff --git a/src/player/SongPlaylist.js b/src/player/SongPlaylist.js deleted file mode 100644 index c99ea9f..0000000 --- a/src/player/SongPlaylist.js +++ /dev/null @@ -1,93 +0,0 @@ -import PlaylistSong from "./PlaylistSong.js"; - -/**@module */ - -/** - * A playlist that holds a multitude of songs in the form of {@link PlaylistSong}. - */ -export default class SongPlaylist { - #list = []; - #name; - - /** - * Instantiates a playlist for songs. - * - * @param {string} name The name of the playlist. - */ - constructor(name) { - this.#name = name; - } - - /** - * @returns {string} The name of the playlist. - */ - get name() { - return this.#name; - } - - /** - * - * @param {number} index the index of the song to retrieve. - * @returns {PlaylistSong} the song at the given index. - */ - songAtIndex(index) { - if (index >= this.#list.length) { - return null; - } - return this.#list[index]; - } - - /** - * Automatically creates and adds a {@see PlaylistSong} to this playlist. - * - * @param {string} url where the audio data can be found. - * @param {string} name the name of the song. - * @param {string} author the author(s) of the song. - */ - add(url, name, author) { - this.#list.push(new PlaylistSong(url, name, author, this)); - } - - /** - * Removes a {@see playlistSong} from this playlist. - * - * @param {number} index the index of the song to be removed. - * @returns {PlaylistSong} the song that was removed, or null if the index of was invalid. - */ - remove(index) { - if (index >= this.#list.length) { - return null; - } - let removed = this.#list.splice(index, 1)[0]; - if (removed.length > 0) { - return removed[0]; - } - } - - /** - * Attempts to find a {@link PlaylistSong} given a name. - * - * @param {string} name the name of the song to be found. - * @returns {number} the index of the song found, or -1 if it was not found. - */ - findSongIndex(name) { - return this.#list.findIndex((item) => item.getDisplayName() == name); - } - - /** - * - * @returns {number} total number of songs in this playlist. - */ - total() { - return this.#list.length; - } - - /** - * Unloads the audio data of all songs in this playlist. - */ - unloadAllAudio() { - this.#list.forEach(playlistSong => { - playlistSong.unloadAudio(); - }); - } -} \ No newline at end of file diff --git a/src/player/VisualizedSongPlayer.js b/src/player/VisualizedMusicPlayer.js similarity index 69% rename from src/player/VisualizedSongPlayer.js rename to src/player/VisualizedMusicPlayer.js index ee4040d..5104022 100644 --- a/src/player/VisualizedSongPlayer.js +++ b/src/player/VisualizedMusicPlayer.js @@ -1,30 +1,30 @@ import Visualizer from "../visualization/Visualizer.js"; import VisualizerUpdateManager from "../visualization/VisualizerUpdateManager.js"; -import SongPlayer from "./SongPlayer.js"; -import SongPlaylist from "./SongPlaylist.js"; +import MusicPlayer from "./MusicPlayer.js"; +import MusicPlaylist from "./MusicPlaylist.js"; /**@module */ /** - * A song player that provides easier access to the current songs visualizer data. - * Additionally, automatically re-binds all the visualizer update listeners for song changes. + * A music player that provides easier access to the current musics visualizer data. + * Additionally, automatically re-binds all the visualizer update listeners for music changes. * - * @augments SongPlayer + * @augments MusicPlayer */ -export default class VisualizedSongPlayer extends SongPlayer { +export default class VisualizedMusicPlayer extends MusicPlayer { #fftSize = 1024; #visualizerUpdateManager; /** - * Instantiates a song player with visualization features. + * Instantiates a music player with visualization features. * - * @param {SongPlaylist} playlist the playlist this player manages. + * @param {MusicPlaylist} playlist the playlist this player manages. * @param {number} [fftSize=1024] the size of the fft window for analysis. */ constructor(playlist, fftSize = 1024) { super(playlist); this.#fftSize = fftSize; - this.#visualizerUpdateManager = new VisualizerUpdateManager(this.getCurrentSongVisualizer()); + this.#visualizerUpdateManager = new VisualizerUpdateManager(this.getCurrentMusicVisualizer()); } /** @@ -32,44 +32,44 @@ export default class VisualizedSongPlayer extends SongPlayer { */ set playlist(playlist) { super.playlist = playlist; - this.#visualizerUpdateManager = new VisualizerUpdateManager(this.getCurrentSongVisualizer()); + this.#visualizerUpdateManager = new VisualizerUpdateManager(this.getCurrentMusicVisualizer()); } /** * - * @returns {boolean} true if and only if successful in changing to the next song. + * @returns {boolean} true if and only if successful in changing to the next music. */ next() { const updateListeners = this.#visualizerUpdateManager.getBinnedListeners(); if (!super.next()) return false; - this.#visualizerUpdateManager = new VisualizerUpdateManager(this.getCurrentSongVisualizer()); + this.#visualizerUpdateManager = new VisualizerUpdateManager(this.getCurrentMusicVisualizer()); this.#visualizerUpdateManager.setBinnedListeners(updateListeners); return true; } /** - * Jumps to the previous song if possible. + * Jumps to the previous music if possible. * - * @returns {boolean} true if and only if successful in switching to the previous song in the playlist. + * @returns {boolean} true if and only if successful in switching to the previous music in the playlist. */ previous() { const updateListeners = this.#visualizerUpdateManager.getBinnedListeners(); if (!super.previous()) return false; - this.#visualizerUpdateManager = new VisualizerUpdateManager(this.getCurrentSongVisualizer()); + this.#visualizerUpdateManager = new VisualizerUpdateManager(this.getCurrentMusicVisualizer()); this.#visualizerUpdateManager.setBinnedListeners(updateListeners); return true; } /** * - * @param {number} index the index of the song to change to. + * @param {number} index the index of the music to change to. * @returns {boolean} true if and only if successful in jumping to the given index. */ changeCurrent(index) { const updateListeners = this.VisualizerUpdateManager.getBinnedListeners(); if (!super.changeCurrent(index)) return false; - this.#visualizerUpdateManager = new VisualizerUpdateManager(this.getCurrentSongVisualizer()); + this.#visualizerUpdateManager = new VisualizerUpdateManager(this.getCurrentMusicVisualizer()); this.#visualizerUpdateManager.setBinnedListeners = updateListeners(); return true; } @@ -82,9 +82,9 @@ export default class VisualizedSongPlayer extends SongPlayer { } /** - * @returns {Visualizer} The current song's visualizer. + * @returns {Visualizer} The current music's visualizer. */ - get currentSongVisualizer() { - return this.getCurrentSong().getVisualizer(); + get currentMusicVisualizer() { + return this.getCurrentMusic().getVisualizer(); } } \ No newline at end of file diff --git a/src/player/player.js b/src/player/player.js index 0f7cfb5..e97cfb5 100644 --- a/src/player/player.js +++ b/src/player/player.js @@ -1,7 +1,7 @@ -import SongPlayer from "./SongPlayer.js"; -import SongPlaylist from "./SongPlaylist.js"; -import VisualizedSongPlayer from "./VisualizedSongPlayer.js"; -import PlayListSong from "./PlaylistSong.js"; +import MusicPlayer from "./MusicPlayer.js"; +import MusicPlaylist from "./MusicPlaylist.js"; +import VisualizedMusicPlayer from "./VisualizedMusicPlayer.js"; +import Music from "./Music.js"; /**@module */ -export { SongPlayer, SongPlaylist, VisualizedSongPlayer, PlayListSong }; \ No newline at end of file +export { MusicPlayer, MusicPlaylist, VisualizedMusicPlayer, Music }; \ No newline at end of file diff --git a/src/styles/songPlayer.css b/src/styles/musicPlayer.css similarity index 100% rename from src/styles/songPlayer.css rename to src/styles/musicPlayer.css diff --git a/tutorials/MusicPlayer.html b/tutorials/MusicPlayer.html new file mode 100644 index 0000000..8eae4f2 --- /dev/null +++ b/tutorials/MusicPlayer.html @@ -0,0 +1,81 @@ + + + + + + + + + + +
+

Creating a Music Player

+

One of the most basic principles behind AudioShowKit is the {@link module:player/MusicPlayer}. The song player acts as an easy way for developers to set up a list of songs with simple generated controls while exposing more complex events if needed.

+
+
+

Instantiating a Music Player

+

Instantiating a music player requires a {@link module:player/MusicPlaylist}. See the [MusicPlaylist tutorial]{@tutorial MusicPlaylist} for information on how to get one of those! Once you have one, you can proceed with instantiating a Music Player.

+

+            const ask = window.audioshowkit; // Get a reference to the audioshowkit stuff.
+            const playlist = previousPlaylist; // We are assuming you have a playlist ready.
+            const player = new ask.player.MusicPlayer(playlist) // Creates a new music player with the playlist.
+        
+
+
+

Display a Play Button

+

We need some user interactive element to start playing music. You can set this up yourself, or use a generated one by us! We'll show you how to do the latter, but feel free to read the documentation on all the methods available that can be used in event listeners to see how to do the former.

+

+            // Still using the same context from the instantiation example...
+            const playElement = player.generatePlayElement();
+            document.getElementById("musicplayer-playbtn-demo").appendChild(playElement); // Assuming this element exists.
+        
+

The play button

+

Go ahead and hit the play button!

+
+
+
+
+ +
+
+

Similarly, Next and Previous Buttons

+

We can also traverse the playlist by the player via a previous and next button. These buttons can be generated as well as programmed.

+

+            // Still using the same context from the instantiation example...
+            const nextElement = player.generateNextElement();
+            document.getElementById("musicplayer-nextbtn-demo").appendChild(nextElement);
+
+            const prevElem = player.generatePreviousElement();
+            document.getElementById("musicplayer-prevbtn-demo").appendChild(prevElem);    
+        
+

The next button

+
+
+
+
+

The previous button

+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/tutorials/MusicPlaylist.html b/tutorials/MusicPlaylist.html new file mode 100644 index 0000000..49dfb8d --- /dev/null +++ b/tutorials/MusicPlaylist.html @@ -0,0 +1,79 @@ + + + + + + + + + + +
+

Creating a Music Playlist

+

+ A music playlist is a list of {@link module:player/Music} which maintains metadata about the playlist, such as the length, and the name of the playlist. It also keeps track of an index for a position in the playlist. +

+
+
+

Instantiation

+

+            // Get the entry point to all of AudioShowKit's glory.
+            const ask = window.audioshowkit;
+
+            // The only parameter is the name of the playlist.
+            const playlist = new ask.player.MusicPlaylist("Awesome Music"); 
+        
+
+
+

Adding Music

+

A music playlist is no good if it doesn't have music. Lets add some.

+

+            // Still using the same context from the instantiation example...
+
+            playlist.add("/assets/audio/moments.mp3", "Moments", "Lost Identities x Robbie Rosen"); // It's that easy.
+            playlist.add("/assets/audio/XXI.mp3", "XXI", "QR"); // Let's add another one.
+        
+ +

If for whatever reason, you decided to instantiate your own {@link module:player/Music}, that's okay too!

+

+            // Still using the same context from the instantiation example...
+
+            // Either instantiate, or otherwise have this Music object.
+            const pathetiqueMusic = new ask.player.Music("/assets/audio/pathetique.mp3", "Sonata No. 8", "Beethoven");
+            playlist.addExisting(pathetiqueMusic); // Wow, a special function!
+        
+
+
+

Display

+

In the case you want to show the playlist without coding your own display, we provide a simple generator for you!

+

+            // Still using the same context from the instantiation example...
+
+            const playlistElem = playlist.generatePlaylistElement(); // Returns an HTMLElement!
+
+            // Assuming we do have an acceptable element that can take a child element.
+            document.getElementById("musicplaylist-demo").appendChild(playlistElem); 
+        
+
+

Result

+
+
+
+ + +
+ + + \ No newline at end of file diff --git a/tutorials/SongPlayer.html b/tutorials/SongPlayer.html deleted file mode 100644 index 3c059cc..0000000 --- a/tutorials/SongPlayer.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - Creating a Song Player - - - -
-

Creating a Song Player

-

One of the most basic principles behind AudioShowKit is the {@link module:player/SongPlayer}. The song player acts as an easy way for developers to set up a list of songs and play them back with simple controls.

-
- - - \ No newline at end of file diff --git a/tutorials/SongPlaylist.html b/tutorials/SongPlaylist.html deleted file mode 100644 index 702886a..0000000 --- a/tutorials/SongPlaylist.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tutorials/assets/audio/pathetique.mp3 b/tutorials/assets/audio/pathetique.mp3 new file mode 100644 index 0000000..fb11c6c Binary files /dev/null and b/tutorials/assets/audio/pathetique.mp3 differ diff --git a/tutorials/assets/css/prism.css b/tutorials/assets/css/prism.css new file mode 100644 index 0000000..f8300da --- /dev/null +++ b/tutorials/assets/css/prism.css @@ -0,0 +1,3 @@ +/* PrismJS 1.28.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript */ +code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green} diff --git a/tutorials/assets/js/audioshowkit.js b/tutorials/assets/js/audioshowkit.js new file mode 100644 index 0000000..fbf0354 --- /dev/null +++ b/tutorials/assets/js/audioshowkit.js @@ -0,0 +1,340 @@ +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +var audioshowkit; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/css-loader/dist/cjs.js!./src/styles/musicPlayer.css": +/*!**************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js!./src/styles/musicPlayer.css ***! + \**************************************************************************/ +/***/ ((module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"./node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".player.play-btn {\\n box-sizing: border-box;\\n height: 48px;\\n width: 48;\\n transition: 80ms all ease;\\n will-change: border-width;\\n cursor: pointer;\\n border-color: transparent transparent transparent black;\\n\\n border-style: solid;\\n border-width: 24px 0px 24px 48px;\\n}\\n\\n.player.play-btn.pause {\\n border-style: double;\\n border-width: 0px 0px 0px 60px;\\n}\\n\\n\\n.player.next {\\n border-style: none;\\n width: 48px;\\n height: 48px;\\n}\\n\\n.player.previous {\\n border-style: none;\\n width: 48px;\\n height: 48px;\\n}\\n\\ntable.player {\\n border-collapse: collapse;\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/musicPlayer.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,sBAAsB;IACtB,YAAY;IACZ,SAAS;IACT,yBAAyB;IACzB,yBAAyB;IACzB,eAAe;IACf,uDAAuD;;IAEvD,mBAAmB;IACnB,gCAAgC;AACpC;;AAEA;IACI,oBAAoB;IACpB,8BAA8B;AAClC;;;AAGA;IACI,kBAAkB;IAClB,WAAW;IACX,YAAY;AAChB;;AAEA;IACI,kBAAkB;IAClB,WAAW;IACX,YAAY;AAChB;;AAEA;IACI,yBAAyB;AAC7B\",\"sourcesContent\":[\".player.play-btn {\\n box-sizing: border-box;\\n height: 48px;\\n width: 48;\\n transition: 80ms all ease;\\n will-change: border-width;\\n cursor: pointer;\\n border-color: transparent transparent transparent black;\\n\\n border-style: solid;\\n border-width: 24px 0px 24px 48px;\\n}\\n\\n.player.play-btn.pause {\\n border-style: double;\\n border-width: 0px 0px 0px 60px;\\n}\\n\\n\\n.player.next {\\n border-style: none;\\n width: 48px;\\n height: 48px;\\n}\\n\\n.player.previous {\\n border-style: none;\\n width: 48px;\\n height: 48px;\\n}\\n\\ntable.player {\\n border-collapse: collapse;\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy9zdHlsZXMvbXVzaWNQbGF5ZXIuY3NzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDNkc7QUFDakI7QUFDNUYsOEJBQThCLG1GQUEyQixDQUFDLDRGQUFxQztBQUMvRjtBQUNBLDREQUE0RCw2QkFBNkIsbUJBQW1CLGdCQUFnQixnQ0FBZ0MsZ0NBQWdDLHNCQUFzQiw4REFBOEQsNEJBQTRCLHVDQUF1QyxHQUFHLDRCQUE0QiwyQkFBMkIscUNBQXFDLEdBQUcsb0JBQW9CLHlCQUF5QixrQkFBa0IsbUJBQW1CLEdBQUcsc0JBQXNCLHlCQUF5QixrQkFBa0IsbUJBQW1CLEdBQUcsa0JBQWtCLGdDQUFnQyxHQUFHLE9BQU8sNkZBQTZGLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxXQUFXLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsUUFBUSxLQUFLLFlBQVksV0FBVyxVQUFVLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxPQUFPLEtBQUssWUFBWSw0Q0FBNEMsNkJBQTZCLG1CQUFtQixnQkFBZ0IsZ0NBQWdDLGdDQUFnQyxzQkFBc0IsOERBQThELDRCQUE0Qix1Q0FBdUMsR0FBRyw0QkFBNEIsMkJBQTJCLHFDQUFxQyxHQUFHLG9CQUFvQix5QkFBeUIsa0JBQWtCLG1CQUFtQixHQUFHLHNCQUFzQix5QkFBeUIsa0JBQWtCLG1CQUFtQixHQUFHLGtCQUFrQixnQ0FBZ0MsR0FBRyxtQkFBbUI7QUFDdnBEO0FBQ0EsaUVBQWUsdUJBQXVCLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hdWRpb3Nob3draXQvLi9zcmMvc3R5bGVzL211c2ljUGxheWVyLmNzcz82MzUzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLnBsYXllci5wbGF5LWJ0biB7XFxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgIGhlaWdodDogNDhweDtcXG4gICAgd2lkdGg6IDQ4O1xcbiAgICB0cmFuc2l0aW9uOiA4MG1zIGFsbCBlYXNlO1xcbiAgICB3aWxsLWNoYW5nZTogYm9yZGVyLXdpZHRoO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgYmxhY2s7XFxuXFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci13aWR0aDogMjRweCAwcHggMjRweCA0OHB4O1xcbn1cXG5cXG4ucGxheWVyLnBsYXktYnRuLnBhdXNlIHtcXG4gICAgYm9yZGVyLXN0eWxlOiBkb3VibGU7XFxuICAgIGJvcmRlci13aWR0aDogMHB4IDBweCAwcHggNjBweDtcXG59XFxuXFxuXFxuLnBsYXllci5uZXh0IHtcXG4gICAgYm9yZGVyLXN0eWxlOiBub25lO1xcbiAgICB3aWR0aDogNDhweDtcXG4gICAgaGVpZ2h0OiA0OHB4O1xcbn1cXG5cXG4ucGxheWVyLnByZXZpb3VzIHtcXG4gICAgYm9yZGVyLXN0eWxlOiBub25lO1xcbiAgICB3aWR0aDogNDhweDtcXG4gICAgaGVpZ2h0OiA0OHB4O1xcbn1cXG5cXG50YWJsZS5wbGF5ZXIge1xcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xcbn1cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGVzL211c2ljUGxheWVyLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQUFBQTtJQUNJLHNCQUFzQjtJQUN0QixZQUFZO0lBQ1osU0FBUztJQUNULHlCQUF5QjtJQUN6Qix5QkFBeUI7SUFDekIsZUFBZTtJQUNmLHVEQUF1RDs7SUFFdkQsbUJBQW1CO0lBQ25CLGdDQUFnQztBQUNwQzs7QUFFQTtJQUNJLG9CQUFvQjtJQUNwQiw4QkFBOEI7QUFDbEM7OztBQUdBO0lBQ0ksa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxZQUFZO0FBQ2hCOztBQUVBO0lBQ0ksa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxZQUFZO0FBQ2hCOztBQUVBO0lBQ0kseUJBQXlCO0FBQzdCXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIi5wbGF5ZXIucGxheS1idG4ge1xcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgICBoZWlnaHQ6IDQ4cHg7XFxuICAgIHdpZHRoOiA0ODtcXG4gICAgdHJhbnNpdGlvbjogODBtcyBhbGwgZWFzZTtcXG4gICAgd2lsbC1jaGFuZ2U6IGJvcmRlci13aWR0aDtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IGJsYWNrO1xcblxcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xcbiAgICBib3JkZXItd2lkdGg6IDI0cHggMHB4IDI0cHggNDhweDtcXG59XFxuXFxuLnBsYXllci5wbGF5LWJ0bi5wYXVzZSB7XFxuICAgIGJvcmRlci1zdHlsZTogZG91YmxlO1xcbiAgICBib3JkZXItd2lkdGg6IDBweCAwcHggMHB4IDYwcHg7XFxufVxcblxcblxcbi5wbGF5ZXIubmV4dCB7XFxuICAgIGJvcmRlci1zdHlsZTogbm9uZTtcXG4gICAgd2lkdGg6IDQ4cHg7XFxuICAgIGhlaWdodDogNDhweDtcXG59XFxuXFxuLnBsYXllci5wcmV2aW91cyB7XFxuICAgIGJvcmRlci1zdHlsZTogbm9uZTtcXG4gICAgd2lkdGg6IDQ4cHg7XFxuICAgIGhlaWdodDogNDhweDtcXG59XFxuXFxudGFibGUucGxheWVyIHtcXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcXG59XCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js!./src/styles/musicPlayer.css\n"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/runtime/api.js": +/*!*****************************************************!*\ + !*** ./node_modules/css-loader/dist/runtime/api.js ***! + \*****************************************************/ +/***/ ((module) => { + +eval("\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n\n content += cssWithMappingToString(item);\n\n if (needLayer) {\n content += \"}\";\n }\n\n if (item[2]) {\n content += \"}\";\n }\n\n if (item[4]) {\n content += \"}\";\n }\n\n return content;\n }).join(\"\");\n }; // import a list of modules into the list\n\n\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscURBQXFEO0FBQ3JEOztBQUVBO0FBQ0EsZ0RBQWdEO0FBQ2hEOztBQUVBO0FBQ0EscUZBQXFGO0FBQ3JGOztBQUVBOztBQUVBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0EsS0FBSztBQUNMLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esc0JBQXNCLGlCQUFpQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixxQkFBcUI7QUFDMUM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixzRkFBc0YscUJBQXFCO0FBQzNHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsaURBQWlELHFCQUFxQjtBQUN0RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLHNEQUFzRCxxQkFBcUI7QUFDM0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXVkaW9zaG93a2l0Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcz8yNGZiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdOyAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG5cbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuXG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG5cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTsgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcblxuXG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG5cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuXG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG5cbiAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBfayA9IDA7IF9rIDwgbW9kdWxlcy5sZW5ndGg7IF9rKyspIHtcbiAgICAgIHZhciBpdGVtID0gW10uY29uY2F0KG1vZHVsZXNbX2tdKTtcblxuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBsaXN0O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/api.js\n"); + +/***/ }), + +/***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js": +/*!************************************************************!*\ + !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***! + \************************************************************/ +/***/ ((module) => { + +eval("\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n }\n\n return [content].join(\"\\n\");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsY0FBYztBQUNyRTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXVkaW9zaG93a2l0Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanM/YWYxMiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcblxuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICB2YXIgc291cmNlVVJMcyA9IGNzc01hcHBpbmcuc291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIFwiLyojIHNvdXJjZVVSTD1cIi5jb25jYXQoY3NzTWFwcGluZy5zb3VyY2VSb290IHx8IFwiXCIpLmNvbmNhdChzb3VyY2UsIFwiICovXCIpO1xuICAgIH0pO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KHNvdXJjZVVSTHMpLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/sourceMaps.js\n"); + +/***/ }), + +/***/ "./src/styles/musicPlayer.css": +/*!************************************!*\ + !*** ./src/styles/musicPlayer.css ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ \"./node_modules/style-loader/dist/runtime/styleDomAPI.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ \"./node_modules/style-loader/dist/runtime/insertBySelector.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ \"./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ \"./node_modules/style-loader/dist/runtime/insertStyleElement.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ \"./node_modules/style-loader/dist/runtime/styleTagTransform.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_musicPlayer_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!./musicPlayer.css */ \"./node_modules/css-loader/dist/cjs.js!./src/styles/musicPlayer.css\");\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());\noptions.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());\n\n options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, \"head\");\n \noptions.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());\noptions.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_musicPlayer_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"], options);\n\n\n\n\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_musicPlayer_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"] && _node_modules_css_loader_dist_cjs_js_musicPlayer_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals ? _node_modules_css_loader_dist_cjs_js_musicPlayer_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals : undefined);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3R5bGVzL211c2ljUGxheWVyLmNzcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxNQUFrRztBQUNsRyxNQUF3RjtBQUN4RixNQUErRjtBQUMvRixNQUFrSDtBQUNsSCxNQUEyRztBQUMzRyxNQUEyRztBQUMzRyxNQUE0RztBQUM1RztBQUNBOztBQUVBOztBQUVBLDRCQUE0QixxR0FBbUI7QUFDL0Msd0JBQXdCLGtIQUFhOztBQUVyQyx1QkFBdUIsdUdBQWE7QUFDcEM7QUFDQSxpQkFBaUIsK0ZBQU07QUFDdkIsNkJBQTZCLHNHQUFrQjs7QUFFL0MsYUFBYSwwR0FBRyxDQUFDLDRGQUFPOzs7O0FBSXNEO0FBQzlFLE9BQU8saUVBQWUsNEZBQU8sSUFBSSxtR0FBYyxHQUFHLG1HQUFjLFlBQVksRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2F1ZGlvc2hvd2tpdC8uL3NyYy9zdHlsZXMvbXVzaWNQbGF5ZXIuY3NzP2YzNWYiXSwic291cmNlc0NvbnRlbnQiOlsiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL211c2ljUGxheWVyLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbXVzaWNQbGF5ZXIuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/styles/musicPlayer.css\n"); + +/***/ }), + +/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js": +/*!****************************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***! + \****************************************************************************/ +/***/ ((module) => { + +eval("\n\nvar stylesInDOM = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n\n return updater;\n}\n\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n\n stylesInDOM.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0Isd0JBQXdCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxxQkFBcUIsNkJBQTZCO0FBQ2xEOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2F1ZGlvc2hvd2tpdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcz8yZGJhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG5cbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuXG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuXG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB1cGRhdGVyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuXG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuXG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuXG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuXG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\n"); + +/***/ }), + +/***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js": +/*!********************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***! + \********************************************************************/ +/***/ ((module) => { + +eval("\n\nvar memo = {};\n/* istanbul ignore next */\n\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n}\n/* istanbul ignore next */\n\n\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n}\n\nmodule.exports = insertBySelector;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2F1ZGlvc2hvd2tpdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanM/YjIxNCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpOyAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG5cbiAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuXG5cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG5cbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/insertBySelector.js\n"); + +/***/ }), + +/***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js": +/*!**********************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***! + \**********************************************************************/ +/***/ ((module) => { + +eval("\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\n\nmodule.exports = insertStyleElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hdWRpb3Nob3draXQvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanM/ZGU2YyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/insertStyleElement.js\n"); + +/***/ }), + +/***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***! + \**********************************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +eval("\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\n\nmodule.exports = setAttributesWithoutAttributes;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLGNBQWMsS0FBd0MsR0FBRyxzQkFBaUIsR0FBRyxDQUFJOztBQUVqRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL2F1ZGlvc2hvd2tpdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcz9kZGNlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuXG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\n"); + +/***/ }), + +/***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js": +/*!***************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***! + \***************************************************************/ +/***/ ((module) => { + +eval("\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n\n var needLayer = typeof obj.layer !== \"undefined\";\n\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n\n css += obj.css;\n\n if (needLayer) {\n css += \"}\";\n }\n\n if (obj.media) {\n css += \"}\";\n }\n\n if (obj.supports) {\n css += \"}\";\n }\n\n var sourceMap = obj.sourceMap;\n\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n options.styleTagTransform(css, styleElement, options.options);\n}\n\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n\n styleElement.parentNode.removeChild(styleElement);\n}\n/* istanbul ignore next */\n\n\nfunction domAPI(options) {\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\n\nmodule.exports = domAPI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrREFBa0Q7QUFDbEQ7O0FBRUE7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7O0FBRUE7QUFDQSxpRkFBaUY7QUFDakY7O0FBRUE7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7O0FBRUE7QUFDQSx5REFBeUQ7QUFDekQsSUFBSTs7QUFFSjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXVkaW9zaG93a2l0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanM/ZTQ3OSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcblxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuXG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuXG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cblxuICBjc3MgKz0gb2JqLmNzcztcblxuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG5cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuXG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cblxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblxuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH0gLy8gRm9yIG9sZCBJRVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cblxuXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/styleDomAPI.js\n"); + +/***/ }), + +/***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js": +/*!*********************************************************************!*\ + !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***! + \*********************************************************************/ +/***/ ((module) => { + +eval("\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n\n styleElement.appendChild(document.createTextNode(css));\n }\n}\n\nmodule.exports = styleTagTransform;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXVkaW9zaG93a2l0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanM/MWRkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/styleTagTransform.js\n"); + +/***/ }), + +/***/ "./src/audioshowkitlib.js": +/*!********************************!*\ + !*** ./src/audioshowkitlib.js ***! + \********************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"mappings\": () => (/* reexport module object */ _mapping_mappings_js__WEBPACK_IMPORTED_MODULE_0__),\n/* harmony export */ \"player\": () => (/* reexport module object */ _player_player_js__WEBPACK_IMPORTED_MODULE_1__),\n/* harmony export */ \"support\": () => (/* reexport module object */ _support_support_js__WEBPACK_IMPORTED_MODULE_3__),\n/* harmony export */ \"visualization\": () => (/* reexport module object */ _visualization_visualization_js__WEBPACK_IMPORTED_MODULE_2__)\n/* harmony export */ });\n/* harmony import */ var _mapping_mappings_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mapping/mappings.js */ \"./src/mapping/mappings.js\");\n/* harmony import */ var _player_player_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./player/player.js */ \"./src/player/player.js\");\n/* harmony import */ var _visualization_visualization_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./visualization/visualization.js */ \"./src/visualization/visualization.js\");\n/* harmony import */ var _support_support_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./support/support.js */ \"./src/support/support.js\");\n// TODO: basic playlist display.\n// TODO: Demo functions.\n// TODO: Detect annotated elements.\n// TODO: Create getting started.\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvYXVkaW9zaG93a2l0bGliLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2F1ZGlvc2hvd2tpdC8uL3NyYy9hdWRpb3Nob3draXRsaWIuanM/MjgxMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUT0RPOiBiYXNpYyBwbGF5bGlzdCBkaXNwbGF5LlxuLy8gVE9ETzogRGVtbyBmdW5jdGlvbnMuXG4vLyBUT0RPOiBEZXRlY3QgYW5ub3RhdGVkIGVsZW1lbnRzLlxuLy8gVE9ETzogQ3JlYXRlIGdldHRpbmcgc3RhcnRlZC5cblxuXG5cbmltcG9ydCAqIGFzIG1hcHBpbmdzIGZyb20gXCIuL21hcHBpbmcvbWFwcGluZ3MuanNcIjtcbmltcG9ydCAqIGFzIHBsYXllciBmcm9tIFwiLi9wbGF5ZXIvcGxheWVyLmpzXCI7XG5pbXBvcnQgKiBhcyB2aXN1YWxpemF0aW9uIGZyb20gXCIuL3Zpc3VhbGl6YXRpb24vdmlzdWFsaXphdGlvbi5qc1wiO1xuaW1wb3J0ICogYXMgc3VwcG9ydCBmcm9tIFwiLi9zdXBwb3J0L3N1cHBvcnQuanNcIjtcblxuZXhwb3J0IHsgbWFwcGluZ3MsIHBsYXllciwgdmlzdWFsaXphdGlvbiwgc3VwcG9ydCB9OyJdLCJuYW1lcyI6WyJtYXBwaW5ncyIsInBsYXllciIsInZpc3VhbGl6YXRpb24iLCJzdXBwb3J0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/audioshowkitlib.js\n"); + +/***/ }), + +/***/ "./src/mapping/dimensions.js": +/*!***********************************!*\ + !*** ./src/mapping/dimensions.js ***! + \***********************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"mapHeight\": () => (/* binding */ mapHeight),\n/* harmony export */ \"mapWidth\": () => (/* binding */ mapWidth)\n/* harmony export */ });\n/* harmony import */ var _visualization_VisualizerUpdateManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../visualization/VisualizerUpdateManager.js */ \"./src/visualization/VisualizerUpdateManager.js\");\n/* harmony import */ var _numeric_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./numeric.js */ \"./src/mapping/numeric.js\");\n\n\n/**\n * Maps the width of an element to frequency bin(s).\n * \n * @param {object} conf The configuration for mapping amplitudes to a width CSS property.\n * @param {HTMLElement} conf.element The html element to map the width to.\n * @param {number} conf.growLower The lower limit of the width.\n * @param {number} conf.growUpper The upper limit of the width.\n * @param {string} conf.unit The unit the upper and lower bounds are measured in.\n * @param {number} conf.lowerBin The lower boundary of bins to be mapped (or the single bin to be mapped if the upper bin is undefined).\n * @param {VisualizerUpdateManager} conf.visUpdateManager The visualizer update manager to be mapped to.\n * @param {interpolator} conf.interpolator The interpolation function to be used to transition from one value to the next.\n * @param {number} [conf.upperBin] The upper bin or undefined, which results in mapping to a single bin.\n * @param {boolean} [conf.reversed=false] If true, then high amplitudes are mapped to lower values and vice versa.\n * @returns {{bin: number, listener: VisualizerUpdateManager.visualizerBinUpdateListener}|{lower: number, upper: number, listener: VisualizerUpdateManager.visualizerRangedUpdateListener}} The listener that was added (ranged if an upper bound was provided, binned otherwise).\n */\n\nfunction mapWidth(_ref) {\n var element = _ref.element,\n growLower = _ref.growLower,\n growUpper = _ref.growUpper,\n unit = _ref.unit,\n lowerBin = _ref.lowerBin,\n visUpdateManager = _ref.visUpdateManager,\n interpolator = _ref.interpolator,\n _ref$upperBin = _ref.upperBin,\n upperBin = _ref$upperBin === void 0 ? undefined : _ref$upperBin,\n _ref$reversed = _ref.reversed,\n reversed = _ref$reversed === void 0 ? false : _ref$reversed;\n\n var getter = function getter() {\n return element.style.width;\n };\n\n var setter = function setter(value) {\n return element.style.width = value + unit;\n };\n\n var conf = {\n minVal: growLower,\n maxVal: growUpper,\n bin: lowerBin,\n getter: getter,\n setter: setter,\n interpolator: interpolator,\n visUpdateManager: visUpdateManager,\n reversed: reversed\n };\n\n if (upperBin) {\n conf.bin = undefined;\n conf.lowerBin = lowerBin;\n conf.upperBin = upperBin;\n return (0,_numeric_js__WEBPACK_IMPORTED_MODULE_1__.mapRangedAvgNumerical)(conf);\n }\n\n return (0,_numeric_js__WEBPACK_IMPORTED_MODULE_1__.mapBinNumerical)(conf);\n}\n/**\n * Maps the height of an element to frequency bin(s).\n * \n * @param {object} conf The configuration for mapping amplitudes to a height CSS property.\n * @param {HTMLElement} conf.element The html element to map the height to.\n * @param {number} conf.growLower The lower limit of the height.\n * @param {number} conf.growUpper The upper limit of the height.\n * @param {string} conf.unit The unit the upper and lower bounds are measured in.\n * @param {number} conf.lowerBin The lower boundary of bins to be mapped (or the single bin to be mapped if the upper bin is undefined).\n * @param {VisualizerUpdateManager} conf.visUpdateManager The visualizer update manager to be mapped to.\n * @param {interpolator} conf.interpolator The interpolation function to be used to transition from one value to the next.\n * @param {number} [conf.upperBin] The upper bin or undefined, which results in mapping to a single bin.\n * @param {boolean} [conf.reversed=false] If true, then high amplitudes are mapped to lower values and vice versa.\n * @returns {{bin: number, listener: VisualizerUpdateManager.visualizerBinUpdateListener}|{lower: number, upper: number, listener: VisualizerUpdateManager.visualizerRangedUpdateListener}} The listener that was added (ranged if an upper bound was provided, binned otherwise).\n */\n\n\nfunction mapHeight(_ref2) {\n var element = _ref2.element,\n growLower = _ref2.growLower,\n growUpper = _ref2.growUpper,\n unit = _ref2.unit,\n lowerBin = _ref2.lowerBin,\n visUpdateManager = _ref2.visUpdateManager,\n interpolator = _ref2.interpolator,\n _ref2$upperBin = _ref2.upperBin,\n upperBin = _ref2$upperBin === void 0 ? undefined : _ref2$upperBin,\n _ref2$reversed = _ref2.reversed,\n reversed = _ref2$reversed === void 0 ? false : _ref2$reversed;\n\n var getter = function getter() {\n return element.style.height;\n };\n\n var setter = function setter(value) {\n return element.style.height = value + unit;\n };\n\n var conf = {\n minVal: growLower,\n maxVal: growUpper,\n bin: lowerBin,\n getter: getter,\n setter: setter,\n interpolator: interpolator,\n visUpdateManager: visUpdateManager,\n reversed: reversed\n };\n\n if (upperBin) {\n conf.bin = undefined;\n conf.lowerBin = lowerBin;\n conf.upperBin = upperBin;\n return (0,_numeric_js__WEBPACK_IMPORTED_MODULE_1__.mapRangedAvgNumerical)(conf);\n }\n\n return (0,_numeric_js__WEBPACK_IMPORTED_MODULE_1__.mapBinNumerical)(conf);\n}\n/**@module */\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QSxNQUFNWSxJQUFJLEdBQUc7QUFDVEMsSUFBQUEsTUFBTSxFQUFFZixTQURDO0FBRVRnQixJQUFBQSxNQUFNLEVBQUVmLFNBRkM7QUFHVGdCLElBQUFBLEdBQUcsRUFBRWQsUUFISTtBQUlUTSxJQUFBQSxNQUFNLEVBQUVBLE1BSkM7QUFLVEcsSUFBQUEsTUFBTSxFQUFFQSxNQUxDO0FBTVRQLElBQUFBLFlBQVksRUFBRUEsWUFOTDtBQU9URCxJQUFBQSxnQkFBZ0IsRUFBRUEsZ0JBUFQ7QUFRVEksSUFBQUEsUUFBUSxFQUFFQTtBQVJELEdBQWI7O0FBV0EsTUFBSUYsUUFBSixFQUFjO0FBQ1ZRLElBQUFBLElBQUksQ0FBQ0csR0FBTCxHQUFXVixTQUFYO0FBQ0FPLElBQUFBLElBQUksQ0FBQ1gsUUFBTCxHQUFnQkEsUUFBaEI7QUFDQVcsSUFBQUEsSUFBSSxDQUFDUixRQUFMLEdBQWdCQSxRQUFoQjtBQUNBLFdBQU9ULGtFQUFxQixDQUFDaUIsSUFBRCxDQUE1QjtBQUNIOztBQUNELFNBQU9sQiw0REFBZSxDQUFDa0IsSUFBRCxDQUF0QjtBQUNIO0FBRUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hdWRpb3Nob3draXQvLi9zcmMvbWFwcGluZy9kaW1lbnNpb25zLmpzPzc3NzMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyIGZyb20gXCIuLi92aXN1YWxpemF0aW9uL1Zpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBtYXBCaW5OdW1lcmljYWwsIG1hcFJhbmdlZEF2Z051bWVyaWNhbCB9IGZyb20gXCIuL251bWVyaWMuanNcIjtcblxuXG4vKipcbiAqIE1hcHMgdGhlIHdpZHRoIG9mIGFuIGVsZW1lbnQgdG8gZnJlcXVlbmN5IGJpbihzKS5cbiAqIFxuICogQHBhcmFtIHtvYmplY3R9IGNvbmYgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIG1hcHBpbmcgYW1wbGl0dWRlcyB0byBhIHdpZHRoIENTUyBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbmYuZWxlbWVudCBUaGUgaHRtbCBlbGVtZW50IHRvIG1hcCB0aGUgd2lkdGggdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gY29uZi5ncm93TG93ZXIgVGhlIGxvd2VyIGxpbWl0IG9mIHRoZSB3aWR0aC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb25mLmdyb3dVcHBlciBUaGUgdXBwZXIgbGltaXQgb2YgdGhlIHdpZHRoLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmYudW5pdCBUaGUgdW5pdCB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBhcmUgbWVhc3VyZWQgaW4uXG4gKiBAcGFyYW0ge251bWJlcn0gY29uZi5sb3dlckJpbiBUaGUgbG93ZXIgYm91bmRhcnkgb2YgYmlucyB0byBiZSBtYXBwZWQgKG9yIHRoZSBzaW5nbGUgYmluIHRvIGJlIG1hcHBlZCBpZiB0aGUgdXBwZXIgYmluIGlzIHVuZGVmaW5lZCkuXG4gKiBAcGFyYW0ge1Zpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyfSBjb25mLnZpc1VwZGF0ZU1hbmFnZXIgVGhlIHZpc3VhbGl6ZXIgdXBkYXRlIG1hbmFnZXIgdG8gYmUgbWFwcGVkIHRvLlxuICogQHBhcmFtIHtpbnRlcnBvbGF0b3J9IGNvbmYuaW50ZXJwb2xhdG9yIFRoZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gdHJhbnNpdGlvbiBmcm9tIG9uZSB2YWx1ZSB0byB0aGUgbmV4dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbY29uZi51cHBlckJpbl0gVGhlIHVwcGVyIGJpbiBvciB1bmRlZmluZWQsIHdoaWNoIHJlc3VsdHMgaW4gbWFwcGluZyB0byBhIHNpbmdsZSBiaW4uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25mLnJldmVyc2VkPWZhbHNlXSBJZiB0cnVlLCB0aGVuIGhpZ2ggYW1wbGl0dWRlcyBhcmUgbWFwcGVkIHRvIGxvd2VyIHZhbHVlcyBhbmQgdmljZSB2ZXJzYS5cbiAqIEByZXR1cm5zIHt7YmluOiBudW1iZXIsIGxpc3RlbmVyOiBWaXN1YWxpemVyVXBkYXRlTWFuYWdlci52aXN1YWxpemVyQmluVXBkYXRlTGlzdGVuZXJ9fHtsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyLCBsaXN0ZW5lcjogVmlzdWFsaXplclVwZGF0ZU1hbmFnZXIudmlzdWFsaXplclJhbmdlZFVwZGF0ZUxpc3RlbmVyfX0gVGhlIGxpc3RlbmVyIHRoYXQgd2FzIGFkZGVkIChyYW5nZWQgaWYgYW4gdXBwZXIgYm91bmQgd2FzIHByb3ZpZGVkLCBiaW5uZWQgb3RoZXJ3aXNlKS5cbiAqL1xuZnVuY3Rpb24gbWFwV2lkdGgoeyBlbGVtZW50LCBncm93TG93ZXIsIGdyb3dVcHBlciwgdW5pdCwgbG93ZXJCaW4sIHZpc1VwZGF0ZU1hbmFnZXIsIGludGVycG9sYXRvciwgdXBwZXJCaW4gPSB1bmRlZmluZWQsIHJldmVyc2VkID0gZmFsc2UgfSkge1xuICAgIGNvbnN0IGdldHRlciA9ICgpID0+IGVsZW1lbnQuc3R5bGUud2lkdGg7XG4gICAgY29uc3Qgc2V0dGVyID0gKHZhbHVlKSA9PiBlbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWUgKyB1bml0O1xuICAgIGNvbnN0IGNvbmYgPSB7XG4gICAgICAgIG1pblZhbDogZ3Jvd0xvd2VyLFxuICAgICAgICBtYXhWYWw6IGdyb3dVcHBlcixcbiAgICAgICAgYmluOiBsb3dlckJpbixcbiAgICAgICAgZ2V0dGVyOiBnZXR0ZXIsXG4gICAgICAgIHNldHRlcjogc2V0dGVyLFxuICAgICAgICBpbnRlcnBvbGF0b3I6IGludGVycG9sYXRvcixcbiAgICAgICAgdmlzVXBkYXRlTWFuYWdlcjogdmlzVXBkYXRlTWFuYWdlcixcbiAgICAgICAgcmV2ZXJzZWQ6IHJldmVyc2VkXG4gICAgfTtcblxuICAgIGlmICh1cHBlckJpbikge1xuICAgICAgICBjb25mLmJpbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uZi5sb3dlckJpbiA9IGxvd2VyQmluO1xuICAgICAgICBjb25mLnVwcGVyQmluID0gdXBwZXJCaW47XG4gICAgICAgIHJldHVybiBtYXBSYW5nZWRBdmdOdW1lcmljYWwoY29uZik7XG4gICAgfVxuICAgIHJldHVybiBtYXBCaW5OdW1lcmljYWwoY29uZik7XG59XG5cbi8qKlxuICogTWFwcyB0aGUgaGVpZ2h0IG9mIGFuIGVsZW1lbnQgdG8gZnJlcXVlbmN5IGJpbihzKS5cbiAqIFxuICogQHBhcmFtIHtvYmplY3R9IGNvbmYgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIG1hcHBpbmcgYW1wbGl0dWRlcyB0byBhIGhlaWdodCBDU1MgcHJvcGVydHkuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb25mLmVsZW1lbnQgVGhlIGh0bWwgZWxlbWVudCB0byBtYXAgdGhlIGhlaWdodCB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb25mLmdyb3dMb3dlciBUaGUgbG93ZXIgbGltaXQgb2YgdGhlIGhlaWdodC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb25mLmdyb3dVcHBlciBUaGUgdXBwZXIgbGltaXQgb2YgdGhlIGhlaWdodC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25mLnVuaXQgVGhlIHVuaXQgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgYXJlIG1lYXN1cmVkIGluLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbmYubG93ZXJCaW4gVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIGJpbnMgdG8gYmUgbWFwcGVkIChvciB0aGUgc2luZ2xlIGJpbiB0byBiZSBtYXBwZWQgaWYgdGhlIHVwcGVyIGJpbiBpcyB1bmRlZmluZWQpLlxuICogQHBhcmFtIHtWaXN1YWxpemVyVXBkYXRlTWFuYWdlcn0gY29uZi52aXNVcGRhdGVNYW5hZ2VyIFRoZSB2aXN1YWxpemVyIHVwZGF0ZSBtYW5hZ2VyIHRvIGJlIG1hcHBlZCB0by5cbiAqIEBwYXJhbSB7aW50ZXJwb2xhdG9yfSBjb25mLmludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbiB0byBiZSB1c2VkIHRvIHRyYW5zaXRpb24gZnJvbSBvbmUgdmFsdWUgdG8gdGhlIG5leHQuXG4gKiBAcGFyYW0ge251bWJlcn0gW2NvbmYudXBwZXJCaW5dIFRoZSB1cHBlciBiaW4gb3IgdW5kZWZpbmVkLCB3aGljaCByZXN1bHRzIGluIG1hcHBpbmcgdG8gYSBzaW5nbGUgYmluLlxuICogQHBhcmFtIHtib29sZWFufSBbY29uZi5yZXZlcnNlZD1mYWxzZV0gSWYgdHJ1ZSwgdGhlbiBoaWdoIGFtcGxpdHVkZXMgYXJlIG1hcHBlZCB0byBsb3dlciB2YWx1ZXMgYW5kIHZpY2UgdmVyc2EuXG4gKiBAcmV0dXJucyB7e2JpbjogbnVtYmVyLCBsaXN0ZW5lcjogVmlzdWFsaXplclVwZGF0ZU1hbmFnZXIudmlzdWFsaXplckJpblVwZGF0ZUxpc3RlbmVyfXx7bG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlciwgbGlzdGVuZXI6IFZpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyLnZpc3VhbGl6ZXJSYW5nZWRVcGRhdGVMaXN0ZW5lcn19IFRoZSBsaXN0ZW5lciB0aGF0IHdhcyBhZGRlZCAocmFuZ2VkIGlmIGFuIHVwcGVyIGJvdW5kIHdhcyBwcm92aWRlZCwgYmlubmVkIG90aGVyd2lzZSkuXG4gKi9cbmZ1bmN0aW9uIG1hcEhlaWdodCh7IGVsZW1lbnQsIGdyb3dMb3dlciwgZ3Jvd1VwcGVyLCB1bml0LCBsb3dlckJpbiwgdmlzVXBkYXRlTWFuYWdlciwgaW50ZXJwb2xhdG9yLCB1cHBlckJpbiA9IHVuZGVmaW5lZCwgcmV2ZXJzZWQgPSBmYWxzZSB9KSB7XG4gICAgY29uc3QgZ2V0dGVyID0gKCkgPT4gZWxlbWVudC5zdHlsZS5oZWlnaHQ7XG4gICAgY29uc3Qgc2V0dGVyID0gKHZhbHVlKSA9PiBlbGVtZW50LnN0eWxlLmhlaWdodCA9IHZhbHVlICsgdW5pdDtcbiAgICBjb25zdCBjb25mID0ge1xuICAgICAgICBtaW5WYWw6IGdyb3dMb3dlcixcbiAgICAgICAgbWF4VmFsOiBncm93VXBwZXIsXG4gICAgICAgIGJpbjogbG93ZXJCaW4sXG4gICAgICAgIGdldHRlcjogZ2V0dGVyLFxuICAgICAgICBzZXR0ZXI6IHNldHRlcixcbiAgICAgICAgaW50ZXJwb2xhdG9yOiBpbnRlcnBvbGF0b3IsXG4gICAgICAgIHZpc1VwZGF0ZU1hbmFnZXI6IHZpc1VwZGF0ZU1hbmFnZXIsXG4gICAgICAgIHJldmVyc2VkOiByZXZlcnNlZFxuICAgIH07XG5cbiAgICBpZiAodXBwZXJCaW4pIHtcbiAgICAgICAgY29uZi5iaW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbmYubG93ZXJCaW4gPSBsb3dlckJpbjtcbiAgICAgICAgY29uZi51cHBlckJpbiA9IHVwcGVyQmluO1xuICAgICAgICByZXR1cm4gbWFwUmFuZ2VkQXZnTnVtZXJpY2FsKGNvbmYpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwQmluTnVtZXJpY2FsKGNvbmYpO1xufVxuXG4vKipAbW9kdWxlICovXG5leHBvcnQgeyBtYXBXaWR0aCwgbWFwSGVpZ2h0IH07Il0sIm5hbWVzIjpbIlZpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyIiwibWFwQmluTnVtZXJpY2FsIiwibWFwUmFuZ2VkQXZnTnVtZXJpY2FsIiwibWFwV2lkdGgiLCJlbGVtZW50IiwiZ3Jvd0xvd2VyIiwiZ3Jvd1VwcGVyIiwidW5pdCIsImxvd2VyQmluIiwidmlzVXBkYXRlTWFuYWdlciIsImludGVycG9sYXRvciIsInVwcGVyQmluIiwidW5kZWZpbmVkIiwicmV2ZXJzZWQiLCJnZXR0ZXIiLCJzdHlsZSIsIndpZHRoIiwic2V0dGVyIiwidmFsdWUiLCJjb25mIiwibWluVmFsIiwibWF4VmFsIiwiYmluIiwibWFwSGVpZ2h0IiwiaGVpZ2h0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/mapping/dimensions.js\n"); + +/***/ }), + +/***/ "./src/mapping/mappings.js": +/*!*********************************!*\ + !*** ./src/mapping/mappings.js ***! + \*********************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"dimensions\": () => (/* reexport module object */ _dimensions_js__WEBPACK_IMPORTED_MODULE_0__),\n/* harmony export */ \"numeric\": () => (/* reexport module object */ _numeric_js__WEBPACK_IMPORTED_MODULE_1__)\n/* harmony export */ });\n/* harmony import */ var _dimensions_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dimensions.js */ \"./src/mapping/dimensions.js\");\n/* harmony import */ var _numeric_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./numeric.js */ \"./src/mapping/numeric.js\");\n\n\n/**@module */\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbWFwcGluZy9tYXBwaW5ncy5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXVkaW9zaG93a2l0Ly4vc3JjL21hcHBpbmcvbWFwcGluZ3MuanM/NTdkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBkaW1lbnNpb25zIGZyb20gXCIuL2RpbWVuc2lvbnMuanNcIjtcbmltcG9ydCAqIGFzIG51bWVyaWMgZnJvbSBcIi4vbnVtZXJpYy5qc1wiO1xuXG4vKipAbW9kdWxlICovXG5leHBvcnQgeyBkaW1lbnNpb25zLCBudW1lcmljIH07Il0sIm5hbWVzIjpbImRpbWVuc2lvbnMiLCJudW1lcmljIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/mapping/mappings.js\n"); + +/***/ }), + +/***/ "./src/mapping/numeric.js": +/*!********************************!*\ + !*** ./src/mapping/numeric.js ***! + \********************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"mapBinNumerical\": () => (/* binding */ mapBinNumerical),\n/* harmony export */ \"mapRangedAvgNumerical\": () => (/* binding */ mapRangedAvgNumerical)\n/* harmony export */ });\n/* harmony import */ var _visualization_VisualizerUpdateManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../visualization/VisualizerUpdateManager.js */ \"./src/visualization/VisualizerUpdateManager.js\");\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\n\n/**\n * \n * @callback numericalGetter\n * @returns {number} The number this value currently represents.\n */\n\n/**\n * @callback numericalSetter\n * @param {number} value The new numerical value to update to.\n */\n// FIXME: Warnings about interpolator not being defined are broken. Docs generate fine.\n\n/**\n * Maps the average of a range of bins to numerical value defined by a getter and a setter.\n * \n * @param {object} conf A configuration for how to map a numerical value.\n * @param {number} conf.minVal The minimum value of the numerical value.\n * @param {number} conf.maxVal The maximum value of the numerical value.\n * @param {number} conf.lowerBin The lower bin of the range of bins this value is to be mapped to.\n * @param {number} conf.upperBin The upper bin of the range of bins this value si to be mapped to.\n * @param {numericalGetter} conf.getter The getter callback to be used to get the current number.\n * @param {numericalSetter} conf.setter The setter callback to be used to set the new number.\n * @param {interpolator} conf.interpolator The interpolation function to use.\n * @param {VisualizerUpdateManager} conf.visUpdateManager the visualizer update manager this mapping corresponds with.\n * @param {boolean} [conf.reversed = false] If true, then high amplitudes will be mapped to low values and vice versa.\n * @returns {{lower: number, upper: number, listener: VisualizerUpdateManager.visualizerRangedUpdateListener}} An object containing the lower and upper bounds for the range of a listener, which is also in the object.\n */\n\nfunction mapRangedAvgNumerical(_ref) {\n var minVal = _ref.minVal,\n maxVal = _ref.maxVal,\n _ref$lowerBin = _ref.lowerBin,\n lowerBin = _ref$lowerBin === void 0 ? undefined : _ref$lowerBin,\n upperBin = _ref.upperBin,\n getter = _ref.getter,\n setter = _ref.setter,\n interpolator = _ref.interpolator,\n visUpdateManager = _ref.visUpdateManager,\n _ref$reversed = _ref.reversed,\n reversed = _ref$reversed === void 0 ? false : _ref$reversed;\n var rangedListener = {\n lower: lowerBin,\n upper: upperBin,\n listener: function listener(timeDelta, bins) {\n var normalBins = _toConsumableArray(bins); // TODO: Future: add weighting / distribution system?\n\n\n var average = 0;\n\n for (var i = 0; i < normalBins.length; i++) {\n normalBins[i] = normalBins[i] / 255.0;\n average += normalBins[i];\n }\n\n average /= normalBins.length;\n var range = maxVal - minVal;\n var interpolated = interpolator(getter(), average, timeDelta);\n if (reversed) interpolated = 1 - interpolated;\n setter(minVal + range * interpolated);\n }\n };\n\n if (visUpdateManager.addVisualizerRangedUpdateListener(rangedListener)) {\n return rangedListener;\n }\n\n return null; // Technically doesn't occur since the functions are anonymous?\n}\n/**\n * Maps a single bin of frequency amplitudes to a numerical value defined by a getter and a setter.\n * \n * @param {object} conf The configuration for mapping a single bin to a numerical value.\n * @param {number} conf.minVal The minimum value the mapping can produce.\n * @param {number} conf.maxVal The maximum value the mapping can produce.\n * @param {number} conf.bin The bin to map this number to.\n * @param {numericalGetter} conf.getter The callback to be used to get the current number.\n * @param {numericalSetter} conf.setter The callback to be used to set the new number.\n * @param {interpolator} conf.interpolator The interpolation function to use.\n * @param {VisualizerUpdateManager} conf.visUpdateManager The update manager to map to.\n * @param {boolean} [conf.reversed] If true, then high amplitudes will be mapped to lower values and vice versa.\n * @returns {{bin: number, listener: VisualizerUpdateManager.visualizerBinUpdateListener}} The bin listener that was added.\n */\n\n\nfunction mapBinNumerical(_ref2) {\n var minVal = _ref2.minVal,\n maxVal = _ref2.maxVal,\n bin = _ref2.bin,\n getter = _ref2.getter,\n setter = _ref2.setter,\n interpolator = _ref2.interpolator,\n visUpdateManager = _ref2.visUpdateManager,\n _ref2$reversed = _ref2.reversed,\n reversed = _ref2$reversed === void 0 ? false : _ref2$reversed;\n var listener = {\n bin: bin,\n listener: function listener(timeDelta, amp) {\n var range = maxVal - minVal;\n var interpolated = interpolator(getter(), amp, timeDelta);\n if (reversed) interpolated = 1 - interpolated;\n setter(minVal + range * interpolated);\n }\n };\n\n if (visUpdateManager.AddVisualizerBinUpdateListener(listener)) {\n return listener;\n }\n\n return null; // Technically doesn't occur since the functions are anonymous?\n}\n/**@module */\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LGtCQUFDQyxTQUFELEVBQVlXLEdBQVosRUFBb0I7QUFDMUIsVUFBTUwsS0FBSyxHQUFHbkIsTUFBTSxHQUFHRCxNQUF2QjtBQUNBLFVBQUlxQixZQUFZLEdBQUdkLFlBQVksQ0FBQ0YsTUFBTSxFQUFQLEVBQVdvQixHQUFYLEVBQWdCWCxTQUFoQixDQUEvQjtBQUNBLFVBQUlMLFFBQUosRUFBY1ksWUFBWSxHQUFHLElBQUlBLFlBQW5CO0FBQ2RmLE1BQUFBLE1BQU0sQ0FBQ04sTUFBTSxHQUFHb0IsS0FBSyxHQUFHQyxZQUFsQixDQUFOO0FBQ0g7QUFQWSxHQUFqQjs7QUFTQSxNQUFJYixnQkFBZ0IsQ0FBQ2tCLDhCQUFqQixDQUFnRGIsUUFBaEQsQ0FBSixFQUErRDtBQUMzRCxXQUFPQSxRQUFQO0FBQ0g7O0FBQ0QsU0FBTyxJQUFQLENBYmdILENBYW5HO0FBQ2hCO0FBRUQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hdWRpb3Nob3draXQvLi9zcmMvbWFwcGluZy9udW1lcmljLmpzPzRmYTAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyIGZyb20gXCIuLi92aXN1YWxpemF0aW9uL1Zpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyLmpzXCI7XG5cbi8qKlxuICogXG4gKiBAY2FsbGJhY2sgbnVtZXJpY2FsR2V0dGVyXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbnVtYmVyIHRoaXMgdmFsdWUgY3VycmVudGx5IHJlcHJlc2VudHMuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgbnVtZXJpY2FsU2V0dGVyXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIG5ldyBudW1lcmljYWwgdmFsdWUgdG8gdXBkYXRlIHRvLlxuICovXG5cbi8vIEZJWE1FOiBXYXJuaW5ncyBhYm91dCBpbnRlcnBvbGF0b3Igbm90IGJlaW5nIGRlZmluZWQgYXJlIGJyb2tlbi4gRG9jcyBnZW5lcmF0ZSBmaW5lLlxuXG4vKipcbiAqIE1hcHMgdGhlIGF2ZXJhZ2Ugb2YgYSByYW5nZSBvZiBiaW5zIHRvIG51bWVyaWNhbCB2YWx1ZSBkZWZpbmVkIGJ5IGEgZ2V0dGVyIGFuZCBhIHNldHRlci5cbiAqIFxuICogQHBhcmFtIHtvYmplY3R9IGNvbmYgQSBjb25maWd1cmF0aW9uIGZvciBob3cgdG8gbWFwIGEgbnVtZXJpY2FsIHZhbHVlLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbmYubWluVmFsIFRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBudW1lcmljYWwgdmFsdWUuXG4gKiBAcGFyYW0ge251bWJlcn0gY29uZi5tYXhWYWwgVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIG51bWVyaWNhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb25mLmxvd2VyQmluIFRoZSBsb3dlciBiaW4gb2YgdGhlIHJhbmdlIG9mIGJpbnMgdGhpcyB2YWx1ZSBpcyB0byBiZSBtYXBwZWQgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gY29uZi51cHBlckJpbiBUaGUgdXBwZXIgYmluIG9mIHRoZSByYW5nZSBvZiBiaW5zIHRoaXMgdmFsdWUgc2kgdG8gYmUgbWFwcGVkIHRvLlxuICogQHBhcmFtIHtudW1lcmljYWxHZXR0ZXJ9IGNvbmYuZ2V0dGVyIFRoZSBnZXR0ZXIgY2FsbGJhY2sgdG8gYmUgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgbnVtYmVyLlxuICogQHBhcmFtIHtudW1lcmljYWxTZXR0ZXJ9IGNvbmYuc2V0dGVyIFRoZSBzZXR0ZXIgY2FsbGJhY2sgdG8gYmUgdXNlZCB0byBzZXQgdGhlIG5ldyBudW1iZXIuXG4gKiBAcGFyYW0ge2ludGVycG9sYXRvcn0gY29uZi5pbnRlcnBvbGF0b3IgVGhlIGludGVycG9sYXRpb24gZnVuY3Rpb24gdG8gdXNlLlxuICogQHBhcmFtIHtWaXN1YWxpemVyVXBkYXRlTWFuYWdlcn0gY29uZi52aXNVcGRhdGVNYW5hZ2VyIHRoZSB2aXN1YWxpemVyIHVwZGF0ZSBtYW5hZ2VyIHRoaXMgbWFwcGluZyBjb3JyZXNwb25kcyB3aXRoLlxuICogQHBhcmFtIHtib29sZWFufSBbY29uZi5yZXZlcnNlZCA9IGZhbHNlXSBJZiB0cnVlLCB0aGVuIGhpZ2ggYW1wbGl0dWRlcyB3aWxsIGJlIG1hcHBlZCB0byBsb3cgdmFsdWVzIGFuZCB2aWNlIHZlcnNhLlxuICogQHJldHVybnMge3tsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyLCBsaXN0ZW5lcjogVmlzdWFsaXplclVwZGF0ZU1hbmFnZXIudmlzdWFsaXplclJhbmdlZFVwZGF0ZUxpc3RlbmVyfX0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgZm9yIHRoZSByYW5nZSBvZiBhIGxpc3RlbmVyLCB3aGljaCBpcyBhbHNvIGluIHRoZSBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIG1hcFJhbmdlZEF2Z051bWVyaWNhbCh7IG1pblZhbCwgbWF4VmFsLCBsb3dlckJpbiA9IHVuZGVmaW5lZCwgdXBwZXJCaW4sIGdldHRlciwgc2V0dGVyLCBpbnRlcnBvbGF0b3IsIHZpc1VwZGF0ZU1hbmFnZXIsIHJldmVyc2VkID0gZmFsc2UgfSkge1xuICAgIGNvbnN0IHJhbmdlZExpc3RlbmVyID0ge1xuICAgICAgICBsb3dlcjogbG93ZXJCaW4sXG4gICAgICAgIHVwcGVyOiB1cHBlckJpbixcbiAgICAgICAgbGlzdGVuZXI6ICh0aW1lRGVsdGEsIGJpbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbEJpbnMgPSBbLi4uYmluc107XG4gICAgICAgICAgICAvLyBUT0RPOiBGdXR1cmU6IGFkZCB3ZWlnaHRpbmcgLyBkaXN0cmlidXRpb24gc3lzdGVtP1xuICAgICAgICAgICAgbGV0IGF2ZXJhZ2UgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub3JtYWxCaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsQmluc1tpXSA9IG5vcm1hbEJpbnNbaV0gLyAyNTUuMDtcbiAgICAgICAgICAgICAgICBhdmVyYWdlICs9IG5vcm1hbEJpbnNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdmVyYWdlIC89IG5vcm1hbEJpbnMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBtYXhWYWwgLSBtaW5WYWw7XG4gICAgICAgICAgICBsZXQgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdG9yKGdldHRlcigpLCBhdmVyYWdlLCB0aW1lRGVsdGEpO1xuICAgICAgICAgICAgaWYgKHJldmVyc2VkKSBpbnRlcnBvbGF0ZWQgPSAxIC0gaW50ZXJwb2xhdGVkO1xuICAgICAgICAgICAgc2V0dGVyKG1pblZhbCArIHJhbmdlICogaW50ZXJwb2xhdGVkKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKHZpc1VwZGF0ZU1hbmFnZXIuYWRkVmlzdWFsaXplclJhbmdlZFVwZGF0ZUxpc3RlbmVyKHJhbmdlZExpc3RlbmVyKSkge1xuICAgICAgICByZXR1cm4gcmFuZ2VkTGlzdGVuZXI7XG4gICAgfVxuICAgIHJldHVybiBudWxsOyAvLyBUZWNobmljYWxseSBkb2Vzbid0IG9jY3VyIHNpbmNlIHRoZSBmdW5jdGlvbnMgYXJlIGFub255bW91cz9cbn1cblxuLyoqXG4gKiBNYXBzIGEgc2luZ2xlIGJpbiBvZiBmcmVxdWVuY3kgYW1wbGl0dWRlcyB0byBhIG51bWVyaWNhbCB2YWx1ZSBkZWZpbmVkIGJ5IGEgZ2V0dGVyIGFuZCBhIHNldHRlci5cbiAqIFxuICogQHBhcmFtIHtvYmplY3R9IGNvbmYgVGhlIGNvbmZpZ3VyYXRpb24gZm9yIG1hcHBpbmcgYSBzaW5nbGUgYmluIHRvIGEgbnVtZXJpY2FsIHZhbHVlLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbmYubWluVmFsIFRoZSBtaW5pbXVtIHZhbHVlIHRoZSBtYXBwaW5nIGNhbiBwcm9kdWNlLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbmYubWF4VmFsIFRoZSBtYXhpbXVtIHZhbHVlIHRoZSBtYXBwaW5nIGNhbiBwcm9kdWNlLlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbmYuYmluIFRoZSBiaW4gdG8gbWFwIHRoaXMgbnVtYmVyIHRvLlxuICogQHBhcmFtIHtudW1lcmljYWxHZXR0ZXJ9IGNvbmYuZ2V0dGVyIFRoZSBjYWxsYmFjayB0byBiZSB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBudW1iZXIuXG4gKiBAcGFyYW0ge251bWVyaWNhbFNldHRlcn0gY29uZi5zZXR0ZXIgVGhlIGNhbGxiYWNrIHRvIGJlIHVzZWQgdG8gc2V0IHRoZSBuZXcgbnVtYmVyLlxuICogQHBhcmFtIHtpbnRlcnBvbGF0b3J9IGNvbmYuaW50ZXJwb2xhdG9yIFRoZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIHRvIHVzZS5cbiAqIEBwYXJhbSB7VmlzdWFsaXplclVwZGF0ZU1hbmFnZXJ9IGNvbmYudmlzVXBkYXRlTWFuYWdlciBUaGUgdXBkYXRlIG1hbmFnZXIgdG8gbWFwIHRvLlxuICogQHBhcmFtIHtib29sZWFufSBbY29uZi5yZXZlcnNlZF0gSWYgdHJ1ZSwgdGhlbiBoaWdoIGFtcGxpdHVkZXMgd2lsbCBiZSBtYXBwZWQgdG8gbG93ZXIgdmFsdWVzIGFuZCB2aWNlIHZlcnNhLlxuICogQHJldHVybnMge3tiaW46IG51bWJlciwgbGlzdGVuZXI6IFZpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyLnZpc3VhbGl6ZXJCaW5VcGRhdGVMaXN0ZW5lcn19IFRoZSBiaW4gbGlzdGVuZXIgdGhhdCB3YXMgYWRkZWQuXG4gKi9cbmZ1bmN0aW9uIG1hcEJpbk51bWVyaWNhbCh7IG1pblZhbCwgbWF4VmFsLCBiaW4sIGdldHRlciwgc2V0dGVyLCBpbnRlcnBvbGF0b3IsIHZpc1VwZGF0ZU1hbmFnZXIsIHJldmVyc2VkID0gZmFsc2UgfSkge1xuICAgIGNvbnN0IGxpc3RlbmVyID0ge1xuICAgICAgICBiaW46IGJpbixcbiAgICAgICAgbGlzdGVuZXI6ICh0aW1lRGVsdGEsIGFtcCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBtYXhWYWwgLSBtaW5WYWw7XG4gICAgICAgICAgICBsZXQgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdG9yKGdldHRlcigpLCBhbXAsIHRpbWVEZWx0YSk7XG4gICAgICAgICAgICBpZiAocmV2ZXJzZWQpIGludGVycG9sYXRlZCA9IDEgLSBpbnRlcnBvbGF0ZWQ7XG4gICAgICAgICAgICBzZXR0ZXIobWluVmFsICsgcmFuZ2UgKiBpbnRlcnBvbGF0ZWQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAodmlzVXBkYXRlTWFuYWdlci5BZGRWaXN1YWxpemVyQmluVXBkYXRlTGlzdGVuZXIobGlzdGVuZXIpKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5lcjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7IC8vIFRlY2huaWNhbGx5IGRvZXNuJ3Qgb2NjdXIgc2luY2UgdGhlIGZ1bmN0aW9ucyBhcmUgYW5vbnltb3VzP1xufVxuXG4vKipAbW9kdWxlICovXG5leHBvcnQgeyBtYXBSYW5nZWRBdmdOdW1lcmljYWwsIG1hcEJpbk51bWVyaWNhbCB9OyJdLCJuYW1lcyI6WyJWaXN1YWxpemVyVXBkYXRlTWFuYWdlciIsIm1hcFJhbmdlZEF2Z051bWVyaWNhbCIsIm1pblZhbCIsIm1heFZhbCIsImxvd2VyQmluIiwidW5kZWZpbmVkIiwidXBwZXJCaW4iLCJnZXR0ZXIiLCJzZXR0ZXIiLCJpbnRlcnBvbGF0b3IiLCJ2aXNVcGRhdGVNYW5hZ2VyIiwicmV2ZXJzZWQiLCJyYW5nZWRMaXN0ZW5lciIsImxvd2VyIiwidXBwZXIiLCJsaXN0ZW5lciIsInRpbWVEZWx0YSIsImJpbnMiLCJub3JtYWxCaW5zIiwiYXZlcmFnZSIsImkiLCJsZW5ndGgiLCJyYW5nZSIsImludGVycG9sYXRlZCIsImFkZFZpc3VhbGl6ZXJSYW5nZWRVcGRhdGVMaXN0ZW5lciIsIm1hcEJpbk51bWVyaWNhbCIsImJpbiIsImFtcCIsIkFkZFZpc3VhbGl6ZXJCaW5VcGRhdGVMaXN0ZW5lciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/mapping/numeric.js\n"); + +/***/ }), + +/***/ "./src/player/Music.js": +/*!*****************************!*\ + !*** ./src/player/Music.js ***! + \*****************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Music)\n/* harmony export */ });\n/* harmony import */ var _visualization_Visualizer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../visualization/Visualizer.js */ \"./src/visualization/Visualizer.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\n\nfunction _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); } }\n\nfunction _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n\nfunction _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n\nfunction _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }\n\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n\nfunction _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError(\"attempted to set read only private field\"); } descriptor.value = value; } }\n\n\n/**@module */\n\n/**\n * @callback AudioEventCallback\n * @param {HTMLAudioElement} audio\n */\n\n/**\n * A music with metadata that can be used as part of a {@link MusicPlaylist}.\n * \n */\n\nvar _displayName = /*#__PURE__*/new WeakMap();\n\nvar _author = /*#__PURE__*/new WeakMap();\n\nvar _url = /*#__PURE__*/new WeakMap();\n\nvar _audio = /*#__PURE__*/new WeakMap();\n\nvar _visualizer = /*#__PURE__*/new WeakMap();\n\nvar _ready = /*#__PURE__*/new WeakMap();\n\nvar Music = /*#__PURE__*/function () {\n /**\n * Constructs a music for a {@link MusicPlaylist}.\n * \n * @param {string} url the url to fetch the music from.\n * @param {string} name the name of the music.\n * @param {string} author the author of the music.\n */\n function Music(url, name, author) {\n _classCallCheck(this, Music);\n\n _classPrivateFieldInitSpec(this, _displayName, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _author, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _url, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _audio, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _visualizer, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _ready, {\n writable: true,\n value: false\n });\n\n _classPrivateFieldSet(this, _displayName, name);\n\n _classPrivateFieldSet(this, _author, author);\n\n _classPrivateFieldSet(this, _url, url);\n }\n /**\n * \n * @param {AudioEventCallback} [onReady] called when the music is ready, including right away if the music is already ready.\n * @returns {HTMLAudioElement} The audio element that represents this music.\n */\n\n\n _createClass(Music, [{\n key: \"fetchAudio\",\n value: function fetchAudio(onReady) {\n var _this = this;\n\n if (_classPrivateFieldGet(this, _audio)) {\n if (_classPrivateFieldGet(this, _ready)) {\n if (onReady) onReady(_classPrivateFieldGet(this, _audio));\n } else if (onReady) {\n _classPrivateFieldGet(this, _audio).addEventListener(\"canplaythrough\", function () {\n onReady(_classPrivateFieldGet(_this, _audio));\n }, {\n once: true\n });\n }\n\n return _classPrivateFieldGet(this, _audio);\n }\n\n _classPrivateFieldSet(this, _audio, new Audio(_classPrivateFieldGet(this, _url)));\n\n _classPrivateFieldGet(this, _audio).addEventListener(\"canplaythrough\", function () {\n _classPrivateFieldSet(_this, _ready, true);\n\n if (onReady && _this.isAudioInstantiated()) {\n onReady(_classPrivateFieldGet(_this, _audio));\n }\n }, {\n once: true\n });\n\n return _classPrivateFieldGet(this, _audio);\n }\n /**\n * @returns {string} The name of the music to be displayed.\n */\n\n }, {\n key: \"displayName\",\n get: function get() {\n return _classPrivateFieldGet(this, _displayName);\n }\n /**\n * @returns {string} The author of the music.\n */\n\n }, {\n key: \"author\",\n get: function get() {\n return _classPrivateFieldGet(this, _author);\n }\n /**\n * @returns {string} The url at which the file for this music can be found.\n */\n\n }, {\n key: \"url\",\n get: function get() {\n return _classPrivateFieldGet(this, _url);\n }\n /**\n * @returns {boolean} true if and only if there is audio data that is either already loaded or is being loaded.\n */\n\n }, {\n key: \"isAudioInstantiated\",\n value: function isAudioInstantiated() {\n return _classPrivateFieldGet(this, _audio) ? true : false;\n }\n /**\n * Begins audio playback as soon as possible.\n * \n * This function uses the {@link PlaylistMusic#getAudio} function and specifically, the {@link AudioEventCallback}.\n */\n\n }, {\n key: \"play\",\n value: function play() {\n this.fetchAudio(function (audio) {\n audio.play();\n });\n }\n /**\n * Pauses the audio playback, unless the audio data has yet to be instantiated.\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n if (!this.isAudioInstantiated()) return;\n this.fetchAudio(function (audio) {\n audio.pause();\n });\n }\n /**\n * \n * @returns {number} The volume on a scale of 0 to 1.\n */\n\n }, {\n key: \"volume\",\n get: function get() {\n return this.fetchAudio().volume;\n }\n /**\n * \n * The normalized volume on a scale of 0 to 1.\n */\n ,\n set: function set(volume) {\n this.fetchAudio().volume = volume;\n }\n /**\n * \n * @returns {number} The number of seconds into the music.\n */\n\n }, {\n key: \"currentTime\",\n get: function get() {\n return this.fetchAudio().currentTime;\n }\n /**\n * \n * The time position in the music to jump to in seconds.\n */\n ,\n set: function set(currentTime) {\n this.fetchAudio().currentTime = currentTime;\n }\n /**\n * \n * @returns {number} The duration of the music.\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n return this.fetchAudio().duration;\n }\n /**\n * Unloads the audio data.\n * Makes sure the audio is paused.\n * \n * Also calls {@link PlaylistMusic#unloadVisualizer}.\n */\n\n }, {\n key: \"unloadAudio\",\n value: function unloadAudio() {\n if (!this.isAudioInstantiated()) return;\n\n _classPrivateFieldGet(this, _audio).pause();\n\n this.unloadVisualizer();\n\n _classPrivateFieldSet(this, _audio, null);\n\n _classPrivateFieldSet(this, _ready, false);\n }\n /**\n * \n * @param {number} [fftSize=1024] the size of the FFT window.\n * @returns {Visualizer} returns the visualizer.\n */\n\n }, {\n key: \"getVisualizer\",\n value: function getVisualizer() {\n var fftSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1024;\n if (_classPrivateFieldGet(this, _visualizer) && _classPrivateFieldGet(this, _visualizer).getFftSize() === fftSize) return _classPrivateFieldGet(this, _visualizer);\n\n _classPrivateFieldSet(this, _visualizer, new _visualization_Visualizer_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](this.fetchAudio(), fftSize));\n\n return _classPrivateFieldGet(this, _visualizer);\n }\n /**\n * \n * @returns {boolean} returns true if and only if the visualizer is instantiated.\n */\n\n }, {\n key: \"isVisualizerInstantiated\",\n value: function isVisualizerInstantiated() {\n return _classPrivateFieldGet(this, _visualizer) ? true : false;\n }\n /**\n * Unloads the visualizer.\n * Stops the visualizer.\n */\n\n }, {\n key: \"unloadVisualizer\",\n value: function unloadVisualizer() {\n if (_classPrivateFieldGet(this, _visualizer)) {\n _classPrivateFieldGet(this, _visualizer).stop();\n\n _classPrivateFieldSet(this, _visualizer, null);\n }\n }\n }]);\n\n return Music;\n}();\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUE2QjtBQUN6QixXQUFLTCxVQUFMLEdBQWtCSyxXQUFsQixHQUFnQ0EsV0FBaEM7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBOzs7O1NBQ0ksZUFBZTtBQUNYLGFBQU8sS0FBS0wsVUFBTCxHQUFrQk0sUUFBekI7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztXQUNJLHVCQUFjO0FBQ1YsVUFBSSxDQUFDLEtBQUtQLG1CQUFMLEVBQUwsRUFBaUM7O0FBQ2pDLDBDQUFZSSxLQUFaOztBQUNBLFdBQUtJLGdCQUFMOztBQUNBLDBDQUFjLElBQWQ7O0FBQ0EsMENBQWMsS0FBZDtBQUNIO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7OztXQUNJLHlCQUE4QjtBQUFBLFVBQWhCQyxPQUFnQix1RUFBTixJQUFNO0FBQzFCLFVBQUksNENBQW9CLHlDQUFpQkMsVUFBakIsT0FBa0NELE9BQTFELEVBQW1FLDZCQUFPLElBQVA7O0FBQ25FLCtDQUFtQixJQUFJbEIsb0VBQUosQ0FBZSxLQUFLVSxVQUFMLEVBQWYsRUFBa0NRLE9BQWxDLENBQW5COztBQUNBLG1DQUFPLElBQVA7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBOzs7O1dBQ0ksb0NBQTJCO0FBQ3ZCLGFBQU8sMkNBQW1CLElBQW5CLEdBQTBCLEtBQWpDO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTs7OztXQUNJLDRCQUFtQjtBQUNmLGdDQUFJLElBQUosZ0JBQXNCO0FBQ2xCLGlEQUFpQkUsSUFBakI7O0FBQ0EsaURBQW1CLElBQW5CO0FBQ0g7QUFDSiIsInNvdXJjZXMiOlsid2VicGFjazovL2F1ZGlvc2hvd2tpdC8uL3NyYy9wbGF5ZXIvTXVzaWMuanM/MzY1ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVmlzdWFsaXplciBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbi9WaXN1YWxpemVyLmpzXCI7XG5cbi8qKkBtb2R1bGUgKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXVkaW9FdmVudENhbGxiYWNrXG4gKiBAcGFyYW0ge0hUTUxBdWRpb0VsZW1lbnR9IGF1ZGlvXG4gKi9cblxuLyoqXG4gKiBBIG11c2ljIHdpdGggbWV0YWRhdGEgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIGEge0BsaW5rIE11c2ljUGxheWxpc3R9LlxuICogXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE11c2ljIHtcbiAgICAjZGlzcGxheU5hbWU7XG4gICAgI2F1dGhvcjtcbiAgICAjdXJsO1xuICAgICNhdWRpbztcbiAgICAjdmlzdWFsaXplcjtcbiAgICAjcmVhZHkgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBtdXNpYyBmb3IgYSB7QGxpbmsgTXVzaWNQbGF5bGlzdH0uXG4gICAgICogXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCB0aGUgdXJsIHRvIGZldGNoIHRoZSBtdXNpYyBmcm9tLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBtdXNpYy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0aG9yIHRoZSBhdXRob3Igb2YgdGhlIG11c2ljLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVybCwgbmFtZSwgYXV0aG9yKSB7XG4gICAgICAgIHRoaXMuI2Rpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy4jYXV0aG9yID0gYXV0aG9yO1xuICAgICAgICB0aGlzLiN1cmwgPSB1cmw7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge0F1ZGlvRXZlbnRDYWxsYmFja30gW29uUmVhZHldIGNhbGxlZCB3aGVuIHRoZSBtdXNpYyBpcyByZWFkeSwgaW5jbHVkaW5nIHJpZ2h0IGF3YXkgaWYgdGhlIG11c2ljIGlzIGFscmVhZHkgcmVhZHkuXG4gICAgICogQHJldHVybnMge0hUTUxBdWRpb0VsZW1lbnR9IFRoZSBhdWRpbyBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGlzIG11c2ljLlxuICAgICAqL1xuICAgIGZldGNoQXVkaW8ob25SZWFkeSkge1xuICAgICAgICBpZiAodGhpcy4jYXVkaW8pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNyZWFkeSkge1xuICAgICAgICAgICAgICAgIGlmIChvblJlYWR5KSBvblJlYWR5KHRoaXMuI2F1ZGlvKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob25SZWFkeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2F1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoXCJjYW5wbGF5dGhyb3VnaFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9uUmVhZHkodGhpcy4jYXVkaW8pO1xuICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNhdWRpbztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNhdWRpbyA9IG5ldyBBdWRpbyh0aGlzLiN1cmwpO1xuICAgICAgICB0aGlzLiNhdWRpby5hZGRFdmVudExpc3RlbmVyKFwiY2FucGxheXRocm91Z2hcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKG9uUmVhZHkgJiYgdGhpcy5pc0F1ZGlvSW5zdGFudGlhdGVkKCkpIHtcbiAgICAgICAgICAgICAgICBvblJlYWR5KHRoaXMuI2F1ZGlvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy4jYXVkaW87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIG11c2ljIHRvIGJlIGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICBnZXQgZGlzcGxheU5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgYXV0aG9yIG9mIHRoZSBtdXNpYy5cbiAgICAgKi9cbiAgICBnZXQgYXV0aG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXV0aG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSB1cmwgYXQgd2hpY2ggdGhlIGZpbGUgZm9yIHRoaXMgbXVzaWMgY2FuIGJlIGZvdW5kLlxuICAgICAqL1xuICAgIGdldCB1cmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN1cmw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYXVkaW8gZGF0YSB0aGF0IGlzIGVpdGhlciBhbHJlYWR5IGxvYWRlZCBvciBpcyBiZWluZyBsb2FkZWQuXG4gICAgICovXG4gICAgaXNBdWRpb0luc3RhbnRpYXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2F1ZGlvID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJlZ2lucyBhdWRpbyBwbGF5YmFjayBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAqIFxuICAgICAqIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUge0BsaW5rIFBsYXlsaXN0TXVzaWMjZ2V0QXVkaW99IGZ1bmN0aW9uIGFuZCBzcGVjaWZpY2FsbHksIHRoZSB7QGxpbmsgQXVkaW9FdmVudENhbGxiYWNrfS5cbiAgICAgKi9cbiAgICBwbGF5KCkge1xuICAgICAgICB0aGlzLmZldGNoQXVkaW8oKGF1ZGlvKSA9PiB7XG4gICAgICAgICAgICBhdWRpby5wbGF5KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhdXNlcyB0aGUgYXVkaW8gcGxheWJhY2ssIHVubGVzcyB0aGUgYXVkaW8gZGF0YSBoYXMgeWV0IHRvIGJlIGluc3RhbnRpYXRlZC5cbiAgICAgKi9cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQXVkaW9JbnN0YW50aWF0ZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmZldGNoQXVkaW8oKGF1ZGlvKSA9PiB7XG4gICAgICAgICAgICBhdWRpby5wYXVzZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgdm9sdW1lIG9uIGEgc2NhbGUgb2YgMCB0byAxLlxuICAgICAqL1xuICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQXVkaW8oKS52b2x1bWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogVGhlIG5vcm1hbGl6ZWQgdm9sdW1lIG9uIGEgc2NhbGUgb2YgMCB0byAxLlxuICAgICAqL1xuICAgIHNldCB2b2x1bWUodm9sdW1lKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hBdWRpbygpLnZvbHVtZSA9IHZvbHVtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBzZWNvbmRzIGludG8gdGhlIG11c2ljLlxuICAgICAqL1xuICAgIGdldCBjdXJyZW50VGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hBdWRpbygpLmN1cnJlbnRUaW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIFRoZSB0aW1lIHBvc2l0aW9uIGluIHRoZSBtdXNpYyB0byBqdW1wIHRvIGluIHNlY29uZHMuXG4gICAgICovXG4gICAgc2V0IGN1cnJlbnRUaW1lKGN1cnJlbnRUaW1lKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hBdWRpbygpLmN1cnJlbnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGR1cmF0aW9uIG9mIHRoZSBtdXNpYy5cbiAgICAgKi9cbiAgICBnZXQgZHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoQXVkaW8oKS5kdXJhdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbmxvYWRzIHRoZSBhdWRpbyBkYXRhLlxuICAgICAqIE1ha2VzIHN1cmUgdGhlIGF1ZGlvIGlzIHBhdXNlZC5cbiAgICAgKiBcbiAgICAgKiBBbHNvIGNhbGxzIHtAbGluayBQbGF5bGlzdE11c2ljI3VubG9hZFZpc3VhbGl6ZXJ9LlxuICAgICAqL1xuICAgIHVubG9hZEF1ZGlvKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNBdWRpb0luc3RhbnRpYXRlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuI2F1ZGlvLnBhdXNlKCk7XG4gICAgICAgIHRoaXMudW5sb2FkVmlzdWFsaXplcigpO1xuICAgICAgICB0aGlzLiNhdWRpbyA9IG51bGw7XG4gICAgICAgIHRoaXMuI3JlYWR5ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmZnRTaXplPTEwMjRdIHRoZSBzaXplIG9mIHRoZSBGRlQgd2luZG93LlxuICAgICAqIEByZXR1cm5zIHtWaXN1YWxpemVyfSByZXR1cm5zIHRoZSB2aXN1YWxpemVyLlxuICAgICAqL1xuICAgIGdldFZpc3VhbGl6ZXIoZmZ0U2l6ZSA9IDEwMjQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3Zpc3VhbGl6ZXIgJiYgdGhpcy4jdmlzdWFsaXplci5nZXRGZnRTaXplKCkgPT09IGZmdFNpemUpIHJldHVybiB0aGlzLiN2aXN1YWxpemVyO1xuICAgICAgICB0aGlzLiN2aXN1YWxpemVyID0gbmV3IFZpc3VhbGl6ZXIodGhpcy5mZXRjaEF1ZGlvKCksIGZmdFNpemUpO1xuICAgICAgICByZXR1cm4gdGhpcy4jdmlzdWFsaXplcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB2aXN1YWxpemVyIGlzIGluc3RhbnRpYXRlZC5cbiAgICAgKi9cbiAgICBpc1Zpc3VhbGl6ZXJJbnN0YW50aWF0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2aXN1YWxpemVyID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVubG9hZHMgdGhlIHZpc3VhbGl6ZXIuXG4gICAgICogU3RvcHMgdGhlIHZpc3VhbGl6ZXIuXG4gICAgICovXG4gICAgdW5sb2FkVmlzdWFsaXplcigpIHtcbiAgICAgICAgaWYgKHRoaXMuI3Zpc3VhbGl6ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuI3Zpc3VhbGl6ZXIuc3RvcCgpO1xuICAgICAgICAgICAgdGhpcy4jdmlzdWFsaXplciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59Il0sIm5hbWVzIjpbIlZpc3VhbGl6ZXIiLCJNdXNpYyIsInVybCIsIm5hbWUiLCJhdXRob3IiLCJvblJlYWR5IiwiYWRkRXZlbnRMaXN0ZW5lciIsIm9uY2UiLCJBdWRpbyIsImlzQXVkaW9JbnN0YW50aWF0ZWQiLCJmZXRjaEF1ZGlvIiwiYXVkaW8iLCJwbGF5IiwicGF1c2UiLCJ2b2x1bWUiLCJjdXJyZW50VGltZSIsImR1cmF0aW9uIiwidW5sb2FkVmlzdWFsaXplciIsImZmdFNpemUiLCJnZXRGZnRTaXplIiwic3RvcCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/player/Music.js\n"); + +/***/ }), + +/***/ "./src/player/MusicPlayer.js": +/*!***********************************!*\ + !*** ./src/player/MusicPlayer.js ***! + \***********************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ MusicPlayer)\n/* harmony export */ });\n/* harmony import */ var _styles_musicPlayer_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../styles/musicPlayer.css */ \"./src/styles/musicPlayer.css\");\n/* harmony import */ var _MusicPlaylist_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MusicPlaylist.js */ \"./src/player/MusicPlaylist.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\n\nfunction _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); } }\n\nfunction _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }\n\nfunction _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError(\"attempted to set read only private field\"); } descriptor.value = value; } }\n\nfunction _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n\nfunction _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n\n\n\n/**@module */\n\n/**\n * @callback changeListener\n * @param {*} old the previous value.\n * @param {*} current the the current (new) value.\n */\n\n/**\n * A player that keeps track of global properties for playback as well as traversing a playlist. Additionally keeps track of music audio data and attempts to reduce memory usage when possible.\n */\n\nvar _playlist = /*#__PURE__*/new WeakMap();\n\nvar _volume = /*#__PURE__*/new WeakMap();\n\nvar _autoplay = /*#__PURE__*/new WeakMap();\n\nvar _wasPlaying = /*#__PURE__*/new WeakMap();\n\nvar _playlistChangeListeners = /*#__PURE__*/new WeakMap();\n\nvar _volumeChangeListeners = /*#__PURE__*/new WeakMap();\n\nvar _allAudioEventListeners = /*#__PURE__*/new WeakMap();\n\nvar _onMusicChange = /*#__PURE__*/new WeakMap();\n\nvar MusicPlayer = /*#__PURE__*/function () {\n /**\n * \n * @param {MusicPlaylist} playlist the playlist of musics that this player is in charge of.\n */\n function MusicPlayer(playlist) {\n var _this = this;\n\n _classCallCheck(this, MusicPlayer);\n\n _classPrivateFieldInitSpec(this, _playlist, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _volume, {\n writable: true,\n value: 1\n });\n\n _classPrivateFieldInitSpec(this, _autoplay, {\n writable: true,\n value: false\n });\n\n _classPrivateFieldInitSpec(this, _wasPlaying, {\n writable: true,\n value: false\n });\n\n _classPrivateFieldInitSpec(this, _playlistChangeListeners, {\n writable: true,\n value: []\n });\n\n _classPrivateFieldInitSpec(this, _volumeChangeListeners, {\n writable: true,\n value: []\n });\n\n _classPrivateFieldInitSpec(this, _allAudioEventListeners, {\n writable: true,\n value: {}\n });\n\n _classPrivateFieldInitSpec(this, _onMusicChange, {\n writable: true,\n value: function value(old, current) {\n // Anonymous to avoid overriding \"this\".\n var oldMusic = _this.playlist.musicAtIndex(old);\n\n var currentMusic = _this.playlist.musicAtIndex(current);\n\n Object.keys(_classPrivateFieldGet(_this, _allAudioEventListeners)).forEach(function (key) {\n var listeners = _classPrivateFieldGet(_this, _allAudioEventListeners)[key];\n\n listeners.forEach(function (listener) {\n oldMusic.fetchAudio().removeEventListener(key, listener);\n });\n });\n oldMusic.unloadAudio();\n Object.keys(_classPrivateFieldGet(_this, _allAudioEventListeners)).forEach(function (key) {\n var listeners = _classPrivateFieldGet(_this, _allAudioEventListeners)[key];\n\n listeners.forEach(function (listener) {\n currentMusic.fetchAudio().addEventListener(key, listener);\n });\n });\n\n if (_classPrivateFieldGet(_this, _wasPlaying) || _classPrivateFieldGet(_this, _autoplay)) {\n _this.playCurrent();\n }\n\n return true;\n }\n });\n\n this.playlist = playlist;\n this.addEventListenerToCurrentAudio(\"ended\", function () {\n _this.next();\n });\n }\n /**\n * The new playlist of musics that this player is in charge of.\n */\n\n\n _createClass(MusicPlayer, [{\n key: \"playlist\",\n get:\n /**\n * The current playlist of musics that this player is in charge of.\n * \n * @returns {MusicPlaylist} The music playlist this player is currently using.\n */\n function get() {\n return _classPrivateFieldGet(this, _playlist);\n }\n /**\n * \n * @returns {boolean} true if and only if successful in going to the next music.\n */\n ,\n set: function set(playlist) {\n var _this2 = this;\n\n if (this.playlist) this.unloadAllAudio();\n if (this.playlist) this.playlist.removePositionChangeListener(_classPrivateFieldGet(this, _onMusicChange));\n\n var old = _classPrivateFieldGet(this, _playlist);\n\n _classPrivateFieldSet(this, _playlist, playlist);\n\n _classPrivateFieldGet(this, _playlist).addPositionChangeListener(_classPrivateFieldGet(this, _onMusicChange));\n\n _classPrivateFieldGet(this, _playlist).currentPosition = 0; // Updates the listener.\n\n _classPrivateFieldGet(this, _playlistChangeListeners).forEach(function (playlistChangeListener) {\n playlistChangeListener(old, _this2.getPlaylist());\n });\n }\n }, {\n key: \"next\",\n value: function next() {\n return this.playlist.currentPosition += 1;\n }\n /**\n * attempts to go to the previous music.\n * \n * @returns {boolean} true if and only if successful in going to the previous music.\n */\n\n }, {\n key: \"previous\",\n value: function previous() {\n return this.playlist.currentPosition -= 1;\n }\n /**\n * @param {number} old the index of the previous music.\n * @param {number} current the index of the current music.\n * @returns {boolean} true if and only if successful jumping to the given index.\n */\n\n }, {\n key: \"playCurrent\",\n value: function playCurrent() {\n var _this3 = this;\n\n this.playlist.currentMusic.fetchAudio(function (audio) {\n audio.volume = _this3.volume;\n audio.play();\n });\n\n _classPrivateFieldSet(this, _wasPlaying, true);\n }\n /**\n * Pauses the current playing music (if there is one playing).\n */\n\n }, {\n key: \"pauseCurrent\",\n value: function pauseCurrent() {\n this.playlist.currentMusic.fetchAudio().pause();\n }\n /**\n * Toggles whether or not the current music is playing.\n */\n\n }, {\n key: \"togglePlay\",\n value: function togglePlay() {\n if (this.playing) {\n this.pauseCurrent();\n } else {\n this.playCurrent();\n }\n }\n /**\n * A number between 0 to 1 inclusive representing the volume of the player. Values out of these bounds will be rounded to the nearest bound.\n */\n\n }, {\n key: \"volume\",\n get:\n /**\n * \n * @returns {number} The current volume of the player represented by a number between 0 and 1 inclusive.\n */\n function get() {\n return _classPrivateFieldGet(this, _volume);\n }\n /**\n * Attempts to seek to the given position.\n * \n * @param {number} position the position to seek to.\n * @returns {boolean} true if and only if the position to seek to is within the duration of the track. This also means that if the track has not finished loading the duration data, than this will always return false.\n */\n ,\n set: function set(volume) {\n if (volume > 1) volume = 1;\n if (volume < 0) volume = 0;\n\n _classPrivateFieldSet(this, _volume, volume);\n\n this.playlist.currentMusic.fetchAudio().volume = _classPrivateFieldGet(this, _volume);\n }\n }, {\n key: \"seek\",\n value: function seek(position) {\n if (position > this.playlist.playlist.currentMusic.fetchAudio().duration || position < 0) return false;\n this.playlist.playlist.currentMusic.fetchAudio(function (audio) {\n audio.currentTime = position;\n });\n return true;\n }\n /**\n * \n * @returns {number} How many seconds into the audio track has been played in seconds.\n */\n\n }, {\n key: \"currentPosition\",\n get: function get() {\n return this.playlist.playlist.currentMusic.fetchAudio().currentTime;\n }\n /**\n * \n * @returns {number} The total length of the music, or NaN if this information has not loaded yet.\n */\n\n }, {\n key: \"currentDuration\",\n get: function get() {\n return this.playlist.playlist.currentMusic.fetchAudio().duration;\n }\n /**\n * Convenience method for creating a play button complete with CSS for transitioning to a paused button.\n * \n * Automatically hooked up to the player's state change updates and play and pause functions.\n * \n * @returns {HTMLElement} the play button element that can be added to a DOM.\n */\n\n }, {\n key: \"generatePlayElement\",\n value: function generatePlayElement() {\n var _this4 = this;\n\n var playButton = document.createElement(\"button\");\n playButton.classList.add(\"player\");\n playButton.classList.add(\"play-btn\");\n if (this.playing) playButton.classList.add(\"pause\");\n playButton.addEventListener(\"click\", function () {\n _this4.togglePlay();\n });\n this.addEventListenerToCurrentAudio(\"play\", function () {\n playButton.classList.add(\"pause\");\n });\n this.addEventListenerToCurrentAudio(\"pause\", function () {\n playButton.classList.remove(\"pause\");\n });\n return playButton;\n }\n }, {\n key: \"generateNextElement\",\n value: function generateNextElement() {\n var _this5 = this;\n\n var nextButton = document.createElement(\"button\");\n nextButton.classList.add(\"player\");\n nextButton.classList.add(\"next\");\n nextButton.addEventListener(\"click\", function () {\n _this5.next();\n });\n return nextButton;\n }\n }, {\n key: \"generatePreviousElement\",\n value: function generatePreviousElement() {\n var _this6 = this;\n\n var previousButton = document.createElement(\"button\");\n previousButton.classList.add(\"player\");\n previousButton.classList.add(\"previous\");\n previousButton.addEventListener(\"click\", function () {\n _this6.previous();\n });\n return previousButton;\n }\n /**\n * \n * @param {changeListener} listener the playlist change listener to add to the callback list.\n * @returns {boolean} true if and only if the given listener was successfully registered.\n */\n\n }, {\n key: \"addPlaylistChangeListener\",\n value: function addPlaylistChangeListener(listener) {\n if (_classPrivateFieldGet(this, _playlistChangeListeners).includes(listener)) return false;\n\n _classPrivateFieldGet(this, _playlistChangeListeners).push(listener);\n\n return true;\n }\n /**\n * \n * @param {changeListener} listener the playlist change listener to remove.\n * @returns {boolean} true if and only if a listener was successfully removed from the callback list.\n */\n\n }, {\n key: \"removePlaylistChangeListener\",\n value: function removePlaylistChangeListener(listener) {\n var removeIndex = _classPrivateFieldGet(this, _playlistChangeListeners).indexOf(listener);\n\n if (removeIndex < 0) return false;\n this.playlistChangeListener.splice(removeIndex, 1);\n return true;\n }\n /**\n * \n * @param {changeListener} listener the listener that is called when the player's volume is changed.\n * @returns {boolean} true if and only if the listener was successfully added.\n */\n\n }, {\n key: \"addVolumeChangeListener\",\n value: function addVolumeChangeListener(listener) {\n if (_classPrivateFieldGet(this, _volumeChangeListeners).includes(listener)) return false;\n\n _classPrivateFieldGet(this, _volumeChangeListeners).push(listener);\n\n return true;\n }\n /**\n * \n * @param {changeListener} listener the volume change listener to remove.\n * @returns {boolean} true if and only if a listener was successfully removed from the callback list.\n */\n\n }, {\n key: \"removeVolumeChangeListener\",\n value: function removeVolumeChangeListener(listener) {\n var removeIndex = _classPrivateFieldGet(this, _volumeChangeListeners).indexOf(listener);\n\n if (removeIndex < 0) return false;\n\n _classPrivateFieldGet(this, _volumeChangeListeners).splice(removeIndex, 1);\n\n return true;\n }\n /**\n * \n * @param {string} type the type of the listener on the {@link HTMLAudioElement}.\n * @param {Function} eventListener the event listener.\n * @returns {boolean} true if and only if successfully registered event listener.\n */\n\n }, {\n key: \"addEventListenerToCurrentAudio\",\n value: function addEventListenerToCurrentAudio(type, eventListener) {\n var typeListeners = _classPrivateFieldGet(this, _allAudioEventListeners)[type];\n\n if (!typeListeners) {\n typeListeners = [];\n _classPrivateFieldGet(this, _allAudioEventListeners)[type] = typeListeners;\n }\n\n if (typeListeners.includes(eventListener)) return false;\n typeListeners.push(eventListener);\n this.playlist.currentMusic.fetchAudio().addEventListener(type, eventListener);\n return true;\n }\n /**\n * \n * @param {string} type the type of the listener on the {@link HTMLAudioElement}. \n * @param {Function} eventListener the event listener. \n * @returns {boolean} true if and only if the event listener was successfully added.\n */\n\n }, {\n key: \"removeEventListenerFromCurrentAudio\",\n value: function removeEventListenerFromCurrentAudio(type, eventListener) {\n var typeListeners = _classPrivateFieldGet(this, _allAudioEventListeners)[type];\n\n if (!typeListeners) return false;\n var removeIndex = typeListeners.indexOf(eventListener);\n if (removeIndex < 0) return false;\n typeListeners.splice(removeIndex, 1);\n this.playlist.playlist.currentMusic.fetchAudio().removeEventListener(type, eventListener);\n return true;\n }\n /**\n * @returns {boolean} If the player is playing any musics right now.\n */\n\n }, {\n key: \"playing\",\n get: function get() {\n return this.playlist.currentMusic.isAudioInstantiated() && !this.playlist.currentMusic.fetchAudio().paused;\n }\n /**\n * Unloads the audio data of all musics in this playlist.\n */\n\n }, {\n key: \"unloadAllAudio\",\n value: function unloadAllAudio() {\n this.playlist.forEach(function (music) {\n music.unloadAudio();\n });\n }\n }]);\n\n return MusicPlayer;\n}();\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFVBQUE4QyxLQUFLLEVBQUk7QUFDM0JBLFFBQUFBLEtBQUssQ0FBQ3hDLFdBQU47QUFDSCxPQUZEO0FBR0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hdWRpb3Nob3draXQvLi9zcmMvcGxheWVyL011c2ljUGxheWVyLmpzPzkyODIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwiLi4vc3R5bGVzL211c2ljUGxheWVyLmNzc1wiO1xuaW1wb3J0IE11c2ljUGxheWxpc3QgZnJvbSBcIi4vTXVzaWNQbGF5bGlzdC5qc1wiO1xuXG4vKipAbW9kdWxlICovXG5cbi8qKlxuICogQGNhbGxiYWNrIGNoYW5nZUxpc3RlbmVyXG4gKiBAcGFyYW0geyp9IG9sZCB0aGUgcHJldmlvdXMgdmFsdWUuXG4gKiBAcGFyYW0geyp9IGN1cnJlbnQgdGhlIHRoZSBjdXJyZW50IChuZXcpIHZhbHVlLlxuICovXG5cbi8qKlxuICogQSBwbGF5ZXIgdGhhdCBrZWVwcyB0cmFjayBvZiBnbG9iYWwgcHJvcGVydGllcyBmb3IgcGxheWJhY2sgYXMgd2VsbCBhcyB0cmF2ZXJzaW5nIGEgcGxheWxpc3QuIEFkZGl0aW9uYWxseSBrZWVwcyB0cmFjayBvZiBtdXNpYyBhdWRpbyBkYXRhIGFuZCBhdHRlbXB0cyB0byByZWR1Y2UgbWVtb3J5IHVzYWdlIHdoZW4gcG9zc2libGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE11c2ljUGxheWVyIHtcbiAgICAjcGxheWxpc3Q7XG4gICAgI3ZvbHVtZSA9IDE7XG4gICAgI2F1dG9wbGF5ID0gZmFsc2U7XG4gICAgI3dhc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAjcGxheWxpc3RDaGFuZ2VMaXN0ZW5lcnMgPSBbXTtcbiAgICAjdm9sdW1lQ2hhbmdlTGlzdGVuZXJzID0gW107XG4gICAgI2FsbEF1ZGlvRXZlbnRMaXN0ZW5lcnMgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7TXVzaWNQbGF5bGlzdH0gcGxheWxpc3QgdGhlIHBsYXlsaXN0IG9mIG11c2ljcyB0aGF0IHRoaXMgcGxheWVyIGlzIGluIGNoYXJnZSBvZi5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwbGF5bGlzdCkge1xuICAgICAgICB0aGlzLnBsYXlsaXN0ID0gcGxheWxpc3Q7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lclRvQ3VycmVudEF1ZGlvKFwiZW5kZWRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgcGxheWxpc3Qgb2YgbXVzaWNzIHRoYXQgdGhpcyBwbGF5ZXIgaXMgaW4gY2hhcmdlIG9mLlxuICAgICAqL1xuICAgIHNldCBwbGF5bGlzdChwbGF5bGlzdCkge1xuICAgICAgICBpZiAodGhpcy5wbGF5bGlzdCkgdGhpcy51bmxvYWRBbGxBdWRpbygpO1xuICAgICAgICBpZiAodGhpcy5wbGF5bGlzdCkgdGhpcy5wbGF5bGlzdC5yZW1vdmVQb3NpdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMuI29uTXVzaWNDaGFuZ2UpO1xuICAgICAgICBjb25zdCBvbGQgPSB0aGlzLiNwbGF5bGlzdDtcbiAgICAgICAgdGhpcy4jcGxheWxpc3QgPSBwbGF5bGlzdDtcbiAgICAgICAgdGhpcy4jcGxheWxpc3QuYWRkUG9zaXRpb25DaGFuZ2VMaXN0ZW5lcih0aGlzLiNvbk11c2ljQ2hhbmdlKTtcbiAgICAgICAgdGhpcy4jcGxheWxpc3QuY3VycmVudFBvc2l0aW9uID0gMDsgLy8gVXBkYXRlcyB0aGUgbGlzdGVuZXIuXG4gICAgICAgIHRoaXMuI3BsYXlsaXN0Q2hhbmdlTGlzdGVuZXJzLmZvckVhY2gocGxheWxpc3RDaGFuZ2VMaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICBwbGF5bGlzdENoYW5nZUxpc3RlbmVyKG9sZCwgdGhpcy5nZXRQbGF5bGlzdCgpKTtcbiAgICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBwbGF5bGlzdCBvZiBtdXNpY3MgdGhhdCB0aGlzIHBsYXllciBpcyBpbiBjaGFyZ2Ugb2YuXG4gICAgICogXG4gICAgICogQHJldHVybnMge011c2ljUGxheWxpc3R9IFRoZSBtdXNpYyBwbGF5bGlzdCB0aGlzIHBsYXllciBpcyBjdXJyZW50bHkgdXNpbmcuXG4gICAgICovXG4gICAgZ2V0IHBsYXlsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGxheWxpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgc3VjY2Vzc2Z1bCBpbiBnb2luZyB0byB0aGUgbmV4dCBtdXNpYy5cbiAgICAgKi9cbiAgICBuZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5bGlzdC5jdXJyZW50UG9zaXRpb24gKz0gMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhdHRlbXB0cyB0byBnbyB0byB0aGUgcHJldmlvdXMgbXVzaWMuXG4gICAgICogXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgc3VjY2Vzc2Z1bCBpbiBnb2luZyB0byB0aGUgcHJldmlvdXMgbXVzaWMuXG4gICAgICovXG4gICAgcHJldmlvdXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0LmN1cnJlbnRQb3NpdGlvbiAtPSAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvbGQgdGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyBtdXNpYy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudCB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgbXVzaWMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgc3VjY2Vzc2Z1bCBqdW1waW5nIHRvIHRoZSBnaXZlbiBpbmRleC5cbiAgICAgKi9cbiAgICAjb25NdXNpY0NoYW5nZSA9IChvbGQsIGN1cnJlbnQpID0+IHsgLy8gQW5vbnltb3VzIHRvIGF2b2lkIG92ZXJyaWRpbmcgXCJ0aGlzXCIuXG4gICAgICAgIGNvbnN0IG9sZE11c2ljID0gdGhpcy5wbGF5bGlzdC5tdXNpY0F0SW5kZXgob2xkKTtcbiAgICAgICAgY29uc3QgY3VycmVudE11c2ljID0gdGhpcy5wbGF5bGlzdC5tdXNpY0F0SW5kZXgoY3VycmVudCk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuI2FsbEF1ZGlvRXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuI2FsbEF1ZGlvRXZlbnRMaXN0ZW5lcnNba2V5XTtcbiAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgICAgICAgICBvbGRNdXNpYy5mZXRjaEF1ZGlvKCkucmVtb3ZlRXZlbnRMaXN0ZW5lcihrZXksIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgb2xkTXVzaWMudW5sb2FkQXVkaW8oKTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLiNhbGxBdWRpb0V2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLiNhbGxBdWRpb0V2ZW50TGlzdGVuZXJzW2tleV07XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICAgICAgY3VycmVudE11c2ljLmZldGNoQXVkaW8oKS5hZGRFdmVudExpc3RlbmVyKGtleSwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy4jd2FzUGxheWluZyB8fCB0aGlzLiNhdXRvcGxheSkge1xuICAgICAgICAgICAgdGhpcy5wbGF5Q3VycmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICBwbGF5Q3VycmVudCgpIHtcbiAgICAgICAgdGhpcy5wbGF5bGlzdC5jdXJyZW50TXVzaWMuZmV0Y2hBdWRpbygoYXVkaW8pID0+IHtcbiAgICAgICAgICAgIGF1ZGlvLnZvbHVtZSA9IHRoaXMudm9sdW1lO1xuICAgICAgICAgICAgYXVkaW8ucGxheSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jd2FzUGxheWluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSBjdXJyZW50IHBsYXlpbmcgbXVzaWMgKGlmIHRoZXJlIGlzIG9uZSBwbGF5aW5nKS5cbiAgICAgKi9cbiAgICBwYXVzZUN1cnJlbnQoKSB7XG4gICAgICAgIHRoaXMucGxheWxpc3QuY3VycmVudE11c2ljLmZldGNoQXVkaW8oKS5wYXVzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgd2hldGhlciBvciBub3QgdGhlIGN1cnJlbnQgbXVzaWMgaXMgcGxheWluZy5cbiAgICAgKi9cbiAgICB0b2dnbGVQbGF5KCkge1xuICAgICAgICBpZiAodGhpcy5wbGF5aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlQ3VycmVudCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wbGF5Q3VycmVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBudW1iZXIgYmV0d2VlbiAwIHRvIDEgaW5jbHVzaXZlIHJlcHJlc2VudGluZyB0aGUgdm9sdW1lIG9mIHRoZSBwbGF5ZXIuIFZhbHVlcyBvdXQgb2YgdGhlc2UgYm91bmRzIHdpbGwgYmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBib3VuZC5cbiAgICAgKi9cbiAgICBzZXQgdm9sdW1lKHZvbHVtZSkge1xuICAgICAgICBpZiAodm9sdW1lID4gMSkgdm9sdW1lID0gMTtcbiAgICAgICAgaWYgKHZvbHVtZSA8IDApIHZvbHVtZSA9IDA7XG4gICAgICAgIHRoaXMuI3ZvbHVtZSA9IHZvbHVtZTtcbiAgICAgICAgdGhpcy5wbGF5bGlzdC5jdXJyZW50TXVzaWMuZmV0Y2hBdWRpbygpLnZvbHVtZSA9IHRoaXMuI3ZvbHVtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY3VycmVudCB2b2x1bWUgb2YgdGhlIHBsYXllciByZXByZXNlbnRlZCBieSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlLlxuICAgICAqL1xuICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2b2x1bWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgdG8gc2VlayB0byB0aGUgZ2l2ZW4gcG9zaXRpb24uXG4gICAgICogXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBvc2l0aW9uIHRoZSBwb3NpdGlvbiB0byBzZWVrIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBwb3NpdGlvbiB0byBzZWVrIHRvIGlzIHdpdGhpbiB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrLiBUaGlzIGFsc28gbWVhbnMgdGhhdCBpZiB0aGUgdHJhY2sgaGFzIG5vdCBmaW5pc2hlZCBsb2FkaW5nIHRoZSBkdXJhdGlvbiBkYXRhLCB0aGFuIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLlxuICAgICAqL1xuICAgIHNlZWsocG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uID4gdGhpcy5wbGF5bGlzdC5wbGF5bGlzdC5jdXJyZW50TXVzaWMuZmV0Y2hBdWRpbygpLmR1cmF0aW9uIHx8IHBvc2l0aW9uIDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlsaXN0LnBsYXlsaXN0LmN1cnJlbnRNdXNpYy5mZXRjaEF1ZGlvKGF1ZGlvID0+IHtcbiAgICAgICAgICAgIGF1ZGlvLmN1cnJlbnRUaW1lID0gcG9zaXRpb247XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBIb3cgbWFueSBzZWNvbmRzIGludG8gdGhlIGF1ZGlvIHRyYWNrIGhhcyBiZWVuIHBsYXllZCBpbiBzZWNvbmRzLlxuICAgICAqL1xuICAgIGdldCBjdXJyZW50UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0LnBsYXlsaXN0LmN1cnJlbnRNdXNpYy5mZXRjaEF1ZGlvKCkuY3VycmVudFRpbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgbXVzaWMsIG9yIE5hTiBpZiB0aGlzIGluZm9ybWF0aW9uIGhhcyBub3QgbG9hZGVkIHlldC5cbiAgICAgKi9cbiAgICBnZXQgY3VycmVudER1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wbGF5bGlzdC5wbGF5bGlzdC5jdXJyZW50TXVzaWMuZmV0Y2hBdWRpbygpLmR1cmF0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBwbGF5IGJ1dHRvbiBjb21wbGV0ZSB3aXRoIENTUyBmb3IgdHJhbnNpdGlvbmluZyB0byBhIHBhdXNlZCBidXR0b24uXG4gICAgICogXG4gICAgICogQXV0b21hdGljYWxseSBob29rZWQgdXAgdG8gdGhlIHBsYXllcidzIHN0YXRlIGNoYW5nZSB1cGRhdGVzIGFuZCBwbGF5IGFuZCBwYXVzZSBmdW5jdGlvbnMuXG4gICAgICogXG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSB0aGUgcGxheSBidXR0b24gZWxlbWVudCB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIERPTS5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZVBsYXlFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBwbGF5QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgcGxheUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwicGxheWVyXCIpO1xuICAgICAgICBwbGF5QnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJwbGF5LWJ0blwiKTtcbiAgICAgICAgaWYgKHRoaXMucGxheWluZykgcGxheUJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwicGF1c2VcIik7XG5cbiAgICAgICAgcGxheUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lclRvQ3VycmVudEF1ZGlvKFwicGxheVwiLCAoKSA9PiB7XG4gICAgICAgICAgICBwbGF5QnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJwYXVzZVwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lclRvQ3VycmVudEF1ZGlvKFwicGF1c2VcIiwgKCkgPT4ge1xuICAgICAgICAgICAgcGxheUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwicGF1c2VcIik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGxheUJ1dHRvbjtcbiAgICB9XG5cbiAgICBnZW5lcmF0ZU5leHRFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBuZXh0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgICAgICAgbmV4dEJ1dHRvbi5jbGFzc0xpc3QuYWRkKFwicGxheWVyXCIpO1xuICAgICAgICBuZXh0QnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJuZXh0XCIpO1xuICAgICAgICBuZXh0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXh0QnV0dG9uO1xuICAgIH1cblxuICAgIGdlbmVyYXRlUHJldmlvdXNFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBwcmV2aW91c0J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgICAgIHByZXZpb3VzQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJwbGF5ZXJcIik7XG4gICAgICAgIHByZXZpb3VzQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJwcmV2aW91c1wiKTtcbiAgICAgICAgcHJldmlvdXNCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcmV2aW91c0J1dHRvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge2NoYW5nZUxpc3RlbmVyfSBsaXN0ZW5lciB0aGUgcGxheWxpc3QgY2hhbmdlIGxpc3RlbmVyIHRvIGFkZCB0byB0aGUgY2FsbGJhY2sgbGlzdC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIGFkZFBsYXlsaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuI3BsYXlsaXN0Q2hhbmdlTGlzdGVuZXJzLmluY2x1ZGVzKGxpc3RlbmVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLiNwbGF5bGlzdENoYW5nZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge2NoYW5nZUxpc3RlbmVyfSBsaXN0ZW5lciB0aGUgcGxheWxpc3QgY2hhbmdlIGxpc3RlbmVyIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhbmQgb25seSBpZiBhIGxpc3RlbmVyIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBmcm9tIHRoZSBjYWxsYmFjayBsaXN0LlxuICAgICAqL1xuICAgIHJlbW92ZVBsYXlsaXN0Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlSW5kZXggPSB0aGlzLiNwbGF5bGlzdENoYW5nZUxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKHJlbW92ZUluZGV4IDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHRoaXMucGxheWxpc3RDaGFuZ2VMaXN0ZW5lci5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge2NoYW5nZUxpc3RlbmVyfSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgcGxheWVyJ3Mgdm9sdW1lIGlzIGNoYW5nZWQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQuXG4gICAgICovXG4gICAgYWRkVm9sdW1lQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuI3ZvbHVtZUNoYW5nZUxpc3RlbmVycy5pbmNsdWRlcyhsaXN0ZW5lcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy4jdm9sdW1lQ2hhbmdlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge2NoYW5nZUxpc3RlbmVyfSBsaXN0ZW5lciB0aGUgdm9sdW1lIGNoYW5nZSBsaXN0ZW5lciB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgYSBsaXN0ZW5lciB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbSB0aGUgY2FsbGJhY2sgbGlzdC5cbiAgICAgKi9cbiAgICByZW1vdmVWb2x1bWVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCByZW1vdmVJbmRleCA9IHRoaXMuI3ZvbHVtZUNoYW5nZUxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKHJlbW92ZUluZGV4IDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHRoaXMuI3ZvbHVtZUNoYW5nZUxpc3RlbmVycy5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBsaXN0ZW5lciBvbiB0aGUge0BsaW5rIEhUTUxBdWRpb0VsZW1lbnR9LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50TGlzdGVuZXIgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVyLlxuICAgICAqL1xuICAgIGFkZEV2ZW50TGlzdGVuZXJUb0N1cnJlbnRBdWRpbyh0eXBlLCBldmVudExpc3RlbmVyKSB7XG4gICAgICAgIGxldCB0eXBlTGlzdGVuZXJzID0gdGhpcy4jYWxsQXVkaW9FdmVudExpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgaWYgKCF0eXBlTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICB0eXBlTGlzdGVuZXJzID0gW107XG4gICAgICAgICAgICB0aGlzLiNhbGxBdWRpb0V2ZW50TGlzdGVuZXJzW3R5cGVdID0gdHlwZUxpc3RlbmVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZUxpc3RlbmVycy5pbmNsdWRlcyhldmVudExpc3RlbmVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0eXBlTGlzdGVuZXJzLnB1c2goZXZlbnRMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMucGxheWxpc3QuY3VycmVudE11c2ljLmZldGNoQXVkaW8oKS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50TGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgbGlzdGVuZXIgb24gdGhlIHtAbGluayBIVE1MQXVkaW9FbGVtZW50fS4gIFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50TGlzdGVuZXIgdGhlIGV2ZW50IGxpc3RlbmVyLiBcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZXZlbnQgbGlzdGVuZXIgd2FzIHN1Y2Nlc3NmdWxseSBhZGRlZC5cbiAgICAgKi9cbiAgICByZW1vdmVFdmVudExpc3RlbmVyRnJvbUN1cnJlbnRBdWRpbyh0eXBlLCBldmVudExpc3RlbmVyKSB7XG4gICAgICAgIGxldCB0eXBlTGlzdGVuZXJzID0gdGhpcy4jYWxsQXVkaW9FdmVudExpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgaWYgKCF0eXBlTGlzdGVuZXJzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbW92ZUluZGV4ID0gdHlwZUxpc3RlbmVycy5pbmRleE9mKGV2ZW50TGlzdGVuZXIpO1xuICAgICAgICBpZiAocmVtb3ZlSW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHR5cGVMaXN0ZW5lcnMuc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5wbGF5bGlzdC5wbGF5bGlzdC5jdXJyZW50TXVzaWMuZmV0Y2hBdWRpbygpLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRMaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBJZiB0aGUgcGxheWVyIGlzIHBsYXlpbmcgYW55IG11c2ljcyByaWdodCBub3cuXG4gICAgICovXG4gICAgZ2V0IHBsYXlpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXlsaXN0LmN1cnJlbnRNdXNpYy5pc0F1ZGlvSW5zdGFudGlhdGVkKCkgJiYgIXRoaXMucGxheWxpc3QuY3VycmVudE11c2ljLmZldGNoQXVkaW8oKS5wYXVzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5sb2FkcyB0aGUgYXVkaW8gZGF0YSBvZiBhbGwgbXVzaWNzIGluIHRoaXMgcGxheWxpc3QuXG4gICAgICovXG4gICAgdW5sb2FkQWxsQXVkaW8oKSB7XG4gICAgICAgIHRoaXMucGxheWxpc3QuZm9yRWFjaChtdXNpYyA9PiB7XG4gICAgICAgICAgICBtdXNpYy51bmxvYWRBdWRpbygpO1xuICAgICAgICB9KTtcbiAgICB9XG59Il0sIm5hbWVzIjpbIk11c2ljUGxheWxpc3QiLCJNdXNpY1BsYXllciIsInBsYXlsaXN0Iiwib2xkIiwiY3VycmVudCIsIm9sZE11c2ljIiwibXVzaWNBdEluZGV4IiwiY3VycmVudE11c2ljIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJsaXN0ZW5lcnMiLCJsaXN0ZW5lciIsImZldGNoQXVkaW8iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidW5sb2FkQXVkaW8iLCJhZGRFdmVudExpc3RlbmVyIiwicGxheUN1cnJlbnQiLCJhZGRFdmVudExpc3RlbmVyVG9DdXJyZW50QXVkaW8iLCJuZXh0IiwidW5sb2FkQWxsQXVkaW8iLCJyZW1vdmVQb3NpdGlvbkNoYW5nZUxpc3RlbmVyIiwiYWRkUG9zaXRpb25DaGFuZ2VMaXN0ZW5lciIsImN1cnJlbnRQb3NpdGlvbiIsInBsYXlsaXN0Q2hhbmdlTGlzdGVuZXIiLCJnZXRQbGF5bGlzdCIsImF1ZGlvIiwidm9sdW1lIiwicGxheSIsInBhdXNlIiwicGxheWluZyIsInBhdXNlQ3VycmVudCIsInBvc2l0aW9uIiwiZHVyYXRpb24iLCJjdXJyZW50VGltZSIsInBsYXlCdXR0b24iLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJ0b2dnbGVQbGF5IiwicmVtb3ZlIiwibmV4dEJ1dHRvbiIsInByZXZpb3VzQnV0dG9uIiwicHJldmlvdXMiLCJpbmNsdWRlcyIsInB1c2giLCJyZW1vdmVJbmRleCIsImluZGV4T2YiLCJzcGxpY2UiLCJ0eXBlIiwiZXZlbnRMaXN0ZW5lciIsInR5cGVMaXN0ZW5lcnMiLCJpc0F1ZGlvSW5zdGFudGlhdGVkIiwicGF1c2VkIiwibXVzaWMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/player/MusicPlayer.js\n"); + +/***/ }), + +/***/ "./src/player/MusicPlaylist.js": +/*!*************************************!*\ + !*** ./src/player/MusicPlaylist.js ***! + \*************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ MusicPlaylist)\n/* harmony export */ });\n/* harmony import */ var _Music_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Music.js */ \"./src/player/Music.js\");\nvar _Symbol$iterator;\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }\n\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\n\nfunction _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); } }\n\nfunction _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError(\"attempted to get private field on non-instance\"); } return fn; }\n\nfunction _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n\nfunction _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n\nfunction _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }\n\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n\nfunction _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError(\"attempted to set read only private field\"); } descriptor.value = value; } }\n\n\n/**@module */\n\n/**\n * @callback positionChangeListener\n * @param {number} old the previous position.\n * @param {number} current the the current (new) position.\n */\n\n/**\n * @callback lengthChangeListener\n * @param {number} changed The index of the music that has changed.\n * @param {boolean} added True if and only if the change was caused by adding music.\n * @param {Music} music The music that was added or removed.\n */\n\n/**\n * A playlist that holds a multitude of musics in the form of {@link Music}.\n */\n\nvar _list = /*#__PURE__*/new WeakMap();\n\nvar _name = /*#__PURE__*/new WeakMap();\n\nvar _current = /*#__PURE__*/new WeakMap();\n\nvar _positionChangeListeners = /*#__PURE__*/new WeakMap();\n\nvar _lengthChangeListeners = /*#__PURE__*/new WeakMap();\n\nvar _onAdd = /*#__PURE__*/new WeakSet();\n\n_Symbol$iterator = Symbol.iterator;\n\nvar MusicPlaylist = /*#__PURE__*/function () {\n /**\n * Instantiates a playlist for musics.\n * \n * @param {string} name The name of the playlist.\n */\n function MusicPlaylist(name) {\n _classCallCheck(this, MusicPlaylist);\n\n _classPrivateMethodInitSpec(this, _onAdd);\n\n _classPrivateFieldInitSpec(this, _list, {\n writable: true,\n value: []\n });\n\n _classPrivateFieldInitSpec(this, _name, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _current, {\n writable: true,\n value: 0\n });\n\n _classPrivateFieldInitSpec(this, _positionChangeListeners, {\n writable: true,\n value: []\n });\n\n _classPrivateFieldInitSpec(this, _lengthChangeListeners, {\n writable: true,\n value: []\n });\n\n _classPrivateFieldSet(this, _name, name);\n }\n /**\n * @returns {string} The name of the playlist. \n */\n\n\n _createClass(MusicPlaylist, [{\n key: \"name\",\n get: function get() {\n return _classPrivateFieldGet(this, _name);\n }\n /**\n * \n * @param {number} index the index of the music to retrieve.\n * @returns {Music} the music at the given index.\n */\n\n }, {\n key: \"musicAtIndex\",\n value: function musicAtIndex(index) {\n if (index >= this.total) {\n return null;\n }\n\n return _classPrivateFieldGet(this, _list)[index];\n }\n /**\n * Automatically creates and adds a {@link Music} to this playlist.\n * \n * @param {string} url where the audio data can be found.\n * @param {string} name the name of the music.\n * @param {string} author the author(s) of the music.\n */\n\n }, {\n key: \"add\",\n value: function add(url, name, author) {\n var music = new _Music_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](url, name, author, this);\n\n _classPrivateFieldGet(this, _list).push(music);\n\n _classPrivateMethodGet(this, _onAdd, _onAdd2).call(this, this.total - 1, music);\n }\n /**\n * Adds an existing {@link Music} object to this playlist. Alternatively, use {@link MusicPlaylist#add} to automatically instantiate a new one.\n * \n * @param {Music} music The existing music to add.\n */\n\n }, {\n key: \"addExisting\",\n value: function addExisting(music) {\n _classPrivateFieldGet(this, _list).push(music);\n\n _classPrivateMethodGet(this, _onAdd, _onAdd2).call(this, this.total - 1, music);\n }\n /**\n * Calls all playlist length change listeners.\n * \n * @param {number} index The index at which the new music was added.\n * @param {Music} music The music that was added.\n */\n\n }, {\n key: \"remove\",\n value:\n /**\n * Removes a {@link Music} from this playlist.\n * \n * @param {number} index the index of the music to be removed.\n * @returns {Music} the music that was removed, or null if the index of was invalid.\n */\n function remove(index) {\n if (index >= _classPrivateFieldGet(this, _list).length) {\n return null;\n }\n\n var removed = _classPrivateFieldGet(this, _list).splice(index, 1)[0];\n\n _classPrivateFieldGet(this, _lengthChangeListeners).forEach(function (listener) {\n listener(index, false, removed);\n });\n\n if (removed.length > 0) {\n return removed[0];\n }\n }\n /**\n * Attempts to find a {@link Music} given a name. Returns the first one found.\n * \n * @param {string} name the name of the music to be found.\n * @returns {number} the index of the music found, or -1 if it was not found.\n */\n\n }, {\n key: \"findMusicIndex\",\n value: function findMusicIndex(name) {\n return _classPrivateFieldGet(this, _list).findIndex(function (item) {\n return item.getDisplayName() == name;\n });\n }\n /**\n * The number of {@link Music} in this playlist.\n * \n * @returns {number} total number of musics in this playlist.\n */\n\n }, {\n key: \"total\",\n get: function get() {\n return _classPrivateFieldGet(this, _list).length;\n }\n /**\n * @returns {number} The current position in the playlist.\n */\n\n }, {\n key: \"currentPosition\",\n get: function get() {\n return _classPrivateFieldGet(this, _current);\n }\n /**\n * The current position in the playlist.\n */\n ,\n set: function set(position) {\n if (typeof position !== \"number\") throw new Error(\"Given position is invalid.\");\n if (position >= _classPrivateFieldGet(this, _list).length || position < 0) return;\n\n var old = _classPrivateFieldGet(this, _current);\n\n _classPrivateFieldSet(this, _current, position);\n\n _classPrivateFieldGet(this, _positionChangeListeners).forEach(function (positionChangeListener) {\n positionChangeListener(old, position);\n });\n }\n /**\n * @returns {Music} The current music in the playlist being used.\n */\n\n }, {\n key: \"currentMusic\",\n get: function get() {\n return this.musicAtIndex(this.currentPosition);\n }\n /**\n * \n * @param {positionChangeListener} listener the listener to receive the updates.\n * @returns {boolean} true if and only if successfully added the listener.\n */\n\n }, {\n key: \"addPositionChangeListener\",\n value: function addPositionChangeListener(listener) {\n if (_classPrivateFieldGet(this, _positionChangeListeners).includes(listener)) return false;\n\n _classPrivateFieldGet(this, _positionChangeListeners).push(listener);\n\n return true;\n }\n /**\n * \n * @param {positionChangeListener} listener the music change listener to remove.\n * @returns {boolean} true if and only if the music change listener given was successfully removed.\n */\n\n }, {\n key: \"removePositionChangeListener\",\n value: function removePositionChangeListener(listener) {\n var removeIndex = _classPrivateFieldGet(this, _positionChangeListeners).indexOf(listener);\n\n if (removeIndex < 0) return false;\n\n _classPrivateFieldGet(this, _positionChangeListeners).splice(removeIndex, 1);\n\n return true;\n }\n /**\n * Adds a listener for whether music was added or removed to the playlist.\n * \n * @param {lengthChangeListener} listener The listener to be added.\n * @returns {boolean} True if and only if the listener was successfully added.\n */\n\n }, {\n key: \"addLengthChangeListener\",\n value: function addLengthChangeListener(listener) {\n if (_classPrivateFieldGet(this, _lengthChangeListeners).includes(listener)) return false;\n\n _classPrivateFieldGet(this, _lengthChangeListeners).push(listener);\n\n return true;\n }\n /**\n * Removes a listener for whether music is added or removed to the playlist.\n * \n * @param {lengthChangeListener} listener The listener to be removed.\n * @returns {boolean} True if and only if the provided listener was successfully removed.\n */\n\n }, {\n key: \"removeLengthChangeListener\",\n value: function removeLengthChangeListener(listener) {\n var removeIndex = _classPrivateFieldGet(this, _lengthChangeListeners).indexOf(listener);\n\n if (removeIndex < 0) return false;\n\n _classPrivateFieldGet(this, _lengthChangeListeners).splice(removeIndex, 1);\n\n return true;\n }\n }, {\n key: \"generatePlaylistElement\",\n value: function generatePlaylistElement() {\n var element = document.createElement(\"table\");\n element.createTHead().textContent = \"Playlist\";\n var headers = element.insertRow();\n var musicHeader = document.createElement(\"th\");\n musicHeader.textContent = \"Music\";\n headers.appendChild(musicHeader);\n var authorHeader = document.createElement(\"th\");\n authorHeader.textContent = \"Author\";\n headers.appendChild(authorHeader);\n\n var insertMusic = function insertMusic(music) {\n var musicPos = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;\n if (musicPos) musicPos++;\n var row = element.insertRow(musicPos);\n row.insertCell().textContent = music.displayName;\n row.insertCell().textContent = music.author;\n };\n\n var _iterator = _createForOfIteratorHelper(this),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var music = _step.value;\n insertMusic(music);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n this.addLengthChangeListener(function (changed, added, music) {\n if (added) {\n insertMusic(music, changed);\n } else {\n element.deleteRow(changed);\n }\n });\n element.rows[this.currentPosition + 1].classList.add(\"active\");\n this.addPositionChangeListener(function (old, current) {\n element.rows[old + 1].classList.remove(\"active\");\n element.rows[current + 1].classList.add(\"active\");\n });\n return element;\n }\n }, {\n key: _Symbol$iterator,\n value: function value() {\n var index = -1;\n\n var data = _classPrivateFieldGet(this, _list);\n\n return {\n next: function next() {\n return {\n value: data[++index],\n done: index >= data.length\n };\n } // Brackets so not read as a body of anonymous function.\n\n };\n }\n }]);\n\n return MusicPlaylist;\n}();\n\nfunction _onAdd2(index, music) {\n _classPrivateFieldGet(this, _lengthChangeListeners).forEach(function (listener) {\n listener(index, true, music);\n });\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUssRUFBRUYsSUFBSSxDQUFDLEVBQUVqRCxLQUFILENBQWI7QUFBd0JvRCxZQUFBQSxJQUFJLEVBQUVwRCxLQUFLLElBQUlpRCxJQUFJLENBQUMzQztBQUE1QyxXQUFQO0FBQUEsU0FESCxDQUNnRTs7QUFEaEUsT0FBUDtBQUdIOzs7Ozs7aUJBcEtNTixPQUFPSSxPQUFPO0FBQ2pCLHNEQUE0QkssT0FBNUIsQ0FBb0MsVUFBQUMsUUFBUSxFQUFJO0FBQzVDQSxJQUFBQSxRQUFRLENBQUNWLEtBQUQsRUFBUSxJQUFSLEVBQWNJLEtBQWQsQ0FBUjtBQUNILEdBRkQ7QUFHSCIsInNvdXJjZXMiOlsid2VicGFjazovL2F1ZGlvc2hvd2tpdC8uL3NyYy9wbGF5ZXIvTXVzaWNQbGF5bGlzdC5qcz9iYTM1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNdXNpYyBmcm9tIFwiLi9NdXNpYy5qc1wiO1xuXG4vKipAbW9kdWxlICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHBvc2l0aW9uQ2hhbmdlTGlzdGVuZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBvbGQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGN1cnJlbnQgdGhlIHRoZSBjdXJyZW50IChuZXcpIHBvc2l0aW9uLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIGxlbmd0aENoYW5nZUxpc3RlbmVyXG4gKiBAcGFyYW0ge251bWJlcn0gY2hhbmdlZCBUaGUgaW5kZXggb2YgdGhlIG11c2ljIHRoYXQgaGFzIGNoYW5nZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFkZGVkIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGNoYW5nZSB3YXMgY2F1c2VkIGJ5IGFkZGluZyBtdXNpYy5cbiAqIEBwYXJhbSB7TXVzaWN9IG11c2ljIFRoZSBtdXNpYyB0aGF0IHdhcyBhZGRlZCBvciByZW1vdmVkLlxuICovXG5cbi8qKlxuICogQSBwbGF5bGlzdCB0aGF0IGhvbGRzIGEgbXVsdGl0dWRlIG9mIG11c2ljcyBpbiB0aGUgZm9ybSBvZiB7QGxpbmsgTXVzaWN9LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNdXNpY1BsYXlsaXN0IHtcbiAgICAjbGlzdCA9IFtdO1xuICAgICNuYW1lO1xuICAgICNjdXJyZW50ID0gMDtcbiAgICAjcG9zaXRpb25DaGFuZ2VMaXN0ZW5lcnMgPSBbXTtcbiAgICAjbGVuZ3RoQ2hhbmdlTGlzdGVuZXJzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBJbnN0YW50aWF0ZXMgYSBwbGF5bGlzdCBmb3IgbXVzaWNzLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwbGF5bGlzdC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgICAgIHRoaXMuI25hbWUgPSBuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBwbGF5bGlzdC4gXG4gICAgICovXG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG11c2ljIHRvIHJldHJpZXZlLlxuICAgICAqIEByZXR1cm5zIHtNdXNpY30gdGhlIG11c2ljIGF0IHRoZSBnaXZlbiBpbmRleC5cbiAgICAgKi9cbiAgICBtdXNpY0F0SW5kZXgoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMudG90YWwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNsaXN0W2luZGV4XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYW5kIGFkZHMgYSB7QGxpbmsgTXVzaWN9IHRvIHRoaXMgcGxheWxpc3QuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCB3aGVyZSB0aGUgYXVkaW8gZGF0YSBjYW4gYmUgZm91bmQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIG11c2ljLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRob3IgdGhlIGF1dGhvcihzKSBvZiB0aGUgbXVzaWMuXG4gICAgICovXG4gICAgYWRkKHVybCwgbmFtZSwgYXV0aG9yKSB7XG4gICAgICAgIGNvbnN0IG11c2ljID0gbmV3IE11c2ljKHVybCwgbmFtZSwgYXV0aG9yLCB0aGlzKTtcbiAgICAgICAgdGhpcy4jbGlzdC5wdXNoKG11c2ljKTtcbiAgICAgICAgdGhpcy4jb25BZGQodGhpcy50b3RhbCAtIDEsIG11c2ljKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGV4aXN0aW5nIHtAbGluayBNdXNpY30gb2JqZWN0IHRvIHRoaXMgcGxheWxpc3QuIEFsdGVybmF0aXZlbHksIHVzZSB7QGxpbmsgTXVzaWNQbGF5bGlzdCNhZGR9IHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFudGlhdGUgYSBuZXcgb25lLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7TXVzaWN9IG11c2ljIFRoZSBleGlzdGluZyBtdXNpYyB0byBhZGQuXG4gICAgICovXG4gICAgYWRkRXhpc3RpbmcobXVzaWMpIHtcbiAgICAgICAgdGhpcy4jbGlzdC5wdXNoKG11c2ljKTtcbiAgICAgICAgdGhpcy4jb25BZGQodGhpcy50b3RhbCAtIDEsIG11c2ljKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxscyBhbGwgcGxheWxpc3QgbGVuZ3RoIGNoYW5nZSBsaXN0ZW5lcnMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgbmV3IG11c2ljIHdhcyBhZGRlZC5cbiAgICAgKiBAcGFyYW0ge011c2ljfSBtdXNpYyBUaGUgbXVzaWMgdGhhdCB3YXMgYWRkZWQuXG4gICAgICovXG4gICAgI29uQWRkKGluZGV4LCBtdXNpYykge1xuICAgICAgICB0aGlzLiNsZW5ndGhDaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lcihpbmRleCwgdHJ1ZSwgbXVzaWMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEge0BsaW5rIE11c2ljfSBmcm9tIHRoaXMgcGxheWxpc3QuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IHRoZSBpbmRleCBvZiB0aGUgbXVzaWMgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKiBAcmV0dXJucyB7TXVzaWN9IHRoZSBtdXNpYyB0aGF0IHdhcyByZW1vdmVkLCBvciBudWxsIGlmIHRoZSBpbmRleCBvZiB3YXMgaW52YWxpZC5cbiAgICAgKi9cbiAgICByZW1vdmUoaW5kZXgpIHtcbiAgICAgICAgaWYgKGluZGV4ID49IHRoaXMuI2xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVtb3ZlZCA9IHRoaXMuI2xpc3Quc3BsaWNlKGluZGV4LCAxKVswXTtcbiAgICAgICAgdGhpcy4jbGVuZ3RoQ2hhbmdlTGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIoaW5kZXgsIGZhbHNlLCByZW1vdmVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZW1vdmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZW1vdmVkWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXR0ZW1wdHMgdG8gZmluZCBhIHtAbGluayBNdXNpY30gZ2l2ZW4gYSBuYW1lLiBSZXR1cm5zIHRoZSBmaXJzdCBvbmUgZm91bmQuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIG11c2ljIHRvIGJlIGZvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBpbmRleCBvZiB0aGUgbXVzaWMgZm91bmQsIG9yIC0xIGlmIGl0IHdhcyBub3QgZm91bmQuXG4gICAgICovXG4gICAgZmluZE11c2ljSW5kZXgobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGlzdC5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uZ2V0RGlzcGxheU5hbWUoKSA9PSBuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHtAbGluayBNdXNpY30gaW4gdGhpcyBwbGF5bGlzdC5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSB0b3RhbCBudW1iZXIgb2YgbXVzaWNzIGluIHRoaXMgcGxheWxpc3QuXG4gICAgICovXG4gICAgZ2V0IHRvdGFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGlzdC5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHBsYXlsaXN0LlxuICAgICAqL1xuICAgIGdldCBjdXJyZW50UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBwbGF5bGlzdC5cbiAgICAgKi9cbiAgICBzZXQgY3VycmVudFBvc2l0aW9uKHBvc2l0aW9uKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcIkdpdmVuIHBvc2l0aW9uIGlzIGludmFsaWQuXCIpO1xuICAgICAgICBpZiAocG9zaXRpb24gPj0gdGhpcy4jbGlzdC5sZW5ndGggfHwgcG9zaXRpb24gPCAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG9sZCA9IHRoaXMuI2N1cnJlbnQ7XG4gICAgICAgIHRoaXMuI2N1cnJlbnQgPSBwb3NpdGlvbjtcbiAgICAgICAgdGhpcy4jcG9zaXRpb25DaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaChwb3NpdGlvbkNoYW5nZUxpc3RlbmVyID0+IHtcbiAgICAgICAgICAgIHBvc2l0aW9uQ2hhbmdlTGlzdGVuZXIob2xkLCBwb3NpdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtNdXNpY30gVGhlIGN1cnJlbnQgbXVzaWMgaW4gdGhlIHBsYXlsaXN0IGJlaW5nIHVzZWQuXG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRNdXNpYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVzaWNBdEluZGV4KHRoaXMuY3VycmVudFBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge3Bvc2l0aW9uQ2hhbmdlTGlzdGVuZXJ9IGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byByZWNlaXZlIHRoZSB1cGRhdGVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHN1Y2Nlc3NmdWxseSBhZGRlZCB0aGUgbGlzdGVuZXIuXG4gICAgICovXG4gICAgYWRkUG9zaXRpb25DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgICAgICBpZiAodGhpcy4jcG9zaXRpb25DaGFuZ2VMaXN0ZW5lcnMuaW5jbHVkZXMobGlzdGVuZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuI3Bvc2l0aW9uQ2hhbmdlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge3Bvc2l0aW9uQ2hhbmdlTGlzdGVuZXJ9IGxpc3RlbmVyIHRoZSBtdXNpYyBjaGFuZ2UgbGlzdGVuZXIgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBtdXNpYyBjaGFuZ2UgbGlzdGVuZXIgZ2l2ZW4gd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqL1xuICAgIHJlbW92ZVBvc2l0aW9uQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlSW5kZXggPSB0aGlzLiNwb3NpdGlvbkNoYW5nZUxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKHJlbW92ZUluZGV4IDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHRoaXMuI3Bvc2l0aW9uQ2hhbmdlTGlzdGVuZXJzLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3Igd2hldGhlciBtdXNpYyB3YXMgYWRkZWQgb3IgcmVtb3ZlZCB0byB0aGUgcGxheWxpc3QuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtsZW5ndGhDaGFuZ2VMaXN0ZW5lcn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGJlIGFkZGVkLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLlxuICAgICAqL1xuICAgIGFkZExlbmd0aENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLiNsZW5ndGhDaGFuZ2VMaXN0ZW5lcnMuaW5jbHVkZXMobGlzdGVuZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuI2xlbmd0aENoYW5nZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZvciB3aGV0aGVyIG11c2ljIGlzIGFkZGVkIG9yIHJlbW92ZWQgdG8gdGhlIHBsYXlsaXN0LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7bGVuZ3RoQ2hhbmdlTGlzdGVuZXJ9IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBwcm92aWRlZCBsaXN0ZW5lciB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICovXG4gICAgcmVtb3ZlTGVuZ3RoQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlSW5kZXggPSB0aGlzLiNsZW5ndGhDaGFuZ2VMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgIGlmIChyZW1vdmVJbmRleCA8IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy4jbGVuZ3RoQ2hhbmdlTGlzdGVuZXJzLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdlbmVyYXRlUGxheWxpc3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRhYmxlXCIpO1xuICAgICAgICBlbGVtZW50LmNyZWF0ZVRIZWFkKCkudGV4dENvbnRlbnQgPSBcIlBsYXlsaXN0XCI7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBlbGVtZW50Lmluc2VydFJvdygpO1xuICAgICAgICBjb25zdCBtdXNpY0hlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0aFwiKTtcbiAgICAgICAgbXVzaWNIZWFkZXIudGV4dENvbnRlbnQgPSBcIk11c2ljXCI7XG4gICAgICAgIGhlYWRlcnMuYXBwZW5kQ2hpbGQobXVzaWNIZWFkZXIpO1xuICAgICAgICBjb25zdCBhdXRob3JIZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGhcIik7XG4gICAgICAgIGF1dGhvckhlYWRlci50ZXh0Q29udGVudCA9IFwiQXV0aG9yXCI7XG4gICAgICAgIGhlYWRlcnMuYXBwZW5kQ2hpbGQoYXV0aG9ySGVhZGVyKTtcblxuICAgICAgICBjb25zdCBpbnNlcnRNdXNpYyA9IChtdXNpYywgbXVzaWNQb3MgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChtdXNpY1BvcykgbXVzaWNQb3MrKztcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGVsZW1lbnQuaW5zZXJ0Um93KG11c2ljUG9zKTtcbiAgICAgICAgICAgIHJvdy5pbnNlcnRDZWxsKCkudGV4dENvbnRlbnQgPSBtdXNpYy5kaXNwbGF5TmFtZTtcbiAgICAgICAgICAgIHJvdy5pbnNlcnRDZWxsKCkudGV4dENvbnRlbnQgPSBtdXNpYy5hdXRob3I7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgbXVzaWMgb2YgdGhpcykge1xuICAgICAgICAgICAgaW5zZXJ0TXVzaWMobXVzaWMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGRMZW5ndGhDaGFuZ2VMaXN0ZW5lcigoY2hhbmdlZCwgYWRkZWQsIG11c2ljKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWRkZWQpIHtcbiAgICAgICAgICAgICAgICBpbnNlcnRNdXNpYyhtdXNpYywgY2hhbmdlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGVsZXRlUm93KGNoYW5nZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBlbGVtZW50LnJvd3NbdGhpcy5jdXJyZW50UG9zaXRpb24gKyAxXS5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuXG4gICAgICAgIHRoaXMuYWRkUG9zaXRpb25DaGFuZ2VMaXN0ZW5lcigob2xkLCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LnJvd3Nbb2xkICsgMV0uY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgIGVsZW1lbnQucm93c1tjdXJyZW50ICsgMV0uY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuI2xpc3Q7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiAoeyB2YWx1ZTogZGF0YVsrK2luZGV4XSwgZG9uZTogaW5kZXggPj0gZGF0YS5sZW5ndGggfSkgLy8gQnJhY2tldHMgc28gbm90IHJlYWQgYXMgYSBib2R5IG9mIGFub255bW91cyBmdW5jdGlvbi5cbiAgICAgICAgfTtcbiAgICB9XG59Il0sIm5hbWVzIjpbIk11c2ljIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJNdXNpY1BsYXlsaXN0IiwibmFtZSIsImluZGV4IiwidG90YWwiLCJ1cmwiLCJhdXRob3IiLCJtdXNpYyIsInB1c2giLCJsZW5ndGgiLCJyZW1vdmVkIiwic3BsaWNlIiwiZm9yRWFjaCIsImxpc3RlbmVyIiwiZmluZEluZGV4IiwiaXRlbSIsImdldERpc3BsYXlOYW1lIiwicG9zaXRpb24iLCJFcnJvciIsIm9sZCIsInBvc2l0aW9uQ2hhbmdlTGlzdGVuZXIiLCJtdXNpY0F0SW5kZXgiLCJjdXJyZW50UG9zaXRpb24iLCJpbmNsdWRlcyIsInJlbW92ZUluZGV4IiwiaW5kZXhPZiIsImVsZW1lbnQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjcmVhdGVUSGVhZCIsInRleHRDb250ZW50IiwiaGVhZGVycyIsImluc2VydFJvdyIsIm11c2ljSGVhZGVyIiwiYXBwZW5kQ2hpbGQiLCJhdXRob3JIZWFkZXIiLCJpbnNlcnRNdXNpYyIsIm11c2ljUG9zIiwidW5kZWZpbmVkIiwicm93IiwiaW5zZXJ0Q2VsbCIsImRpc3BsYXlOYW1lIiwiYWRkTGVuZ3RoQ2hhbmdlTGlzdGVuZXIiLCJjaGFuZ2VkIiwiYWRkZWQiLCJkZWxldGVSb3ciLCJyb3dzIiwiY2xhc3NMaXN0IiwiYWRkIiwiYWRkUG9zaXRpb25DaGFuZ2VMaXN0ZW5lciIsImN1cnJlbnQiLCJyZW1vdmUiLCJkYXRhIiwibmV4dCIsInZhbHVlIiwiZG9uZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/player/MusicPlaylist.js\n"); + +/***/ }), + +/***/ "./src/player/VisualizedMusicPlayer.js": +/*!*********************************************!*\ + !*** ./src/player/VisualizedMusicPlayer.js ***! + \*********************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ VisualizedMusicPlayer)\n/* harmony export */ });\n/* harmony import */ var _visualization_Visualizer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../visualization/Visualizer.js */ \"./src/visualization/Visualizer.js\");\n/* harmony import */ var _visualization_VisualizerUpdateManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../visualization/VisualizerUpdateManager.js */ \"./src/visualization/VisualizerUpdateManager.js\");\n/* harmony import */ var _MusicPlayer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./MusicPlayer.js */ \"./src/player/MusicPlayer.js\");\n/* harmony import */ var _MusicPlaylist_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./MusicPlaylist.js */ \"./src/player/MusicPlaylist.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _get() { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }\n\nfunction set(target, property, value, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); }\n\nfunction _set(target, property, value, receiver, isStrict) { var s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\n\nfunction _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); } }\n\nfunction _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n\nfunction _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n\nfunction _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }\n\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n\nfunction _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError(\"attempted to set read only private field\"); } descriptor.value = value; } }\n\n\n\n\n\n/**@module */\n\n/**\n * A music player that provides easier access to the current musics visualizer data.\n * Additionally, automatically re-binds all the visualizer update listeners for music changes.\n * \n * @augments MusicPlayer\n */\n\nvar _fftSize = /*#__PURE__*/new WeakMap();\n\nvar _visualizerUpdateManager = /*#__PURE__*/new WeakMap();\n\nvar VisualizedMusicPlayer = /*#__PURE__*/function (_MusicPlayer) {\n _inherits(VisualizedMusicPlayer, _MusicPlayer);\n\n var _super = _createSuper(VisualizedMusicPlayer);\n\n /**\n * Instantiates a music player with visualization features.\n * \n * @param {MusicPlaylist} playlist the playlist this player manages.\n * @param {number} [fftSize=1024] the size of the fft window for analysis.\n */\n function VisualizedMusicPlayer(playlist) {\n var _this;\n\n var fftSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1024;\n\n _classCallCheck(this, VisualizedMusicPlayer);\n\n _this = _super.call(this, playlist);\n\n _classPrivateFieldInitSpec(_assertThisInitialized(_this), _fftSize, {\n writable: true,\n value: 1024\n });\n\n _classPrivateFieldInitSpec(_assertThisInitialized(_this), _visualizerUpdateManager, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldSet(_assertThisInitialized(_this), _fftSize, fftSize);\n\n _classPrivateFieldSet(_assertThisInitialized(_this), _visualizerUpdateManager, new _visualization_VisualizerUpdateManager_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](_this.getCurrentMusicVisualizer()));\n\n return _this;\n }\n /**\n * Sets the the playlist.\n */\n\n\n _createClass(VisualizedMusicPlayer, [{\n key: \"playlist\",\n set: function set(playlist) {\n _set(_getPrototypeOf(VisualizedMusicPlayer.prototype), \"playlist\", playlist, this, true);\n\n _classPrivateFieldSet(this, _visualizerUpdateManager, new _visualization_VisualizerUpdateManager_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this.getCurrentMusicVisualizer()));\n }\n /**\n * \n * @returns {boolean} true if and only if successful in changing to the next music.\n */\n\n }, {\n key: \"next\",\n value: function next() {\n var updateListeners = _classPrivateFieldGet(this, _visualizerUpdateManager).getBinnedListeners();\n\n if (!_get(_getPrototypeOf(VisualizedMusicPlayer.prototype), \"next\", this).call(this)) return false;\n\n _classPrivateFieldSet(this, _visualizerUpdateManager, new _visualization_VisualizerUpdateManager_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this.getCurrentMusicVisualizer()));\n\n _classPrivateFieldGet(this, _visualizerUpdateManager).setBinnedListeners(updateListeners);\n\n return true;\n }\n /**\n * Jumps to the previous music if possible.\n * \n * @returns {boolean} true if and only if successful in switching to the previous music in the playlist.\n */\n\n }, {\n key: \"previous\",\n value: function previous() {\n var updateListeners = _classPrivateFieldGet(this, _visualizerUpdateManager).getBinnedListeners();\n\n if (!_get(_getPrototypeOf(VisualizedMusicPlayer.prototype), \"previous\", this).call(this)) return false;\n\n _classPrivateFieldSet(this, _visualizerUpdateManager, new _visualization_VisualizerUpdateManager_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this.getCurrentMusicVisualizer()));\n\n _classPrivateFieldGet(this, _visualizerUpdateManager).setBinnedListeners(updateListeners);\n\n return true;\n }\n /**\n * \n * @param {number} index the index of the music to change to.\n * @returns {boolean} true if and only if successful in jumping to the given index.\n */\n\n }, {\n key: \"changeCurrent\",\n value: function changeCurrent(index) {\n var updateListeners = this.VisualizerUpdateManager.getBinnedListeners();\n if (!_get(_getPrototypeOf(VisualizedMusicPlayer.prototype), \"changeCurrent\", this).call(this, index)) return false;\n\n _classPrivateFieldSet(this, _visualizerUpdateManager, new _visualization_VisualizerUpdateManager_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](this.getCurrentMusicVisualizer()));\n\n _classPrivateFieldGet(this, _visualizerUpdateManager).setBinnedListeners = updateListeners();\n return true;\n }\n /**\n * @returns {VisualizerUpdateManager} The current visualizer update manager.\n */\n\n }, {\n key: \"currentVisualizerUpdateManager\",\n get: function get() {\n return _classPrivateFieldGet(this, _visualizerUpdateManager).call(this);\n }\n /**\n * @returns {Visualizer} The current music's visualizer.\n */\n\n }, {\n key: \"currentMusicVisualizer\",\n get: function get() {\n return this.getCurrentMusic().getVisualizer();\n }\n }]);\n\n return VisualizedMusicPlayer;\n}(_MusicPlayer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGxheWVyL1Zpc3VhbGl6ZWRNdXNpY1BsYXllci5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0lBQ3FCSTs7Ozs7QUFJakI7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0ksaUNBQVlDLFFBQVosRUFBc0M7QUFBQTs7QUFBQSxRQUFoQkMsT0FBZ0IsdUVBQU4sSUFBTTs7QUFBQTs7QUFDbEMsOEJBQU1ELFFBQU47O0FBRGtDO0FBQUE7QUFBQSxhQVQzQjtBQVMyQjs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFFbEMsbUVBQWdCQyxPQUFoQjs7QUFDQSxtRkFBZ0MsSUFBSUwsaUZBQUosQ0FBNEIsTUFBS00seUJBQUwsRUFBNUIsQ0FBaEM7O0FBSGtDO0FBSXJDO0FBRUQ7QUFDSjtBQUNBOzs7OztTQUNJLGFBQWFGLFFBQWIsRUFBdUI7QUFDbkIseUVBQWlCQSxRQUFqQjs7QUFDQSw0REFBZ0MsSUFBSUosaUZBQUosQ0FBNEIsS0FBS00seUJBQUwsRUFBNUIsQ0FBaEM7QUFDSDtBQUVEO0FBQ0o7QUFDQTtBQUNBOzs7O1dBQ0ksZ0JBQU87QUFDSCxVQUFNQyxlQUFlLEdBQUcsc0RBQThCQyxrQkFBOUIsRUFBeEI7O0FBQ0EsVUFBSSxnRkFBSixFQUFtQixPQUFPLEtBQVA7O0FBQ25CLDREQUFnQyxJQUFJUixpRkFBSixDQUE0QixLQUFLTSx5QkFBTCxFQUE1QixDQUFoQzs7QUFDQSw0REFBOEJHLGtCQUE5QixDQUFpREYsZUFBakQ7O0FBQ0EsYUFBTyxJQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0ksb0JBQVc7QUFDUCxVQUFNQSxlQUFlLEdBQUcsc0RBQThCQyxrQkFBOUIsRUFBeEI7O0FBQ0EsVUFBSSxvRkFBSixFQUF1QixPQUFPLEtBQVA7O0FBRXZCLDREQUFnQyxJQUFJUixpRkFBSixDQUE0QixLQUFLTSx5QkFBTCxFQUE1QixDQUFoQzs7QUFDQSw0REFBOEJHLGtCQUE5QixDQUFpREYsZUFBakQ7O0FBQ0EsYUFBTyxJQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0ksdUJBQWNHLEtBQWQsRUFBcUI7QUFDakIsVUFBTUgsZUFBZSxHQUFHLEtBQUtQLHVCQUFMLENBQTZCUSxrQkFBN0IsRUFBeEI7QUFDQSxVQUFJLDBGQUFxQkUsS0FBckIsQ0FBSixFQUFpQyxPQUFPLEtBQVA7O0FBQ2pDLDREQUFnQyxJQUFJVixpRkFBSixDQUE0QixLQUFLTSx5QkFBTCxFQUE1QixDQUFoQzs7QUFDQSw0REFBOEJHLGtCQUE5QixHQUFtREYsZUFBZSxFQUFsRTtBQUNBLGFBQU8sSUFBUDtBQUNIO0FBRUQ7QUFDSjtBQUNBOzs7O1NBQ0ksZUFBcUM7QUFDakMsbUNBQU8sSUFBUCxpQ0FBTyxJQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7Ozs7U0FDSSxlQUE2QjtBQUN6QixhQUFPLEtBQUtJLGVBQUwsR0FBdUJDLGFBQXZCLEVBQVA7QUFDSDs7OztFQTNFOENYIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXVkaW9zaG93a2l0Ly4vc3JjL3BsYXllci9WaXN1YWxpemVkTXVzaWNQbGF5ZXIuanM/NWM1YSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVmlzdWFsaXplciBmcm9tIFwiLi4vdmlzdWFsaXphdGlvbi9WaXN1YWxpemVyLmpzXCI7XG5pbXBvcnQgVmlzdWFsaXplclVwZGF0ZU1hbmFnZXIgZnJvbSBcIi4uL3Zpc3VhbGl6YXRpb24vVmlzdWFsaXplclVwZGF0ZU1hbmFnZXIuanNcIjtcbmltcG9ydCBNdXNpY1BsYXllciBmcm9tIFwiLi9NdXNpY1BsYXllci5qc1wiO1xuaW1wb3J0IE11c2ljUGxheWxpc3QgZnJvbSBcIi4vTXVzaWNQbGF5bGlzdC5qc1wiO1xuXG4vKipAbW9kdWxlICovXG5cbi8qKlxuICogQSBtdXNpYyBwbGF5ZXIgdGhhdCBwcm92aWRlcyBlYXNpZXIgYWNjZXNzIHRvIHRoZSBjdXJyZW50IG11c2ljcyB2aXN1YWxpemVyIGRhdGEuXG4gKiBBZGRpdGlvbmFsbHksIGF1dG9tYXRpY2FsbHkgcmUtYmluZHMgYWxsIHRoZSB2aXN1YWxpemVyIHVwZGF0ZSBsaXN0ZW5lcnMgZm9yIG11c2ljIGNoYW5nZXMuXG4gKiBcbiAqIEBhdWdtZW50cyBNdXNpY1BsYXllclxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaXN1YWxpemVkTXVzaWNQbGF5ZXIgZXh0ZW5kcyBNdXNpY1BsYXllciB7XG4gICAgI2ZmdFNpemUgPSAxMDI0O1xuICAgICN2aXN1YWxpemVyVXBkYXRlTWFuYWdlcjtcblxuICAgIC8qKlxuICAgICAqIEluc3RhbnRpYXRlcyBhIG11c2ljIHBsYXllciB3aXRoIHZpc3VhbGl6YXRpb24gZmVhdHVyZXMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtNdXNpY1BsYXlsaXN0fSBwbGF5bGlzdCB0aGUgcGxheWxpc3QgdGhpcyBwbGF5ZXIgbWFuYWdlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2ZmdFNpemU9MTAyNF0gdGhlIHNpemUgb2YgdGhlIGZmdCB3aW5kb3cgZm9yIGFuYWx5c2lzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBsYXlsaXN0LCBmZnRTaXplID0gMTAyNCkge1xuICAgICAgICBzdXBlcihwbGF5bGlzdCk7XG4gICAgICAgIHRoaXMuI2ZmdFNpemUgPSBmZnRTaXplO1xuICAgICAgICB0aGlzLiN2aXN1YWxpemVyVXBkYXRlTWFuYWdlciA9IG5ldyBWaXN1YWxpemVyVXBkYXRlTWFuYWdlcih0aGlzLmdldEN1cnJlbnRNdXNpY1Zpc3VhbGl6ZXIoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGhlIHBsYXlsaXN0LlxuICAgICAqL1xuICAgIHNldCBwbGF5bGlzdChwbGF5bGlzdCkge1xuICAgICAgICBzdXBlci5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgICAgICB0aGlzLiN2aXN1YWxpemVyVXBkYXRlTWFuYWdlciA9IG5ldyBWaXN1YWxpemVyVXBkYXRlTWFuYWdlcih0aGlzLmdldEN1cnJlbnRNdXNpY1Zpc3VhbGl6ZXIoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgc3VjY2Vzc2Z1bCBpbiBjaGFuZ2luZyB0byB0aGUgbmV4dCBtdXNpYy5cbiAgICAgKi9cbiAgICBuZXh0KCkge1xuICAgICAgICBjb25zdCB1cGRhdGVMaXN0ZW5lcnMgPSB0aGlzLiN2aXN1YWxpemVyVXBkYXRlTWFuYWdlci5nZXRCaW5uZWRMaXN0ZW5lcnMoKTtcbiAgICAgICAgaWYgKCFzdXBlci5uZXh0KCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy4jdmlzdWFsaXplclVwZGF0ZU1hbmFnZXIgPSBuZXcgVmlzdWFsaXplclVwZGF0ZU1hbmFnZXIodGhpcy5nZXRDdXJyZW50TXVzaWNWaXN1YWxpemVyKCkpO1xuICAgICAgICB0aGlzLiN2aXN1YWxpemVyVXBkYXRlTWFuYWdlci5zZXRCaW5uZWRMaXN0ZW5lcnModXBkYXRlTGlzdGVuZXJzKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSnVtcHMgdG8gdGhlIHByZXZpb3VzIG11c2ljIGlmIHBvc3NpYmxlLlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHN1Y2Nlc3NmdWwgaW4gc3dpdGNoaW5nIHRvIHRoZSBwcmV2aW91cyBtdXNpYyBpbiB0aGUgcGxheWxpc3QuXG4gICAgICovXG4gICAgcHJldmlvdXMoKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZUxpc3RlbmVycyA9IHRoaXMuI3Zpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyLmdldEJpbm5lZExpc3RlbmVycygpO1xuICAgICAgICBpZiAoIXN1cGVyLnByZXZpb3VzKCkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0aGlzLiN2aXN1YWxpemVyVXBkYXRlTWFuYWdlciA9IG5ldyBWaXN1YWxpemVyVXBkYXRlTWFuYWdlcih0aGlzLmdldEN1cnJlbnRNdXNpY1Zpc3VhbGl6ZXIoKSk7XG4gICAgICAgIHRoaXMuI3Zpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyLnNldEJpbm5lZExpc3RlbmVycyh1cGRhdGVMaXN0ZW5lcnMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBtdXNpYyB0byBjaGFuZ2UgdG8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgc3VjY2Vzc2Z1bCBpbiBqdW1waW5nIHRvIHRoZSBnaXZlbiBpbmRleC5cbiAgICAgKi9cbiAgICBjaGFuZ2VDdXJyZW50KGluZGV4KSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZUxpc3RlbmVycyA9IHRoaXMuVmlzdWFsaXplclVwZGF0ZU1hbmFnZXIuZ2V0QmlubmVkTGlzdGVuZXJzKCk7XG4gICAgICAgIGlmICghc3VwZXIuY2hhbmdlQ3VycmVudChpbmRleCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy4jdmlzdWFsaXplclVwZGF0ZU1hbmFnZXIgPSBuZXcgVmlzdWFsaXplclVwZGF0ZU1hbmFnZXIodGhpcy5nZXRDdXJyZW50TXVzaWNWaXN1YWxpemVyKCkpO1xuICAgICAgICB0aGlzLiN2aXN1YWxpemVyVXBkYXRlTWFuYWdlci5zZXRCaW5uZWRMaXN0ZW5lcnMgPSB1cGRhdGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge1Zpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyfSBUaGUgY3VycmVudCB2aXN1YWxpemVyIHVwZGF0ZSBtYW5hZ2VyLlxuICAgICAqL1xuICAgIGdldCBjdXJyZW50VmlzdWFsaXplclVwZGF0ZU1hbmFnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2aXN1YWxpemVyVXBkYXRlTWFuYWdlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtWaXN1YWxpemVyfSBUaGUgY3VycmVudCBtdXNpYydzIHZpc3VhbGl6ZXIuXG4gICAgICovXG4gICAgZ2V0IGN1cnJlbnRNdXNpY1Zpc3VhbGl6ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnRNdXNpYygpLmdldFZpc3VhbGl6ZXIoKTtcbiAgICB9XG59Il0sIm5hbWVzIjpbIlZpc3VhbGl6ZXIiLCJWaXN1YWxpemVyVXBkYXRlTWFuYWdlciIsIk11c2ljUGxheWVyIiwiTXVzaWNQbGF5bGlzdCIsIlZpc3VhbGl6ZWRNdXNpY1BsYXllciIsInBsYXlsaXN0IiwiZmZ0U2l6ZSIsImdldEN1cnJlbnRNdXNpY1Zpc3VhbGl6ZXIiLCJ1cGRhdGVMaXN0ZW5lcnMiLCJnZXRCaW5uZWRMaXN0ZW5lcnMiLCJzZXRCaW5uZWRMaXN0ZW5lcnMiLCJpbmRleCIsImdldEN1cnJlbnRNdXNpYyIsImdldFZpc3VhbGl6ZXIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/player/VisualizedMusicPlayer.js\n"); + +/***/ }), + +/***/ "./src/player/player.js": +/*!******************************!*\ + !*** ./src/player/player.js ***! + \******************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Music\": () => (/* reexport safe */ _Music_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */ \"MusicPlayer\": () => (/* reexport safe */ _MusicPlayer_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ \"MusicPlaylist\": () => (/* reexport safe */ _MusicPlaylist_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]),\n/* harmony export */ \"VisualizedMusicPlayer\": () => (/* reexport safe */ _VisualizedMusicPlayer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _MusicPlayer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MusicPlayer.js */ \"./src/player/MusicPlayer.js\");\n/* harmony import */ var _MusicPlaylist_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./MusicPlaylist.js */ \"./src/player/MusicPlaylist.js\");\n/* harmony import */ var _VisualizedMusicPlayer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./VisualizedMusicPlayer.js */ \"./src/player/VisualizedMusicPlayer.js\");\n/* harmony import */ var _Music_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Music.js */ \"./src/player/Music.js\");\n\n\n\n\n/**@module */\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGxheWVyL3BsYXllci5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hdWRpb3Nob3draXQvLi9zcmMvcGxheWVyL3BsYXllci5qcz80YmIwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNdXNpY1BsYXllciBmcm9tIFwiLi9NdXNpY1BsYXllci5qc1wiO1xuaW1wb3J0IE11c2ljUGxheWxpc3QgZnJvbSBcIi4vTXVzaWNQbGF5bGlzdC5qc1wiO1xuaW1wb3J0IFZpc3VhbGl6ZWRNdXNpY1BsYXllciBmcm9tIFwiLi9WaXN1YWxpemVkTXVzaWNQbGF5ZXIuanNcIjtcbmltcG9ydCBNdXNpYyBmcm9tIFwiLi9NdXNpYy5qc1wiO1xuXG4vKipAbW9kdWxlICovXG5leHBvcnQgeyBNdXNpY1BsYXllciwgTXVzaWNQbGF5bGlzdCwgVmlzdWFsaXplZE11c2ljUGxheWVyLCBNdXNpYyB9OyJdLCJuYW1lcyI6WyJNdXNpY1BsYXllciIsIk11c2ljUGxheWxpc3QiLCJWaXN1YWxpemVkTXVzaWNQbGF5ZXIiLCJNdXNpYyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/player/player.js\n"); + +/***/ }), + +/***/ "./src/support/colors.js": +/*!*******************************!*\ + !*** ./src/support/colors.js ***! + \*******************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"cssRgbToRgba\": () => (/* binding */ cssRgbToRgba),\n/* harmony export */ \"cssRgbaToRgba\": () => (/* binding */ cssRgbaToRgba),\n/* harmony export */ \"parseColor\": () => (/* binding */ parseColor),\n/* harmony export */ \"rgbHexToRgba\": () => (/* binding */ rgbHexToRgba),\n/* harmony export */ \"rgbaHexToRgba\": () => (/* binding */ rgbaHexToRgba),\n/* harmony export */ \"rgbaToHexRgba\": () => (/* binding */ rgbaToHexRgba)\n/* harmony export */ });\n/**\n * Converts from rgba hex value to an array of four numbers representing r, g, b, and a respectively.\n * \n * @param {string} hex the hex value.\n * @returns {number[]} the resulting components of the hex value.\n */\nfunction rgbaHexToRgba(hex) {\n if (hex.startsWith(\"#\")) {\n hex = hex.substring(1);\n\n if (hex.length > 8) {\n throw new Error(\"Invalid hex syntax (length).\");\n }\n } else {\n throw new Error(\"Invalid hex syntax (missing pound).\");\n }\n\n for (var i = hex.length; i < 8; i++) {\n hex = \"0\" + hex;\n }\n\n var remaining = hex.length;\n var result = [0, 0, 0, 0];\n result[3] = parseInt(hex.substring(remaining -= 2, remaining + 2), 16);\n result[2] = parseInt(hex.substring(remaining -= 2, remaining + 2), 16);\n result[1] = parseInt(hex.substring(remaining -= 2, remaining + 2), 16);\n result[0] = parseInt(hex.substring(remaining -= 2, remaining + 2), 16);\n return result;\n}\n/**\n * \n * @param {string} hex the hex value.\n * @returns {number[]} the resulting r, g, and b components.\n */\n\n\nfunction rgbHexToRgba(hex) {\n var result = rgbaHexToRgba(hex + \"FF\");\n return result;\n}\n/**\n * Converts from the CSS rgba call to an array of four numbers representing r, g, b and a.\n * \n * @param {string} rgba The CSS rgba(r,g,b,a) call.\n * @returns {number[]} the rgba components.\n */\n\n\nfunction cssRgbaToRgba(rgba) {\n var cssRgbaRegex = /rgba\\((\\d+),(\\d+),(\\d+),(\\d+)\\)/;\n\n try {\n var matches = rgba.match(cssRgbaRegex);\n return [parseInt(matches[1]), parseInt(matches[2]), parseInt(matches[3]), parseInt(matches[4])];\n } catch (error) {\n throw new Error(\"Could not parse the given css rgba function call: \" + error.message);\n }\n}\n/**\n * Converts from the CSS rgb call to an array of four numbers representing r, g, b and a.\n * \n * @param {string} rgb The CSS rgb(r,g,b) call.\n * @returns {number[]} the rgba components.\n */\n\n\nfunction cssRgbToRgba(rgb) {\n var cssRgbRegex = /rgb\\((\\d+),(\\d+),(\\d+)\\)/;\n\n try {\n var matches = rgb.match(cssRgbRegex);\n return [parseInt(matches[1]), parseInt(matches[2]), parseInt(matches[3]), 255];\n } catch (error) {\n throw new Error(\"Could not parse the given css rgb function call: \" + error.message);\n }\n}\n/**\n * Converts a given array of r, g, b, and a components into a hex string.\n * \n * @param {number[]} rgba an array with red, green, blue, and alpha components in that order.\n * @returns {string} The resulting hex value.\n */\n\n\nfunction rgbaToHexRgba(rgba) {\n var filler = function filler(hex) {\n return hex.length < 2 ? \"0\" + hex : hex;\n };\n\n return \"#\" + filler(rgba[0].toString(16)) + filler(rgba[1].toString(16)) + filler(rgba[2].toString(16)) + filler(rgba[3].toString(16));\n}\n/**\n * Converts a css rgb, rgba, hex, or rgba hex to a rgba array.\n * \n * For hex, we assume there is no alpha channel unless the hex value is not minimized.\n * \n * @param {string} color The string that contains the color information.\n * @returns {number[]} an array that contains the r, g, b and a components.\n */\n\n\nfunction parseColor(color) {\n if (color.startsWith(\"rgba(\")) {\n return cssRgbaToRgba(color);\n } else if (color.startsWith(\"rgb(\")) {\n return cssRgbToRgba(color);\n } else if (color.startsWith(\"#\")) {\n if (color.length === 9) {\n return rgbaHexToRgba(color);\n } else {\n return rgbHexToRgba(color);\n }\n }\n\n throw new Error(\"Could not parse to an rgba value.\");\n}\n/**@module */\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNBO0FBQ0E7OztBQUNBLFNBQVNDLFVBQVQsQ0FBb0JDLEtBQXBCLEVBQTJCO0FBQ3ZCLE1BQUlBLEtBQUssQ0FBQ3ZCLFVBQU4sQ0FBaUIsT0FBakIsQ0FBSixFQUErQjtBQUMzQixXQUFPUyxhQUFhLENBQUNjLEtBQUQsQ0FBcEI7QUFDSCxHQUZELE1BRU8sSUFBSUEsS0FBSyxDQUFDdkIsVUFBTixDQUFpQixNQUFqQixDQUFKLEVBQThCO0FBQ2pDLFdBQU9nQixZQUFZLENBQUNPLEtBQUQsQ0FBbkI7QUFDSCxHQUZNLE1BRUEsSUFBSUEsS0FBSyxDQUFDdkIsVUFBTixDQUFpQixHQUFqQixDQUFKLEVBQTJCO0FBQzlCLFFBQUl1QixLQUFLLENBQUNyQixNQUFOLEtBQWlCLENBQXJCLEVBQXdCO0FBQ3BCLGFBQU9KLGFBQWEsQ0FBQ3lCLEtBQUQsQ0FBcEI7QUFDSCxLQUZELE1BRU87QUFDSCxhQUFPZixZQUFZLENBQUNlLEtBQUQsQ0FBbkI7QUFDSDtBQUNKOztBQUNELFFBQU0sSUFBSXBCLEtBQUosQ0FBVSxtQ0FBVixDQUFOO0FBQ0g7QUFFRCIsInNvdXJjZXMiOlsid2VicGFjazovL2F1ZGlvc2hvd2tpdC8uL3NyYy9zdXBwb3J0L2NvbG9ycy5qcz8zZDVkIl0sInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBDb252ZXJ0cyBmcm9tIHJnYmEgaGV4IHZhbHVlIHRvIGFuIGFycmF5IG9mIGZvdXIgbnVtYmVycyByZXByZXNlbnRpbmcgciwgZywgYiwgYW5kIGEgcmVzcGVjdGl2ZWx5LlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gaGV4IHRoZSBoZXggdmFsdWUuXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IHRoZSByZXN1bHRpbmcgY29tcG9uZW50cyBvZiB0aGUgaGV4IHZhbHVlLlxuICovXG5mdW5jdGlvbiByZ2JhSGV4VG9SZ2JhKGhleCkge1xuICAgIGlmIChoZXguc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgICAgaGV4ID0gaGV4LnN1YnN0cmluZygxKTtcbiAgICAgICAgaWYgKGhleC5sZW5ndGggPiA4KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGhleCBzeW50YXggKGxlbmd0aCkuXCIpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBoZXggc3ludGF4IChtaXNzaW5nIHBvdW5kKS5cIik7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBoZXgubGVuZ3RoOyBpIDwgODsgaSsrKSB7XG4gICAgICAgIGhleCA9IFwiMFwiICsgaGV4O1xuICAgIH1cbiAgICBsZXQgcmVtYWluaW5nID0gaGV4Lmxlbmd0aDtcbiAgICBsZXQgcmVzdWx0ID0gWzAsIDAsIDAsIDBdO1xuICAgIHJlc3VsdFszXSA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcocmVtYWluaW5nIC09IDIsIHJlbWFpbmluZyArIDIpLCAxNik7XG4gICAgcmVzdWx0WzJdID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyhyZW1haW5pbmcgLT0gMiwgcmVtYWluaW5nICsgMiksIDE2KTtcbiAgICByZXN1bHRbMV0gPSBwYXJzZUludChoZXguc3Vic3RyaW5nKHJlbWFpbmluZyAtPSAyLCByZW1haW5pbmcgKyAyKSwgMTYpO1xuICAgIHJlc3VsdFswXSA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcocmVtYWluaW5nIC09IDIsIHJlbWFpbmluZyArIDIpLCAxNik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSBoZXggdGhlIGhleCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtudW1iZXJbXX0gdGhlIHJlc3VsdGluZyByLCBnLCBhbmQgYiBjb21wb25lbnRzLlxuICovXG5mdW5jdGlvbiByZ2JIZXhUb1JnYmEoaGV4KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmdiYUhleFRvUmdiYShoZXggKyBcIkZGXCIpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgZnJvbSB0aGUgQ1NTIHJnYmEgY2FsbCB0byBhbiBhcnJheSBvZiBmb3VyIG51bWJlcnMgcmVwcmVzZW50aW5nIHIsIGcsIGIgYW5kIGEuXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nfSByZ2JhIFRoZSBDU1MgcmdiYShyLGcsYixhKSBjYWxsLlxuICogQHJldHVybnMge251bWJlcltdfSB0aGUgcmdiYSBjb21wb25lbnRzLlxuICovXG5mdW5jdGlvbiBjc3NSZ2JhVG9SZ2JhKHJnYmEpIHtcbiAgICBjb25zdCBjc3NSZ2JhUmVnZXggPSAvcmdiYVxcKChcXGQrKSwoXFxkKyksKFxcZCspLChcXGQrKVxcKS87XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHJnYmEubWF0Y2goY3NzUmdiYVJlZ2V4KTtcbiAgICAgICAgcmV0dXJuIFtwYXJzZUludChtYXRjaGVzWzFdKSwgcGFyc2VJbnQobWF0Y2hlc1syXSksIHBhcnNlSW50KG1hdGNoZXNbM10pLCBwYXJzZUludChtYXRjaGVzWzRdKV07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IHBhcnNlIHRoZSBnaXZlbiBjc3MgcmdiYSBmdW5jdGlvbiBjYWxsOiBcIiArIGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBmcm9tIHRoZSBDU1MgcmdiIGNhbGwgdG8gYW4gYXJyYXkgb2YgZm91ciBudW1iZXJzIHJlcHJlc2VudGluZyByLCBnLCBiIGFuZCBhLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gcmdiIFRoZSBDU1MgcmdiKHIsZyxiKSBjYWxsLlxuICogQHJldHVybnMge251bWJlcltdfSB0aGUgcmdiYSBjb21wb25lbnRzLlxuICovXG5mdW5jdGlvbiBjc3NSZ2JUb1JnYmEocmdiKSB7XG4gICAgY29uc3QgY3NzUmdiUmVnZXggPSAvcmdiXFwoKFxcZCspLChcXGQrKSwoXFxkKylcXCkvO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSByZ2IubWF0Y2goY3NzUmdiUmVnZXgpO1xuICAgICAgICByZXR1cm4gW3BhcnNlSW50KG1hdGNoZXNbMV0pLCBwYXJzZUludChtYXRjaGVzWzJdKSwgcGFyc2VJbnQobWF0Y2hlc1szXSksIDI1NV07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IHBhcnNlIHRoZSBnaXZlbiBjc3MgcmdiIGZ1bmN0aW9uIGNhbGw6IFwiICsgZXJyb3IubWVzc2FnZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgZ2l2ZW4gYXJyYXkgb2YgciwgZywgYiwgYW5kIGEgY29tcG9uZW50cyBpbnRvIGEgaGV4IHN0cmluZy5cbiAqIFxuICogQHBhcmFtIHtudW1iZXJbXX0gcmdiYSBhbiBhcnJheSB3aXRoIHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSBjb21wb25lbnRzIGluIHRoYXQgb3JkZXIuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcmVzdWx0aW5nIGhleCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmdiYVRvSGV4UmdiYShyZ2JhKSB7XG4gICAgY29uc3QgZmlsbGVyID0gKGhleCkgPT4gaGV4Lmxlbmd0aCA8IDIgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgICByZXR1cm4gXCIjXCIgKyBmaWxsZXIocmdiYVswXS50b1N0cmluZygxNikpICsgZmlsbGVyKHJnYmFbMV0udG9TdHJpbmcoMTYpKSArIGZpbGxlcihyZ2JhWzJdLnRvU3RyaW5nKDE2KSkgKyBmaWxsZXIocmdiYVszXS50b1N0cmluZygxNikpO1xufVxuXG5cbi8qKlxuICogQ29udmVydHMgYSBjc3MgcmdiLCByZ2JhLCBoZXgsIG9yIHJnYmEgaGV4IHRvIGEgcmdiYSBhcnJheS5cbiAqIFxuICogRm9yIGhleCwgd2UgYXNzdW1lIHRoZXJlIGlzIG5vIGFscGhhIGNoYW5uZWwgdW5sZXNzIHRoZSBoZXggdmFsdWUgaXMgbm90IG1pbmltaXplZC5cbiAqIFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIFRoZSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgY29sb3IgaW5mb3JtYXRpb24uXG4gKiBAcmV0dXJucyB7bnVtYmVyW119IGFuIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHIsIGcsIGIgYW5kIGEgY29tcG9uZW50cy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb2xvcihjb2xvcikge1xuICAgIGlmIChjb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICAgICAgcmV0dXJuIGNzc1JnYmFUb1JnYmEoY29sb3IpO1xuICAgIH0gZWxzZSBpZiAoY29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICAgICAgcmV0dXJuIGNzc1JnYlRvUmdiYShjb2xvcik7XG4gICAgfSBlbHNlIGlmIChjb2xvci5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgICBpZiAoY29sb3IubGVuZ3RoID09PSA5KSB7XG4gICAgICAgICAgICByZXR1cm4gcmdiYUhleFRvUmdiYShjb2xvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmdiSGV4VG9SZ2JhKGNvbG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgcGFyc2UgdG8gYW4gcmdiYSB2YWx1ZS5cIik7XG59XG5cbi8qKkBtb2R1bGUgKi9cbmV4cG9ydCB7IHJnYmFIZXhUb1JnYmEsIHJnYkhleFRvUmdiYSwgY3NzUmdiYVRvUmdiYSwgY3NzUmdiVG9SZ2JhLCByZ2JhVG9IZXhSZ2JhLCBwYXJzZUNvbG9yIH07Il0sIm5hbWVzIjpbInJnYmFIZXhUb1JnYmEiLCJoZXgiLCJzdGFydHNXaXRoIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiRXJyb3IiLCJpIiwicmVtYWluaW5nIiwicmVzdWx0IiwicGFyc2VJbnQiLCJyZ2JIZXhUb1JnYmEiLCJjc3NSZ2JhVG9SZ2JhIiwicmdiYSIsImNzc1JnYmFSZWdleCIsIm1hdGNoZXMiLCJtYXRjaCIsImVycm9yIiwibWVzc2FnZSIsImNzc1JnYlRvUmdiYSIsInJnYiIsImNzc1JnYlJlZ2V4IiwicmdiYVRvSGV4UmdiYSIsImZpbGxlciIsInRvU3RyaW5nIiwicGFyc2VDb2xvciIsImNvbG9yIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/support/colors.js\n"); + +/***/ }), + +/***/ "./src/support/easings.js": +/*!********************************!*\ + !*** ./src/support/easings.js ***! + \********************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createEaseLinear\": () => (/* binding */ createEaseLinear)\n/* harmony export */ });\n/**\n * @callback interpolator\n * @param {number} current the current value.\n * @param {number} dest the destination value.\n * @param {number} frameDelta the time elapsed since the last update.\n * @returns {number} the new current value.\n */\n// TODO: Add some interpolation functions.\n\n/**\n * \n * @param {number} rate the number of frequency values to shift by per second.\n * @returns {interpolator} the interpolation function with the given rate.\n */\nfunction createEaseLinear(rate) {\n return function (current, dest, frameDelta) {\n var direction = 1;\n\n if (dest < current) {\n direction = -1;\n }\n\n return current + Math.min(rate * frameDelta, dest) * direction;\n };\n}\n/**@module */\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3VwcG9ydC9lYXNpbmdzLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxnQkFBVCxDQUEwQkMsSUFBMUIsRUFBZ0M7QUFDNUIsU0FBTyxVQUFDQyxPQUFELEVBQVVDLElBQVYsRUFBZ0JDLFVBQWhCLEVBQStCO0FBQ2xDLFFBQUlDLFNBQVMsR0FBRyxDQUFoQjs7QUFDQSxRQUFJRixJQUFJLEdBQUdELE9BQVgsRUFBb0I7QUFDaEJHLE1BQUFBLFNBQVMsR0FBRyxDQUFDLENBQWI7QUFDSDs7QUFDRCxXQUFPSCxPQUFPLEdBQUlJLElBQUksQ0FBQ0MsR0FBTCxDQUFTTixJQUFJLEdBQUdHLFVBQWhCLEVBQTRCRCxJQUE1QixJQUFvQ0UsU0FBdEQ7QUFDSCxHQU5EO0FBT0g7QUFFRCIsInNvdXJjZXMiOlsid2VicGFjazovL2F1ZGlvc2hvd2tpdC8uL3NyYy9zdXBwb3J0L2Vhc2luZ3MuanM/MTFkMyJdLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGNhbGxiYWNrIGludGVycG9sYXRvclxuICogQHBhcmFtIHtudW1iZXJ9IGN1cnJlbnQgdGhlIGN1cnJlbnQgdmFsdWUuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVzdCB0aGUgZGVzdGluYXRpb24gdmFsdWUuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJhbWVEZWx0YSB0aGUgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBuZXcgY3VycmVudCB2YWx1ZS5cbiAqL1xuXG4vLyBUT0RPOiBBZGQgc29tZSBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9ucy5cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSB7bnVtYmVyfSByYXRlIHRoZSBudW1iZXIgb2YgZnJlcXVlbmN5IHZhbHVlcyB0byBzaGlmdCBieSBwZXIgc2Vjb25kLlxuICogQHJldHVybnMge2ludGVycG9sYXRvcn0gdGhlIGludGVycG9sYXRpb24gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmF0ZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWFzZUxpbmVhcihyYXRlKSB7XG4gICAgcmV0dXJuIChjdXJyZW50LCBkZXN0LCBmcmFtZURlbHRhKSA9PiB7XG4gICAgICAgIGxldCBkaXJlY3Rpb24gPSAxO1xuICAgICAgICBpZiAoZGVzdCA8IGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjdXJyZW50ICsgKE1hdGgubWluKHJhdGUgKiBmcmFtZURlbHRhLCBkZXN0KSAqIGRpcmVjdGlvbik7XG4gICAgfTtcbn1cblxuLyoqQG1vZHVsZSAqL1xuZXhwb3J0IHsgY3JlYXRlRWFzZUxpbmVhciB9OyJdLCJuYW1lcyI6WyJjcmVhdGVFYXNlTGluZWFyIiwicmF0ZSIsImN1cnJlbnQiLCJkZXN0IiwiZnJhbWVEZWx0YSIsImRpcmVjdGlvbiIsIk1hdGgiLCJtaW4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/support/easings.js\n"); + +/***/ }), + +/***/ "./src/support/support.js": +/*!********************************!*\ + !*** ./src/support/support.js ***! + \********************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"colors\": () => (/* reexport module object */ _colors_js__WEBPACK_IMPORTED_MODULE_0__),\n/* harmony export */ \"easings\": () => (/* reexport module object */ _easings_js__WEBPACK_IMPORTED_MODULE_1__)\n/* harmony export */ });\n/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colors.js */ \"./src/support/colors.js\");\n/* harmony import */ var _easings_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./easings.js */ \"./src/support/easings.js\");\n\n\n/**@module */\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3VwcG9ydC9zdXBwb3J0LmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hdWRpb3Nob3draXQvLi9zcmMvc3VwcG9ydC9zdXBwb3J0LmpzPzgzMjYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29sb3JzIGZyb20gXCIuL2NvbG9ycy5qc1wiO1xuaW1wb3J0ICogYXMgZWFzaW5ncyBmcm9tIFwiLi9lYXNpbmdzLmpzXCI7XG5cbi8qKkBtb2R1bGUgKi9cbmV4cG9ydCB7IGNvbG9ycywgZWFzaW5ncyB9OyJdLCJuYW1lcyI6WyJjb2xvcnMiLCJlYXNpbmdzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/support/support.js\n"); + +/***/ }), + +/***/ "./src/visualization/Visualizer.js": +/*!*****************************************!*\ + !*** ./src/visualization/Visualizer.js ***! + \*****************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Visualizer)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\n\nfunction _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); } }\n\nfunction _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n\nfunction _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n\nfunction _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }\n\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n\nfunction _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError(\"attempted to set read only private field\"); } descriptor.value = value; } }\n\nvar _stream = /*#__PURE__*/new WeakMap();\n\nvar _analyzing = /*#__PURE__*/new WeakMap();\n\nvar _updateListeners = /*#__PURE__*/new WeakMap();\n\nvar _audioCtx = /*#__PURE__*/new WeakMap();\n\nvar _source = /*#__PURE__*/new WeakMap();\n\nvar _analyzer = /*#__PURE__*/new WeakMap();\n\nvar _buffer = /*#__PURE__*/new WeakMap();\n\nvar _lastUpdate = /*#__PURE__*/new WeakMap();\n\n/**@module */\n\n/**\n * @callback visualizerUpdateListener\n * @param {number} delta elapsed time since last update.\n * @param {Uint8Array} bins the bins with varying frequency values. \n */\n\n/**\n * Provides a simplified access point to the frequency bins in the form of a visualization update listener.\n */\nvar Visualizer = /*#__PURE__*/function () {\n /**\n * \n * @param {MediaSource|HTMLMediaElement} mediaSource a media source to analyze.\n * @param {number} [fftSize = 1024] the size of the fft window.\n */\n function Visualizer(mediaSource) {\n var fftSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1024;\n\n _classCallCheck(this, Visualizer);\n\n _classPrivateFieldInitSpec(this, _stream, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _analyzing, {\n writable: true,\n value: false\n });\n\n _classPrivateFieldInitSpec(this, _updateListeners, {\n writable: true,\n value: []\n });\n\n _classPrivateFieldInitSpec(this, _audioCtx, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _source, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _analyzer, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _buffer, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _lastUpdate, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldSet(this, _stream, mediaSource);\n\n _classPrivateFieldSet(this, _analyzing, false);\n\n _classPrivateFieldSet(this, _updateListeners, []);\n\n _classPrivateFieldSet(this, _audioCtx, new window.AudioContext());\n\n if (mediaSource instanceof HTMLMediaElement) {\n _classPrivateFieldSet(this, _source, _classPrivateFieldGet(this, _audioCtx).createMediaElementSource(_classPrivateFieldGet(this, _stream)));\n } else {\n _classPrivateFieldSet(this, _source, _classPrivateFieldGet(this, _audioCtx).createMediaStreamSource(_classPrivateFieldGet(this, _stream)));\n }\n\n _classPrivateFieldSet(this, _analyzer, _classPrivateFieldGet(this, _audioCtx).createAnalyser());\n\n _classPrivateFieldGet(this, _analyzer).fftSize = fftSize;\n\n _classPrivateFieldSet(this, _buffer, new Uint8Array(_classPrivateFieldGet(this, _analyzer).frequencyBinCount));\n\n _classPrivateFieldGet(this, _source).connect(_classPrivateFieldGet(this, _analyzer));\n\n _classPrivateFieldGet(this, _analyzer).connect(_classPrivateFieldGet(this, _audioCtx).destination);\n\n _classPrivateFieldSet(this, _lastUpdate, null);\n }\n /**\n * Begins analyzing and sending out update pings.\n */\n\n\n _createClass(Visualizer, [{\n key: \"analyze\",\n value: function analyze() {\n if (_classPrivateFieldGet(this, _analyzing)) {\n return;\n }\n\n _classPrivateFieldSet(this, _analyzing, true);\n\n var self = this; // since calling from requestAnimationFrame means \"this\" is no longer set to produced object.\n\n var update = function update(timestamp) {\n if (!_classPrivateFieldGet(self, _analyzing)) return;\n\n if (!_classPrivateFieldGet(self, _lastUpdate)) {\n _classPrivateFieldSet(self, _lastUpdate, timestamp);\n }\n\n var delta = timestamp - _classPrivateFieldGet(self, _lastUpdate);\n\n _classPrivateFieldGet(self, _analyzer).getByteFrequencyData(_classPrivateFieldGet(self, _buffer));\n\n _classPrivateFieldGet(self, _updateListeners).forEach(function (listener) {\n listener(delta, _classPrivateFieldGet(self, _buffer));\n });\n\n requestAnimationFrame(update);\n };\n\n requestAnimationFrame(update);\n }\n /**\n * Stops the analysis. Listeners will stop receiving bins.\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n _classPrivateFieldSet(this, _analyzing, false);\n }\n /**\n * \n * @param {visualizerUpdateListener} listener the visualizer update listener to be registered.\n * @returns {boolean} true if and only if the listener was successfully added.\n */\n\n }, {\n key: \"addUpdateListener\",\n value: function addUpdateListener(listener) {\n if (_classPrivateFieldGet(this, _updateListeners).includes(listener)) ;\n\n _classPrivateFieldGet(this, _updateListeners).push(listener);\n\n return true;\n }\n /**\n * \n * @param {visualizerUpdateListener} listener the visualizer update listener to remove.\n * @returns {boolean} true if and only if the removal of the listener was a success.\n */\n\n }, {\n key: \"removeUpdateListener\",\n value: function removeUpdateListener(listener) {\n var removeIndex = _classPrivateFieldGet(this, _updateListeners).indexOf(listener);\n\n if (removeIndex < 0) return false;\n\n _classPrivateFieldGet(this, _updateListeners).splice(removeIndex, 1);\n\n return true;\n }\n /**\n * @returns {number} The number of bins based on the size of the FFT window.\n */\n\n }, {\n key: \"numberOfBins\",\n get: function get() {\n return _classPrivateFieldGet(this, _buffer).length;\n }\n /**\n * \n * @returns {number} The fft window size.\n */\n\n }, {\n key: \"fftSize\",\n get: function get() {\n return _classPrivateFieldGet(this, _analyzer).fftSize;\n }\n }]);\n\n return Visualizer;\n}();\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU8sS0FBUDs7QUFFckIsb0RBQXNCRSxNQUF0QixDQUE2QkYsV0FBN0IsRUFBMEMsQ0FBMUM7O0FBQ0EsYUFBTyxJQUFQO0FBQ0g7QUFHRDtBQUNKO0FBQ0E7Ozs7U0FDSSxlQUFtQjtBQUNmLGFBQU8scUNBQWFHLE1BQXBCO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTs7OztTQUNJLGVBQWM7QUFDVixhQUFPLHVDQUFleEIsT0FBdEI7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovL2F1ZGlvc2hvd2tpdC8uL3NyYy92aXN1YWxpemF0aW9uL1Zpc3VhbGl6ZXIuanM/ZGE0YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipAbW9kdWxlICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHZpc3VhbGl6ZXJVcGRhdGVMaXN0ZW5lclxuICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhIGVsYXBzZWQgdGltZSBzaW5jZSBsYXN0IHVwZGF0ZS5cbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYmlucyB0aGUgYmlucyB3aXRoIHZhcnlpbmcgZnJlcXVlbmN5IHZhbHVlcy4gXG4gKi9cblxuLyoqXG4gKiBQcm92aWRlcyBhIHNpbXBsaWZpZWQgYWNjZXNzIHBvaW50IHRvIHRoZSBmcmVxdWVuY3kgYmlucyBpbiB0aGUgZm9ybSBvZiBhIHZpc3VhbGl6YXRpb24gdXBkYXRlIGxpc3RlbmVyLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaXN1YWxpemVyIHtcbiAgICAjc3RyZWFtO1xuICAgICNhbmFseXppbmcgPSBmYWxzZTtcbiAgICAjdXBkYXRlTGlzdGVuZXJzID0gW107XG4gICAgI2F1ZGlvQ3R4O1xuICAgICNzb3VyY2U7XG4gICAgI2FuYWx5emVyO1xuICAgICNidWZmZXI7XG4gICAgI2xhc3RVcGRhdGU7XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge01lZGlhU291cmNlfEhUTUxNZWRpYUVsZW1lbnR9IG1lZGlhU291cmNlIGEgbWVkaWEgc291cmNlIHRvIGFuYWx5emUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmZnRTaXplID0gMTAyNF0gdGhlIHNpemUgb2YgdGhlIGZmdCB3aW5kb3cuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVkaWFTb3VyY2UsIGZmdFNpemUgPSAxMDI0KSB7XG4gICAgICAgIHRoaXMuI3N0cmVhbSA9IG1lZGlhU291cmNlO1xuICAgICAgICB0aGlzLiNhbmFseXppbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jdXBkYXRlTGlzdGVuZXJzID0gW107XG4gICAgICAgIHRoaXMuI2F1ZGlvQ3R4ID0gbmV3IHdpbmRvdy5BdWRpb0NvbnRleHQoKTtcbiAgICAgICAgaWYgKG1lZGlhU291cmNlIGluc3RhbmNlb2YgSFRNTE1lZGlhRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy4jc291cmNlID0gdGhpcy4jYXVkaW9DdHguY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKHRoaXMuI3N0cmVhbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNzb3VyY2UgPSB0aGlzLiNhdWRpb0N0eC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZSh0aGlzLiNzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2FuYWx5emVyID0gdGhpcy4jYXVkaW9DdHguY3JlYXRlQW5hbHlzZXIoKTtcbiAgICAgICAgdGhpcy4jYW5hbHl6ZXIuZmZ0U2l6ZSA9IGZmdFNpemU7XG4gICAgICAgIHRoaXMuI2J1ZmZlciA9IG5ldyBVaW50OEFycmF5KHRoaXMuI2FuYWx5emVyLmZyZXF1ZW5jeUJpbkNvdW50KTtcbiAgICAgICAgdGhpcy4jc291cmNlLmNvbm5lY3QodGhpcy4jYW5hbHl6ZXIpO1xuICAgICAgICB0aGlzLiNhbmFseXplci5jb25uZWN0KHRoaXMuI2F1ZGlvQ3R4LmRlc3RpbmF0aW9uKTtcblxuICAgICAgICB0aGlzLiNsYXN0VXBkYXRlID0gbnVsbDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEJlZ2lucyBhbmFseXppbmcgYW5kIHNlbmRpbmcgb3V0IHVwZGF0ZSBwaW5ncy5cbiAgICAgKi9cbiAgICBhbmFseXplKCkge1xuICAgICAgICBpZiAodGhpcy4jYW5hbHl6aW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jYW5hbHl6aW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzOyAvLyBzaW5jZSBjYWxsaW5nIGZyb20gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIG1lYW5zIFwidGhpc1wiIGlzIG5vIGxvbmdlciBzZXQgdG8gcHJvZHVjZWQgb2JqZWN0LlxuICAgICAgICBjb25zdCB1cGRhdGUgPSAodGltZXN0YW1wKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNlbGYuI2FuYWx5emluZykgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAoIXNlbGYuI2xhc3RVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICBzZWxmLiNsYXN0VXBkYXRlID0gdGltZXN0YW1wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGRlbHRhID0gdGltZXN0YW1wIC0gc2VsZi4jbGFzdFVwZGF0ZTtcbiAgICAgICAgICAgIHNlbGYuI2FuYWx5emVyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHNlbGYuI2J1ZmZlcik7XG5cbiAgICAgICAgICAgIHNlbGYuI3VwZGF0ZUxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcihkZWx0YSwgc2VsZi4jYnVmZmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3BzIHRoZSBhbmFseXNpcy4gTGlzdGVuZXJzIHdpbGwgc3RvcCByZWNlaXZpbmcgYmlucy5cbiAgICAgKi9cbiAgICBzdG9wKCkge1xuICAgICAgICB0aGlzLiNhbmFseXppbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge3Zpc3VhbGl6ZXJVcGRhdGVMaXN0ZW5lcn0gbGlzdGVuZXIgdGhlIHZpc3VhbGl6ZXIgdXBkYXRlIGxpc3RlbmVyIHRvIGJlIHJlZ2lzdGVyZWQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGxpc3RlbmVyIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQuXG4gICAgICovXG4gICAgYWRkVXBkYXRlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VwZGF0ZUxpc3RlbmVycy5pbmNsdWRlcyhsaXN0ZW5lcikpO1xuICAgICAgICB0aGlzLiN1cGRhdGVMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7dmlzdWFsaXplclVwZGF0ZUxpc3RlbmVyfSBsaXN0ZW5lciB0aGUgdmlzdWFsaXplciB1cGRhdGUgbGlzdGVuZXIgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSByZW1vdmFsIG9mIHRoZSBsaXN0ZW5lciB3YXMgYSBzdWNjZXNzLlxuICAgICAqL1xuICAgIHJlbW92ZVVwZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZUluZGV4ID0gdGhpcy4jdXBkYXRlTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAocmVtb3ZlSW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgdGhpcy4jdXBkYXRlTGlzdGVuZXJzLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBiaW5zIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBGRlQgd2luZG93LlxuICAgICAqL1xuICAgIGdldCBudW1iZXJPZkJpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNidWZmZXIubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBmZnQgd2luZG93IHNpemUuXG4gICAgICovXG4gICAgZ2V0IGZmdFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhbmFseXplci5mZnRTaXplO1xuICAgIH1cbn0iXSwibmFtZXMiOlsiVmlzdWFsaXplciIsIm1lZGlhU291cmNlIiwiZmZ0U2l6ZSIsIndpbmRvdyIsIkF1ZGlvQ29udGV4dCIsIkhUTUxNZWRpYUVsZW1lbnQiLCJjcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UiLCJjcmVhdGVNZWRpYVN0cmVhbVNvdXJjZSIsImNyZWF0ZUFuYWx5c2VyIiwiVWludDhBcnJheSIsImZyZXF1ZW5jeUJpbkNvdW50IiwiY29ubmVjdCIsImRlc3RpbmF0aW9uIiwic2VsZiIsInVwZGF0ZSIsInRpbWVzdGFtcCIsImRlbHRhIiwiZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEiLCJmb3JFYWNoIiwibGlzdGVuZXIiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJpbmNsdWRlcyIsInB1c2giLCJyZW1vdmVJbmRleCIsImluZGV4T2YiLCJzcGxpY2UiLCJsZW5ndGgiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/visualization/Visualizer.js\n"); + +/***/ }), + +/***/ "./src/visualization/VisualizerUpdateManager.js": +/*!******************************************************!*\ + !*** ./src/visualization/VisualizerUpdateManager.js ***! + \******************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ VisualizerUpdateManager)\n/* harmony export */ });\n/* harmony import */ var _Visualizer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Visualizer.js */ \"./src/visualization/Visualizer.js\");\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }\n\nfunction _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); } }\n\nfunction _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n\nfunction _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n\nfunction _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }\n\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n\nfunction _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError(\"attempted to set read only private field\"); } descriptor.value = value; } }\n\n\n/**@module */\n\n/**\n * @callback visualizerBinUpdateListener\n * @param {number} timeDelta elapsed time since last update.\n * @param {number} amplitude The amplitude of the associated bin.\n * @param {number} ampDelta change in amplitude of the frequency bin.\n */\n\n/**\n * @callback visualizerRangedUpdateListener\n * @param {number} timeDelta elapsed time since last update.\n * @param {number} bins the bins of the range.\n */\n\n/**\n * A visualizer update manager offers an extra layer of abstraction on top of the {@link Visualizer}'s update listener.\n * \n * Specifically, the update manager handles updates directly from the {@link Visualizer} and checks for changes in the individual bins. These changes are then broadcasted to the individual bin listeners.\n * In the rare event that a bin has not changed, then it will not receive an update call.\n */\n\nvar _binnedListeners = /*#__PURE__*/new WeakMap();\n\nvar _rangedListeners = /*#__PURE__*/new WeakMap();\n\nvar _lastBins = /*#__PURE__*/new WeakMap();\n\nvar _visualizer = /*#__PURE__*/new WeakMap();\n\nvar _visualizerListener = /*#__PURE__*/new WeakMap();\n\nvar VisualizerUpdateManager = /*#__PURE__*/function () {\n /**\n * \n * @param {Visualizer} visualizer the visualizer this manager obtains data from.\n */\n function VisualizerUpdateManager(visualizer) {\n var _this = this;\n\n _classCallCheck(this, VisualizerUpdateManager);\n\n _classPrivateFieldInitSpec(this, _binnedListeners, {\n writable: true,\n value: []\n });\n\n _classPrivateFieldInitSpec(this, _rangedListeners, {\n writable: true,\n value: []\n });\n\n _classPrivateFieldInitSpec(this, _lastBins, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _visualizer, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldInitSpec(this, _visualizerListener, {\n writable: true,\n value: void 0\n });\n\n _classPrivateFieldSet(this, _binnedListeners, []);\n\n _classPrivateFieldSet(this, _rangedListeners, []);\n\n for (var i = 0; i < visualizer.getNumberOfBins(); i++) {\n _classPrivateFieldGet(this, _binnedListeners).push([]);\n }\n\n _classPrivateFieldSet(this, _lastBins, new Uint8Array(_classPrivateFieldGet(this, _binnedListeners).length));\n\n _classPrivateFieldSet(this, _visualizer, visualizer);\n\n _classPrivateFieldSet(this, _visualizerListener, function (delta, bins) {\n var sortedCopyOfRangedListeners = _toConsumableArray(_classPrivateFieldGet(_this, _rangedListeners)); // We assume this is sorted properly. A priority queue could be better.\n\n\n var _loop = function _loop(binInd) {\n var lastBin = _classPrivateFieldGet(_this, _lastBins)[binInd];\n\n if (lastBin !== bins[binInd]) {\n _classPrivateFieldGet(_this, _binnedListeners)[binInd].forEach(function (listener) {\n listener(delta, bins[binInd], bins[binInd] - lastBin);\n });\n\n for (var rangedInd = 0; rangedInd < sortedCopyOfRangedListeners.length; rangedInd++) {\n // Could switch to a while loop.\n var _sortedCopyOfRangedLi = sortedCopyOfRangedListeners[rangedInd],\n lower = _sortedCopyOfRangedLi.lower,\n upper = _sortedCopyOfRangedLi.upper,\n listener = _sortedCopyOfRangedLi.listener;\n if (lower > binInd) break; // Don't need to check the rest if the current lowest minimum is greater than the current bin index.\n\n if (binInd <= upper) {\n listener(delta, bins.slice(lower, upper));\n sortedCopyOfRangedListeners.shift();\n rangedInd--;\n }\n }\n\n _classPrivateFieldGet(_this, _lastBins)[binInd] = bins[binInd];\n }\n };\n\n for (var binInd = 0; binInd < _classPrivateFieldGet(_this, _lastBins).length; binInd++) {\n _loop(binInd);\n }\n });\n\n visualizer.addUpdateListener(_classPrivateFieldGet(this, _visualizerListener));\n }\n /**\n * Adds a listener to a specific frequency bin.\n * \n * @param {object} freqBinListener the listener for a specific frequency bin.\n * @param {number} freqBinListener.freqBin the frequency bin this update listener should listen to.\n * @param {visualizerBinUpdateListener} freqBinListener.listener the listener itself that will be called upon the bin updating.\n * @returns {boolean} true if and only if the updater was added successfully.\n */\n\n\n _createClass(VisualizerUpdateManager, [{\n key: \"AddVisualizerBinUpdateListener\",\n value: function AddVisualizerBinUpdateListener(_ref) {\n var freqBin = _ref.freqBin,\n listener = _ref.listener;\n if (_classPrivateFieldGet(this, _binnedListeners)[freqBin].includes(listener)) return false;\n\n _classPrivateFieldGet(this, _binnedListeners)[freqBin].push(listener);\n\n return true;\n }\n /**\n * Similar to {@link VisualizerUpdateManager#AddVisualizerBinUpdateListener}, this method adds a listener for to a range of bins.\n * \n * @param {object} rangedUpdateListener The ranged update listener to add.\n * @param {number} rangedUpdateListener.lower The lower bound of the bins to listen to (inclusive).\n * @param {number} rangedUpdateListener.upper The upper bound of the bins to listen to (inclusive).\n * @param {visualizerRangedUpdateListener} rangedUpdateListener.listener The listener to register to the range. \n * @returns {boolean} True if and only if the ranged listener was added successfully.\n */\n\n }, {\n key: \"addVisualizerRangedUpdateListener\",\n value: function addVisualizerRangedUpdateListener(_ref2) {\n var lower = _ref2.lower,\n upper = _ref2.upper,\n listener = _ref2.listener;\n var rangedListener = {\n lower: lower,\n upper: upper,\n listener: listener\n };\n if (_classPrivateFieldGet(this, _rangedListeners).includes(rangedListener)) return false;\n\n _classPrivateFieldGet(this, _rangedListeners).push(rangedListener);\n\n _classPrivateFieldGet(this, _rangedListeners).sort(function (a, b) {\n return a.lower - b.lower;\n });\n\n return true;\n }\n /**\n * \n * @param {object} binFreqListener The bin frequency listener to remove.\n * @param {number} binFreqListener.freqBin the frequency bin the update listener to be removed from is in.\n * @param {visualizerBinUpdateListener} binFreqListener.listener the listener that is to be removed.\n * @returns {boolean} true if and only if the listener was successfully removed.\n */\n\n }, {\n key: \"removeVisualizerBinUpdateListener\",\n value: function removeVisualizerBinUpdateListener(_ref3) {\n var freqBin = _ref3.freqBin,\n listener = _ref3.listener;\n\n var removeIndex = _classPrivateFieldGet(this, _binnedListeners)[freqBin].indexOf(listener);\n\n if (removeIndex < 0) return false;\n\n _classPrivateFieldGet(this, _binnedListeners)[freqBin].splice(removeIndex, 1);\n\n return true;\n }\n /**\n * Similar to {@link removeVisualizerBinUpdateListener}, this method removes the given listener from a range of bins.\n * \n * @param {object} rangedListener The ranged listener to remove.\n * @param {number} rangedListener.lower The lower bound of bins to remove the listener from (inclusive).\n * @param {number} rangedListener.upper The upper bound of bin to remove the listener from (inclusive.)\n * @param {visualizerRangedUpdateListener} rangedListener.listener The update listener to remove from the bins.\n * @returns {boolean} True if and only if the given listener was removed.\n */\n\n }, {\n key: \"removeVisualizerRangedUpdateListener\",\n value: function removeVisualizerRangedUpdateListener(_ref4) {\n var lower = _ref4.lower,\n upper = _ref4.upper,\n listener = _ref4.listener;\n var rangedListener = {\n lower: lower,\n upper: upper,\n listener: listener\n };\n\n var removeIndex = _classPrivateFieldGet(this, _rangedListeners).indexOf(rangedListener);\n\n if (removeIndex < 0) return false;\n\n _classPrivateFieldGet(this, _binnedListeners).splice(removeIndex, 1);\n\n return true;\n }\n /**\n * @param {object} listeners The listeners that this visualizer update manager should be set to use.\n * @param {visualizerBinUpdateListener[][]} listeners.binned The bin listeners.\n * @param {object[]} listeners.ranged The array of ranged listeners.\n * @param {number} listeners.ranged[].lower The lower bound of the listener.\n * @param {number} listeners.ranged[].upper The upper bound of the listener.\n * @param {visualizerRangedUpdateListener} listeners.ranged[].listener The listener for the previously mentioned ranges.\n * @returns {boolean} true if and only if successfully loaded the new listeners.\n */\n\n }, {\n key: \"loadListeners\",\n value: function loadListeners(listeners) {\n if (listeners.binned.length !== _classPrivateFieldGet(this, _binnedListeners).length) return false;\n\n _classPrivateFieldSet(this, _binnedListeners, listeners.binned);\n\n _classPrivateFieldSet(this, _rangedListeners, listeners.ranged.sort(function (a, b) {\n return a.lower - b.lower;\n }));\n\n return true;\n }\n /**\n * \n * @returns {object} All the listeners, both for binned, and ranged listeners. See {@link VisualizerUpdateManager#loadListeners} to see the structure of the returned object.\n */\n\n }, {\n key: \"retrieveListeners\",\n value: function retrieveListeners() {\n return {\n binned: _classPrivateFieldGet(this, _binnedListeners),\n ranged: _classPrivateFieldGet(this, _rangedListeners)\n };\n }\n /**\n * Clears this manager of all listeners.\n */\n\n }, {\n key: \"clearBinnedListeners\",\n value: function clearBinnedListeners() {\n _classPrivateFieldGet(this, _binnedListeners).forEach(function (bin) {\n bin.length = 0;\n });\n }\n /**\n * Unbinds this update manager from the initial visualizer. Effectively meaning this manager will no longer be used.\n */\n\n }, {\n key: \"unbindVisualizer\",\n value: function unbindVisualizer() {\n _classPrivateFieldGet(this, _visualizer).removeUpdateListener(_classPrivateFieldGet(this, _visualizerListener));\n }\n }]);\n\n return VisualizerUpdateManager;\n}();\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdmlzdWFsaXphdGlvbi9WaXN1YWxpemVyVXBkYXRlTWFuYWdlci5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztJQUNxQkM7QUFRakI7QUFDSjtBQUNBO0FBQ0E7QUFDSSxtQ0FBWUMsVUFBWixFQUF3QjtBQUFBOztBQUFBOztBQUFBO0FBQUE7QUFBQSxhQVhMO0FBV0s7O0FBQUE7QUFBQTtBQUFBLGFBVkw7QUFVSzs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFDcEIsa0RBQXdCLEVBQXhCOztBQUNBLGtEQUF3QixFQUF4Qjs7QUFDQSxTQUFLLElBQUlDLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdELFVBQVUsQ0FBQ0UsZUFBWCxFQUFwQixFQUFrREQsQ0FBQyxFQUFuRCxFQUF1RDtBQUNuRCxvREFBc0JFLElBQXRCLENBQTJCLEVBQTNCO0FBQ0g7O0FBQ0QsMkNBQWlCLElBQUlDLFVBQUosQ0FBZSw4Q0FBc0JDLE1BQXJDLENBQWpCOztBQUNBLDZDQUFtQkwsVUFBbkI7O0FBQ0EscURBQTJCLFVBQUNNLEtBQUQsRUFBUUMsSUFBUixFQUFpQjtBQUN4QyxVQUFNQywyQkFBMkIsNENBQVEsS0FBUixvQkFBakMsQ0FEd0MsQ0FDeUI7OztBQUR6QixpQ0FFL0JDLE1BRitCO0FBR3BDLFlBQU1DLE9BQU8sR0FBRywyQkFBSSxZQUFKLENBQWVELE1BQWYsQ0FBaEI7O0FBQ0EsWUFBSUMsT0FBTyxLQUFLSCxJQUFJLENBQUNFLE1BQUQsQ0FBcEIsRUFBOEI7QUFDMUIscUNBQUksbUJBQUosQ0FBc0JBLE1BQXRCLEVBQThCRSxP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YUFBTztBQUNIZSxRQUFBQSxNQUFNLHdCQUFFLElBQUYsbUJBREg7QUFFSEMsUUFBQUEsTUFBTSx3QkFBRSxJQUFGO0FBRkgsT0FBUDtBQUlIO0FBRUQ7QUFDSjtBQUNBOzs7O1dBQ0ksZ0NBQXVCO0FBQ25CLG9EQUFzQm5CLE9BQXRCLENBQThCLFVBQUFvQixHQUFHLEVBQUk7QUFDakNBLFFBQUFBLEdBQUcsQ0FBQzFCLE1BQUosR0FBYSxDQUFiO0FBQ0gsT0FGRDtBQUdIO0FBRUQ7QUFDSjtBQUNBOzs7O1dBQ0ksNEJBQW1CO0FBQ2YsK0NBQWlCMkIsb0JBQWpCLHVCQUFzQyxJQUF0QztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYXVkaW9zaG93a2l0Ly4vc3JjL3Zpc3VhbGl6YXRpb24vVmlzdWFsaXplclVwZGF0ZU1hbmFnZXIuanM/NzhlMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVmlzdWFsaXplciBmcm9tIFwiLi9WaXN1YWxpemVyLmpzXCI7XG5cbi8qKkBtb2R1bGUgKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgdmlzdWFsaXplckJpblVwZGF0ZUxpc3RlbmVyXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZURlbHRhIGVsYXBzZWQgdGltZSBzaW5jZSBsYXN0IHVwZGF0ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBhbXBsaXR1ZGUgVGhlIGFtcGxpdHVkZSBvZiB0aGUgYXNzb2NpYXRlZCBiaW4uXG4gKiBAcGFyYW0ge251bWJlcn0gYW1wRGVsdGEgY2hhbmdlIGluIGFtcGxpdHVkZSBvZiB0aGUgZnJlcXVlbmN5IGJpbi5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayB2aXN1YWxpemVyUmFuZ2VkVXBkYXRlTGlzdGVuZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lRGVsdGEgZWxhcHNlZCB0aW1lIHNpbmNlIGxhc3QgdXBkYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpbnMgdGhlIGJpbnMgb2YgdGhlIHJhbmdlLlxuICovXG5cblxuLyoqXG4gKiBBIHZpc3VhbGl6ZXIgdXBkYXRlIG1hbmFnZXIgb2ZmZXJzIGFuIGV4dHJhIGxheWVyIG9mIGFic3RyYWN0aW9uIG9uIHRvcCBvZiB0aGUge0BsaW5rIFZpc3VhbGl6ZXJ9J3MgdXBkYXRlIGxpc3RlbmVyLlxuICogXG4gKiBTcGVjaWZpY2FsbHksIHRoZSB1cGRhdGUgbWFuYWdlciBoYW5kbGVzIHVwZGF0ZXMgZGlyZWN0bHkgZnJvbSB0aGUge0BsaW5rIFZpc3VhbGl6ZXJ9IGFuZCBjaGVja3MgZm9yIGNoYW5nZXMgaW4gdGhlIGluZGl2aWR1YWwgYmlucy4gVGhlc2UgY2hhbmdlcyBhcmUgdGhlbiBicm9hZGNhc3RlZCB0byB0aGUgaW5kaXZpZHVhbCBiaW4gbGlzdGVuZXJzLlxuICogSW4gdGhlIHJhcmUgZXZlbnQgdGhhdCBhIGJpbiBoYXMgbm90IGNoYW5nZWQsIHRoZW4gaXQgd2lsbCBub3QgcmVjZWl2ZSBhbiB1cGRhdGUgY2FsbC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlzdWFsaXplclVwZGF0ZU1hbmFnZXIge1xuICAgICNiaW5uZWRMaXN0ZW5lcnMgPSBbXTtcbiAgICAjcmFuZ2VkTGlzdGVuZXJzID0gW107XG4gICAgI2xhc3RCaW5zO1xuICAgICN2aXN1YWxpemVyO1xuICAgICN2aXN1YWxpemVyTGlzdGVuZXI7XG5cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7VmlzdWFsaXplcn0gdmlzdWFsaXplciB0aGUgdmlzdWFsaXplciB0aGlzIG1hbmFnZXIgb2J0YWlucyBkYXRhIGZyb20uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodmlzdWFsaXplcikge1xuICAgICAgICB0aGlzLiNiaW5uZWRMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgdGhpcy4jcmFuZ2VkTGlzdGVuZXJzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlzdWFsaXplci5nZXROdW1iZXJPZkJpbnMoKTsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLiNiaW5uZWRMaXN0ZW5lcnMucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jbGFzdEJpbnMgPSBuZXcgVWludDhBcnJheSh0aGlzLiNiaW5uZWRMaXN0ZW5lcnMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy4jdmlzdWFsaXplciA9IHZpc3VhbGl6ZXI7XG4gICAgICAgIHRoaXMuI3Zpc3VhbGl6ZXJMaXN0ZW5lciA9IChkZWx0YSwgYmlucykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkQ29weU9mUmFuZ2VkTGlzdGVuZXJzID0gWy4uLiB0aGlzLiNyYW5nZWRMaXN0ZW5lcnNdOyAvLyBXZSBhc3N1bWUgdGhpcyBpcyBzb3J0ZWQgcHJvcGVybHkuIEEgcHJpb3JpdHkgcXVldWUgY291bGQgYmUgYmV0dGVyLlxuICAgICAgICAgICAgZm9yIChsZXQgYmluSW5kID0gMDsgYmluSW5kIDwgdGhpcy4jbGFzdEJpbnMubGVuZ3RoOyBiaW5JbmQrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RCaW4gPSB0aGlzLiNsYXN0Qmluc1tiaW5JbmRdO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0QmluICE9PSBiaW5zW2JpbkluZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jYmlubmVkTGlzdGVuZXJzW2JpbkluZF0uZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcihkZWx0YSwgYmluc1tiaW5JbmRdLCBiaW5zW2JpbkluZF0gLSBsYXN0QmluKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJhbmdlZEluZCA9IDA7IHJhbmdlZEluZCA8IHNvcnRlZENvcHlPZlJhbmdlZExpc3RlbmVycy5sZW5ndGg7IHJhbmdlZEluZCsrKSB7IC8vIENvdWxkIHN3aXRjaCB0byBhIHdoaWxlIGxvb3AuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxvd2VyLCB1cHBlciwgbGlzdGVuZXIgfSA9IHNvcnRlZENvcHlPZlJhbmdlZExpc3RlbmVyc1tyYW5nZWRJbmRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvd2VyID4gYmluSW5kKSBicmVhazsgLy8gRG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgcmVzdCBpZiB0aGUgY3VycmVudCBsb3dlc3QgbWluaW11bSBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgYmluIGluZGV4LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluZCA8PSB1cHBlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKGRlbHRhLCBiaW5zLnNsaWNlKGxvd2VyLCB1cHBlcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZENvcHlPZlJhbmdlZExpc3RlbmVycy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlZEluZC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2xhc3RCaW5zW2JpbkluZF0gPSBiaW5zW2JpbkluZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2aXN1YWxpemVyLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMuI3Zpc3VhbGl6ZXJMaXN0ZW5lcik7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gYSBzcGVjaWZpYyBmcmVxdWVuY3kgYmluLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBmcmVxQmluTGlzdGVuZXIgdGhlIGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGZyZXF1ZW5jeSBiaW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGZyZXFCaW5MaXN0ZW5lci5mcmVxQmluIHRoZSBmcmVxdWVuY3kgYmluIHRoaXMgdXBkYXRlIGxpc3RlbmVyIHNob3VsZCBsaXN0ZW4gdG8uXG4gICAgICogQHBhcmFtIHt2aXN1YWxpemVyQmluVXBkYXRlTGlzdGVuZXJ9IGZyZXFCaW5MaXN0ZW5lci5saXN0ZW5lciB0aGUgbGlzdGVuZXIgaXRzZWxmIHRoYXQgd2lsbCBiZSBjYWxsZWQgdXBvbiB0aGUgYmluIHVwZGF0aW5nLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB1cGRhdGVyIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkuXG4gICAgICovXG4gICAgQWRkVmlzdWFsaXplckJpblVwZGF0ZUxpc3RlbmVyKHsgZnJlcUJpbiwgbGlzdGVuZXIgfSkge1xuICAgICAgICBpZiAodGhpcy4jYmlubmVkTGlzdGVuZXJzW2ZyZXFCaW5dLmluY2x1ZGVzKGxpc3RlbmVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLiNiaW5uZWRMaXN0ZW5lcnNbZnJlcUJpbl0ucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIFZpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyI0FkZFZpc3VhbGl6ZXJCaW5VcGRhdGVMaXN0ZW5lcn0sIHRoaXMgbWV0aG9kIGFkZHMgYSBsaXN0ZW5lciBmb3IgdG8gYSByYW5nZSBvZiBiaW5zLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSByYW5nZWRVcGRhdGVMaXN0ZW5lciBUaGUgcmFuZ2VkIHVwZGF0ZSBsaXN0ZW5lciB0byBhZGQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlZFVwZGF0ZUxpc3RlbmVyLmxvd2VyIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgYmlucyB0byBsaXN0ZW4gdG8gKGluY2x1c2l2ZSkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlZFVwZGF0ZUxpc3RlbmVyLnVwcGVyIFRoZSB1cHBlciBib3VuZCBvZiB0aGUgYmlucyB0byBsaXN0ZW4gdG8gKGluY2x1c2l2ZSkuXG4gICAgICogQHBhcmFtIHt2aXN1YWxpemVyUmFuZ2VkVXBkYXRlTGlzdGVuZXJ9IHJhbmdlZFVwZGF0ZUxpc3RlbmVyLmxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZWdpc3RlciB0byB0aGUgcmFuZ2UuIFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSByYW5nZWQgbGlzdGVuZXIgd2FzIGFkZGVkIHN1Y2Nlc3NmdWxseS5cbiAgICAgKi9cbiAgICBhZGRWaXN1YWxpemVyUmFuZ2VkVXBkYXRlTGlzdGVuZXIoeyBsb3dlciwgdXBwZXIsIGxpc3RlbmVyIH0pIHtcbiAgICAgICAgY29uc3QgcmFuZ2VkTGlzdGVuZXIgPSB7XG4gICAgICAgICAgICBsb3dlcjogbG93ZXIsXG4gICAgICAgICAgICB1cHBlcjogdXBwZXIsXG4gICAgICAgICAgICBsaXN0ZW5lcjogbGlzdGVuZXJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuI3JhbmdlZExpc3RlbmVycy5pbmNsdWRlcyhyYW5nZWRMaXN0ZW5lcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy4jcmFuZ2VkTGlzdGVuZXJzLnB1c2gocmFuZ2VkTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLiNyYW5nZWRMaXN0ZW5lcnMuc29ydCgoYSwgYikgPT4gYS5sb3dlciAtIGIubG93ZXIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gYmluRnJlcUxpc3RlbmVyIFRoZSBiaW4gZnJlcXVlbmN5IGxpc3RlbmVyIHRvIHJlbW92ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmluRnJlcUxpc3RlbmVyLmZyZXFCaW4gdGhlIGZyZXF1ZW5jeSBiaW4gdGhlIHVwZGF0ZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkIGZyb20gaXMgaW4uXG4gICAgICogQHBhcmFtIHt2aXN1YWxpemVyQmluVXBkYXRlTGlzdGVuZXJ9IGJpbkZyZXFMaXN0ZW5lci5saXN0ZW5lciB0aGUgbGlzdGVuZXIgdGhhdCBpcyB0byBiZSByZW1vdmVkLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICovXG4gICAgcmVtb3ZlVmlzdWFsaXplckJpblVwZGF0ZUxpc3RlbmVyKHsgZnJlcUJpbiwgbGlzdGVuZXIgfSkge1xuICAgICAgICBjb25zdCByZW1vdmVJbmRleCA9IHRoaXMuI2Jpbm5lZExpc3RlbmVyc1tmcmVxQmluXS5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKHJlbW92ZUluZGV4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLiNiaW5uZWRMaXN0ZW5lcnNbZnJlcUJpbl0uc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2ltaWxhciB0byB7QGxpbmsgcmVtb3ZlVmlzdWFsaXplckJpblVwZGF0ZUxpc3RlbmVyfSwgdGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZnJvbSBhIHJhbmdlIG9mIGJpbnMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHJhbmdlZExpc3RlbmVyIFRoZSByYW5nZWQgbGlzdGVuZXIgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByYW5nZWRMaXN0ZW5lci5sb3dlciBUaGUgbG93ZXIgYm91bmQgb2YgYmlucyB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gKGluY2x1c2l2ZSkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJhbmdlZExpc3RlbmVyLnVwcGVyIFRoZSB1cHBlciBib3VuZCBvZiBiaW4gdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIChpbmNsdXNpdmUuKVxuICAgICAqIEBwYXJhbSB7dmlzdWFsaXplclJhbmdlZFVwZGF0ZUxpc3RlbmVyfSByYW5nZWRMaXN0ZW5lci5saXN0ZW5lciBUaGUgdXBkYXRlIGxpc3RlbmVyIHRvIHJlbW92ZSBmcm9tIHRoZSBiaW5zLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBnaXZlbiBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICByZW1vdmVWaXN1YWxpemVyUmFuZ2VkVXBkYXRlTGlzdGVuZXIoeyBsb3dlciwgdXBwZXIsIGxpc3RlbmVyIH0pIHtcbiAgICAgICAgY29uc3QgcmFuZ2VkTGlzdGVuZXIgPSB7XG4gICAgICAgICAgICBsb3dlcjogbG93ZXIsXG4gICAgICAgICAgICB1cHBlcjogdXBwZXIsXG4gICAgICAgICAgICBsaXN0ZW5lcjogbGlzdGVuZXJcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVtb3ZlSW5kZXggPSB0aGlzLiNyYW5nZWRMaXN0ZW5lcnMuaW5kZXhPZihyYW5nZWRMaXN0ZW5lcik7XG4gICAgICAgIGlmIChyZW1vdmVJbmRleCA8IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy4jYmlubmVkTGlzdGVuZXJzLnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBsaXN0ZW5lcnMgVGhlIGxpc3RlbmVycyB0aGF0IHRoaXMgdmlzdWFsaXplciB1cGRhdGUgbWFuYWdlciBzaG91bGQgYmUgc2V0IHRvIHVzZS5cbiAgICAgKiBAcGFyYW0ge3Zpc3VhbGl6ZXJCaW5VcGRhdGVMaXN0ZW5lcltdW119IGxpc3RlbmVycy5iaW5uZWQgVGhlIGJpbiBsaXN0ZW5lcnMuXG4gICAgICogQHBhcmFtIHtvYmplY3RbXX0gbGlzdGVuZXJzLnJhbmdlZCBUaGUgYXJyYXkgb2YgcmFuZ2VkIGxpc3RlbmVycy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGlzdGVuZXJzLnJhbmdlZFtdLmxvd2VyIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgbGlzdGVuZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpc3RlbmVycy5yYW5nZWRbXS51cHBlciBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIGxpc3RlbmVyLlxuICAgICAqIEBwYXJhbSB7dmlzdWFsaXplclJhbmdlZFVwZGF0ZUxpc3RlbmVyfSBsaXN0ZW5lcnMucmFuZ2VkW10ubGlzdGVuZXIgVGhlIGxpc3RlbmVyIGZvciB0aGUgcHJldmlvdXNseSBtZW50aW9uZWQgcmFuZ2VzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFuZCBvbmx5IGlmIHN1Y2Nlc3NmdWxseSBsb2FkZWQgdGhlIG5ldyBsaXN0ZW5lcnMuXG4gICAgICovXG4gICAgbG9hZExpc3RlbmVycyhsaXN0ZW5lcnMpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVycy5iaW5uZWQubGVuZ3RoICE9PSB0aGlzLiNiaW5uZWRMaXN0ZW5lcnMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuI2Jpbm5lZExpc3RlbmVycyA9IGxpc3RlbmVycy5iaW5uZWQ7XG4gICAgICAgIHRoaXMuI3JhbmdlZExpc3RlbmVycyA9IGxpc3RlbmVycy5yYW5nZWQuc29ydCgoYSwgYikgPT4gYS5sb3dlciAtIGIubG93ZXIpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBBbGwgdGhlIGxpc3RlbmVycywgYm90aCBmb3IgYmlubmVkLCBhbmQgcmFuZ2VkIGxpc3RlbmVycy4gU2VlIHtAbGluayBWaXN1YWxpemVyVXBkYXRlTWFuYWdlciNsb2FkTGlzdGVuZXJzfSB0byBzZWUgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0LlxuICAgICAqL1xuICAgIHJldHJpZXZlTGlzdGVuZXJzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmlubmVkOiB0aGlzLiNiaW5uZWRMaXN0ZW5lcnMsXG4gICAgICAgICAgICByYW5nZWQ6IHRoaXMuI3JhbmdlZExpc3RlbmVyc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGlzIG1hbmFnZXIgb2YgYWxsIGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICBjbGVhckJpbm5lZExpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy4jYmlubmVkTGlzdGVuZXJzLmZvckVhY2goYmluID0+IHtcbiAgICAgICAgICAgIGJpbi5sZW5ndGggPSAwO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbmJpbmRzIHRoaXMgdXBkYXRlIG1hbmFnZXIgZnJvbSB0aGUgaW5pdGlhbCB2aXN1YWxpemVyLiBFZmZlY3RpdmVseSBtZWFuaW5nIHRoaXMgbWFuYWdlciB3aWxsIG5vIGxvbmdlciBiZSB1c2VkLlxuICAgICAqL1xuICAgIHVuYmluZFZpc3VhbGl6ZXIoKSB7XG4gICAgICAgIHRoaXMuI3Zpc3VhbGl6ZXIucmVtb3ZlVXBkYXRlTGlzdGVuZXIodGhpcy4jdmlzdWFsaXplckxpc3RlbmVyKTtcbiAgICB9XG59Il0sIm5hbWVzIjpbIlZpc3VhbGl6ZXIiLCJWaXN1YWxpemVyVXBkYXRlTWFuYWdlciIsInZpc3VhbGl6ZXIiLCJpIiwiZ2V0TnVtYmVyT2ZCaW5zIiwicHVzaCIsIlVpbnQ4QXJyYXkiLCJsZW5ndGgiLCJkZWx0YSIsImJpbnMiLCJzb3J0ZWRDb3B5T2ZSYW5nZWRMaXN0ZW5lcnMiLCJiaW5JbmQiLCJsYXN0QmluIiwiZm9yRWFjaCIsImxpc3RlbmVyIiwicmFuZ2VkSW5kIiwibG93ZXIiLCJ1cHBlciIsInNsaWNlIiwic2hpZnQiLCJhZGRVcGRhdGVMaXN0ZW5lciIsImZyZXFCaW4iLCJpbmNsdWRlcyIsInJhbmdlZExpc3RlbmVyIiwic29ydCIsImEiLCJiIiwicmVtb3ZlSW5kZXgiLCJpbmRleE9mIiwic3BsaWNlIiwibGlzdGVuZXJzIiwiYmlubmVkIiwicmFuZ2VkIiwiYmluIiwicmVtb3ZlVXBkYXRlTGlzdGVuZXIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/visualization/VisualizerUpdateManager.js\n"); + +/***/ }), + +/***/ "./src/visualization/visualization.js": +/*!********************************************!*\ + !*** ./src/visualization/visualization.js ***! + \********************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Visualizer\": () => (/* reexport safe */ _Visualizer_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */ \"VisualizerUpdateManager\": () => (/* reexport safe */ _VisualizerUpdateManager_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _Visualizer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Visualizer.js */ \"./src/visualization/Visualizer.js\");\n/* harmony import */ var _VisualizerUpdateManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./VisualizerUpdateManager.js */ \"./src/visualization/VisualizerUpdateManager.js\");\n\n\n/**@module */\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdmlzdWFsaXphdGlvbi92aXN1YWxpemF0aW9uLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hdWRpb3Nob3draXQvLi9zcmMvdmlzdWFsaXphdGlvbi92aXN1YWxpemF0aW9uLmpzPzQxODIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZpc3VhbGl6ZXIgZnJvbSBcIi4vVmlzdWFsaXplci5qc1wiO1xuaW1wb3J0IFZpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyIGZyb20gXCIuL1Zpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyLmpzXCI7XG5cbi8qKkBtb2R1bGUgKi9cbmV4cG9ydCB7IFZpc3VhbGl6ZXIsIFZpc3VhbGl6ZXJVcGRhdGVNYW5hZ2VyIH07Il0sIm5hbWVzIjpbIlZpc3VhbGl6ZXIiLCJWaXN1YWxpemVyVXBkYXRlTWFuYWdlciJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/visualization/visualization.js\n"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ id: moduleId, +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module can't be inlined because the eval-source-map devtool is used. +/******/ var __webpack_exports__ = __webpack_require__("./src/audioshowkitlib.js"); +/******/ audioshowkit = __webpack_exports__; +/******/ +/******/ })() +; \ No newline at end of file diff --git a/tutorials/assets/js/prism.js b/tutorials/assets/js/prism.js new file mode 100644 index 0000000..3c58e2a --- /dev/null +++ b/tutorials/assets/js/prism.js @@ -0,0 +1,7 @@ +/* PrismJS 1.28.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,(function(){return a})),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp("((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/(?:(?:\\[(?:[^\\]\\\\\r\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}|(?:\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.|\\[(?:[^[\\]\\\\\r\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\r\n])+/[dgimyus]{0,7}v[dgimyus]{0,7})(?=(?:\\s|/\\*(?:[^*]|\\*(?!/))*\\*/)*(?:$|[\r\n,.;:})\\]]|//))"),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; diff --git a/webpack.dev.cjs b/webpack.dev.cjs index 6c542f7..f46422f 100644 --- a/webpack.dev.cjs +++ b/webpack.dev.cjs @@ -6,6 +6,9 @@ const webpackCommon = require("./webpack.common.cjs"); const devConfig = { mode: "development", devtool: "eval-source-map", + watchOptions: { + ignored: "./tutorials/**" + } }; module.exports = merge(webpackCommon, devConfig); \ No newline at end of file