key-spacing fix
diff --git a/.eslintrc.json b/.eslintrc.json
index 41307b0..ed4acce 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -23,7 +23,6 @@
         "one-var": "off",
         "padded-blocks": "off",
         "vars-on-top": "off",
-        "key-spacing": "off",
         "no-continue": "off",
         "no-plusplus": "off",
         "semi": "off",
diff --git a/player/js/3rd_party/howler.js b/player/js/3rd_party/howler.js
index 41f7190..1207e59 100644
--- a/player/js/3rd_party/howler.js
+++ b/player/js/3rd_party/howler.js
@@ -1,4 +1,4 @@
 /*! howler.js v2.2.0 | (c) 2013-2020, James Simpson of GoldFire Studios | MIT License | howlerjs.com */
-!function () { 'use strict'; var e = function () { this.init() }; e.prototype = {init:function () { var e = this || n; return e._counter = 1e3, e._html5AudioPool = [], e.html5PoolSize = 10, e._codecs = {}, e._howls = [], e._muted = !1, e._volume = 1, e._canPlayEvent = 'canplaythrough', e._navigator = 'undefined' != typeof window && window.navigator ? window.navigator : null, e.masterGain = null, e.noAudio = !1, e.usingWebAudio = !0, e.autoSuspend = !0, e.ctx = null, e.autoUnlock = !0, e._setup(), e }, volume:function (e) { var o = this || n; if(e = parseFloat(e), o.ctx || _(), void 0 !== e && e >= 0 && e <= 1) { if(o._volume = e, o._muted)return o; o.usingWebAudio && o.masterGain.gain.setValueAtTime(e, n.ctx.currentTime); for(var t = 0; t < o._howls.length; t++)if(!o._howls[t]._webAudio)for(var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) { var u = o._howls[t]._soundById(r[a]); u && u._node && (u._node.volume = u._volume * e) }return o }return o._volume }, mute:function (e) { var o = this || n; o.ctx || _(), o._muted = e, o.usingWebAudio && o.masterGain.gain.setValueAtTime(e ? 0 : o._volume, n.ctx.currentTime); for(var t = 0; t < o._howls.length; t++)if(!o._howls[t]._webAudio)for(var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) { var u = o._howls[t]._soundById(r[a]); u && u._node && (u._node.muted = !!e || u._muted) }return o }, stop:function () { for(var e = this || n, o = 0; o < e._howls.length; o++)e._howls[o].stop(); return e }, unload:function () { for(var e = this || n, o = e._howls.length - 1; o >= 0; o--)e._howls[o].unload(); return e.usingWebAudio && e.ctx && void 0 !== e.ctx.close && (e.ctx.close(), e.ctx = null, _()), e }, codecs:function (e) { return(this || n)._codecs[e.replace(/^x-/, '')] }, _setup:function () { var e = this || n; if(e.state = e.ctx ? e.ctx.state || 'suspended' : 'suspended', e._autoSuspend(), !e.usingWebAudio)if('undefined' != typeof Audio)try{ var o = new Audio; void 0 === o.oncanplaythrough && (e._canPlayEvent = 'canplay') }catch(n) { e.noAudio = !0 }else e.noAudio = !0; try{ var o = new Audio; o.muted && (e.noAudio = !0) }catch(e) {}return e.noAudio || e._setupCodecs(), e }, _setupCodecs:function () { var e = this || n, o = null; try{ o = 'undefined' != typeof Audio ? new Audio : null }catch(n) { return e }if(!o || 'function' != typeof o.canPlayType)return e; var t = o.canPlayType('audio/mpeg;').replace(/^no$/, ''), r = e._navigator && e._navigator.userAgent.match(/OPR\/([0-6].)/g), a = r && parseInt(r[0].split('/')[1], 10) < 33; return e._codecs = {mp3:!(a || !t && !o.canPlayType('audio/mp3;').replace(/^no$/, '')), mpeg:!!t, opus:!!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/, ''), ogg:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''), oga:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''), wav:!!o.canPlayType('audio/wav; codecs="1"').replace(/^no$/, ''), aac:!!o.canPlayType('audio/aac;').replace(/^no$/, ''), caf:!!o.canPlayType('audio/x-caf;').replace(/^no$/, ''), m4a:!!(o.canPlayType('audio/x-m4a;') || o.canPlayType('audio/m4a;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), m4b:!!(o.canPlayType('audio/x-m4b;') || o.canPlayType('audio/m4b;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), mp4:!!(o.canPlayType('audio/x-mp4;') || o.canPlayType('audio/mp4;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), weba:!!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''), webm:!!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''), dolby:!!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/, ''), flac:!!(o.canPlayType('audio/x-flac;') || o.canPlayType('audio/flac;')).replace(/^no$/, '')}, e }, _unlockAudio:function () { var e = this || n; if(!e._audioUnlocked && e.ctx) { e._audioUnlocked = !1, e.autoUnlock = !1, e._mobileUnloaded || 44100 === e.ctx.sampleRate || (e._mobileUnloaded = !0, e.unload()), e._scratchBuffer = e.ctx.createBuffer(1, 1, 22050); var o = function (n) { for(;e._html5AudioPool.length < e.html5PoolSize;)try{ var t = new Audio; t._unlocked = !0, e._releaseHtml5Audio(t) }catch(n) { e.noAudio = !0; break }for(var r = 0; r < e._howls.length; r++)if(!e._howls[r]._webAudio)for(var a = e._howls[r]._getSoundIds(), u = 0; u < a.length; u++) { var i = e._howls[r]._soundById(a[u]); i && i._node && !i._node._unlocked && (i._node._unlocked = !0, i._node.load()) }e._autoResume(); var d = e.ctx.createBufferSource(); d.buffer = e._scratchBuffer, d.connect(e.ctx.destination), void 0 === d.start ? d.noteOn(0) : d.start(0), 'function' == typeof e.ctx.resume && e.ctx.resume(), d.onended = function () { d.disconnect(0), e._audioUnlocked = !0, document.removeEventListener('touchstart', o, !0), document.removeEventListener('touchend', o, !0), document.removeEventListener('click', o, !0); for(var n = 0; n < e._howls.length; n++)e._howls[n]._emit('unlock') } }; return document.addEventListener('touchstart', o, !0), document.addEventListener('touchend', o, !0), document.addEventListener('click', o, !0), e } }, _obtainHtml5Audio:function () { var e = this || n; if(e._html5AudioPool.length)return e._html5AudioPool.pop(); var o = (new Audio).play(); return o && 'undefined' != typeof Promise && (o instanceof Promise || 'function' == typeof o.then) && o.catch(function () { console.warn('HTML5 Audio pool exhausted, returning potentially locked audio object.') }), new Audio }, _releaseHtml5Audio:function (e) { var o = this || n; return e._unlocked && o._html5AudioPool.push(e), o }, _autoSuspend:function () { var e = this; if(e.autoSuspend && e.ctx && void 0 !== e.ctx.suspend && n.usingWebAudio) { for(var o = 0; o < e._howls.length; o++)if(e._howls[o]._webAudio)for(var t = 0; t < e._howls[o]._sounds.length; t++)if(!e._howls[o]._sounds[t]._paused)return e; return e._suspendTimer && clearTimeout(e._suspendTimer), e._suspendTimer = setTimeout(function () { if(e.autoSuspend) { e._suspendTimer = null, e.state = 'suspending'; var n = function () { e.state = 'suspended', e._resumeAfterSuspend && (delete e._resumeAfterSuspend, e._autoResume()) }; e.ctx.suspend().then(n, n) } }, 3e4), e } }, _autoResume:function () { var e = this; if(e.ctx && void 0 !== e.ctx.resume && n.usingWebAudio)return'running' === e.state && 'interrupted' !== e.ctx.state && e._suspendTimer ? (clearTimeout(e._suspendTimer), e._suspendTimer = null) : 'suspended' === e.state || 'running' === e.state && 'interrupted' === e.ctx.state ? (e.ctx.resume().then(function () { e.state = 'running'; for(var n = 0; n < e._howls.length; n++)e._howls[n]._emit('resume') }), e._suspendTimer && (clearTimeout(e._suspendTimer), e._suspendTimer = null)) : 'suspending' === e.state && (e._resumeAfterSuspend = !0), e }}; var n = new e, o = function (e) { var n = this; if(!e.src || 0 === e.src.length)return void console.error('An array of source files must be passed with any new Howl.'); n.init(e) }; o.prototype = {init:function (e) { var o = this; return n.ctx || _(), o._autoplay = e.autoplay || !1, o._format = 'string' != typeof e.format ? e.format : [e.format], o._html5 = e.html5 || !1, o._muted = e.mute || !1, o._loop = e.loop || !1, o._pool = e.pool || 5, o._preload = 'boolean' != typeof e.preload && 'metadata' !== e.preload || e.preload, o._rate = e.rate || 1, o._sprite = e.sprite || {}, o._src = 'string' != typeof e.src ? e.src : [e.src], o._volume = void 0 !== e.volume ? e.volume : 1, o._xhr = {method:e.xhr && e.xhr.method ? e.xhr.method : 'GET', headers:e.xhr && e.xhr.headers ? e.xhr.headers : null, withCredentials:!(!e.xhr || !e.xhr.withCredentials) && e.xhr.withCredentials}, o._duration = 0, o._state = 'unloaded', o._sounds = [], o._endTimers = {}, o._queue = [], o._playLock = !1, o._onend = e.onend ? [{fn:e.onend}] : [], o._onfade = e.onfade ? [{fn:e.onfade}] : [], o._onload = e.onload ? [{fn:e.onload}] : [], o._onloaderror = e.onloaderror ? [{fn:e.onloaderror}] : [], o._onplayerror = e.onplayerror ? [{fn:e.onplayerror}] : [], o._onpause = e.onpause ? [{fn:e.onpause}] : [], o._onplay = e.onplay ? [{fn:e.onplay}] : [], o._onstop = e.onstop ? [{fn:e.onstop}] : [], o._onmute = e.onmute ? [{fn:e.onmute}] : [], o._onvolume = e.onvolume ? [{fn:e.onvolume}] : [], o._onrate = e.onrate ? [{fn:e.onrate}] : [], o._onseek = e.onseek ? [{fn:e.onseek}] : [], o._onunlock = e.onunlock ? [{fn:e.onunlock}] : [], o._onresume = [], o._webAudio = n.usingWebAudio && !o._html5, void 0 !== n.ctx && n.ctx && n.autoUnlock && n._unlockAudio(), n._howls.push(o), o._autoplay && o._queue.push({event:'play', action:function () { o.play() }}), o._preload && 'none' !== o._preload && o.load(), o }, load:function () { var e = this, o = null; if(n.noAudio)return void e._emit('loaderror', null, 'No audio support.'); 'string' == typeof e._src && (e._src = [e._src]); for(var r = 0; r < e._src.length; r++) { var u, i; if(e._format && e._format[r])u = e._format[r]; else{ if('string' != typeof(i = e._src[r])) { e._emit('loaderror', null, 'Non-string found in selected audio sources - ignoring.'); continue }u = /^data:audio\/([^;,]+);/i.exec(i), u || (u = /\.([^.]+)$/.exec(i.split('?', 1)[0])), u && (u = u[1].toLowerCase()) }if(u || console.warn('No file extension was found. Consider using the "format" property or specify an extension.'), u && n.codecs(u)) { o = e._src[r]; break } }return o ? (e._src = o, e._state = 'loading', 'https:' === window.location.protocol && 'http:' === o.slice(0, 5) && (e._html5 = !0, e._webAudio = !1), new t(e), e._webAudio && a(e), e) : void e._emit('loaderror', null, 'No codec support for selected audio sources.') }, play:function (e, o) { var t = this, r = null; if('number' == typeof e)r = e, e = null; else{ if('string' == typeof e && 'loaded' === t._state && !t._sprite[e])return null; if(void 0 === e && (e = '__default', !t._playLock)) { for(var a = 0, u = 0; u < t._sounds.length; u++)t._sounds[u]._paused && !t._sounds[u]._ended && (a++, r = t._sounds[u]._id); 1 === a ? e = null : r = null } }var i = r ? t._soundById(r) : t._inactiveSound(); if(!i)return null; if(r && !e && (e = i._sprite || '__default'), 'loaded' !== t._state) { i._sprite = e, i._ended = !1; var d = i._id; return t._queue.push({event:'play', action:function () { t.play(d) }}), d }if(r && !i._paused)return o || t._loadQueue('play'), i._id; t._webAudio && n._autoResume(); var _ = Math.max(0, i._seek > 0 ? i._seek : t._sprite[e][0] / 1e3), s = Math.max(0, (t._sprite[e][0] + t._sprite[e][1]) / 1e3 - _), l = 1e3 * s / Math.abs(i._rate), c = t._sprite[e][0] / 1e3, f = (t._sprite[e][0] + t._sprite[e][1]) / 1e3; i._sprite = e, i._ended = !1; var p = function () { i._paused = !1, i._seek = _, i._start = c, i._stop = f, i._loop = !(!i._loop && !t._sprite[e][2]) }; if(_ >= f)return void t._ended(i); var m = i._node; if(t._webAudio) { var v = function () { t._playLock = !1, p(), t._refreshBuffer(i); var e = i._muted || t._muted ? 0 : i._volume; m.gain.setValueAtTime(e, n.ctx.currentTime), i._playStart = n.ctx.currentTime, void 0 === m.bufferSource.start ? i._loop ? m.bufferSource.noteGrainOn(0, _, 86400) : m.bufferSource.noteGrainOn(0, _, s) : i._loop ? m.bufferSource.start(0, _, 86400) : m.bufferSource.start(0, _, s), l !== 1 / 0 && (t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l)), o || setTimeout(function () { t._emit('play', i._id), t._loadQueue() }, 0) }; 'running' === n.state && 'interrupted' !== n.ctx.state ? v() : (t._playLock = !0, t.once('resume', v), t._clearTimer(i._id)) }else{ var h = function () { m.currentTime = _, m.muted = i._muted || t._muted || n._muted || m.muted, m.volume = i._volume * n.volume(), m.playbackRate = i._rate; try{ var r = m.play(); if(r && 'undefined' != typeof Promise && (r instanceof Promise || 'function' == typeof r.then) ? (t._playLock = !0, p(), r.then(function () { t._playLock = !1, m._unlocked = !0, o || (t._emit('play', i._id), t._loadQueue()) }).catch(function () { t._playLock = !1, t._emit('playerror', i._id, 'Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.'), i._ended = !0, i._paused = !0 })) : o || (t._playLock = !1, p(), t._emit('play', i._id), t._loadQueue()), m.playbackRate = i._rate, m.paused)return void t._emit('playerror', i._id, 'Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.'); '__default' !== e || i._loop ? t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l) : (t._endTimers[i._id] = function () { t._ended(i), m.removeEventListener('ended', t._endTimers[i._id], !1) }, m.addEventListener('ended', t._endTimers[i._id], !1)) }catch(e) { t._emit('playerror', i._id, e) } }; 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA' === m.src && (m.src = t._src, m.load()); var y = window && window.ejecta || !m.readyState && n._navigator.isCocoonJS; if(m.readyState >= 3 || y)h(); else{ t._playLock = !0; var g = function () { h(), m.removeEventListener(n._canPlayEvent, g, !1) }; m.addEventListener(n._canPlayEvent, g, !1), t._clearTimer(i._id) } }return i._id }, pause:function (e) { var n = this; if('loaded' !== n._state || n._playLock)return n._queue.push({event:'pause', action:function () { n.pause(e) }}), n; for(var o = n._getSoundIds(e), t = 0; t < o.length; t++) { n._clearTimer(o[t]); var r = n._soundById(o[t]); if(r && !r._paused && (r._seek = n.seek(o[t]), r._rateSeek = 0, r._paused = !0, n._stopFade(o[t]), r._node))if(n._webAudio) { if(!r._node.bufferSource)continue; void 0 === r._node.bufferSource.stop ? r._node.bufferSource.noteOff(0) : r._node.bufferSource.stop(0), n._cleanBuffer(r._node) }else isNaN(r._node.duration) && r._node.duration !== 1 / 0 || r._node.pause(); arguments[1] || n._emit('pause', r ? r._id : null) }return n }, stop:function (e, n) { var o = this; if('loaded' !== o._state || o._playLock)return o._queue.push({event:'stop', action:function () { o.stop(e) }}), o; for(var t = o._getSoundIds(e), r = 0; r < t.length; r++) { o._clearTimer(t[r]); var a = o._soundById(t[r]); a && (a._seek = a._start || 0, a._rateSeek = 0, a._paused = !0, a._ended = !0, o._stopFade(t[r]), a._node && (o._webAudio ? a._node.bufferSource && (void 0 === a._node.bufferSource.stop ? a._node.bufferSource.noteOff(0) : a._node.bufferSource.stop(0), o._cleanBuffer(a._node)) : isNaN(a._node.duration) && a._node.duration !== 1 / 0 || (a._node.currentTime = a._start || 0, a._node.pause(), a._node.duration === 1 / 0 && o._clearSound(a._node))), n || o._emit('stop', a._id)) }return o }, mute:function (e, o) { var t = this; if('loaded' !== t._state || t._playLock)return t._queue.push({event:'mute', action:function () { t.mute(e, o) }}), t; if(void 0 === o) { if('boolean' != typeof e)return t._muted; t._muted = e }for(var r = t._getSoundIds(o), a = 0; a < r.length; a++) { var u = t._soundById(r[a]); u && (u._muted = e, u._interval && t._stopFade(u._id), t._webAudio && u._node ? u._node.gain.setValueAtTime(e ? 0 : u._volume, n.ctx.currentTime) : u._node && (u._node.muted = !!n._muted || e), t._emit('mute', u._id)) }return t }, volume:function () { var e, o, t = this, r = arguments; if(0 === r.length)return t._volume; if(1 === r.length || 2 === r.length && void 0 === r[1]) { t._getSoundIds().indexOf(r[0]) >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0]) }else r.length >= 2 && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); var a; if(!(void 0 !== e && e >= 0 && e <= 1))return a = o ? t._soundById(o) : t._sounds[0], a ? a._volume : 0; if('loaded' !== t._state || t._playLock)return t._queue.push({event:'volume', action:function () { t.volume.apply(t, r) }}), t; void 0 === o && (t._volume = e), o = t._getSoundIds(o); for(var u = 0; u < o.length; u++)(a = t._soundById(o[u])) && (a._volume = e, r[2] || t._stopFade(o[u]), t._webAudio && a._node && !a._muted ? a._node.gain.setValueAtTime(e, n.ctx.currentTime) : a._node && !a._muted && (a._node.volume = e * n.volume()), t._emit('volume', a._id)); return t }, fade:function (e, o, t, r) { var a = this; if('loaded' !== a._state || a._playLock)return a._queue.push({event:'fade', action:function () { a.fade(e, o, t, r) }}), a; e = Math.min(Math.max(0, parseFloat(e)), 1), o = Math.min(Math.max(0, parseFloat(o)), 1), t = parseFloat(t), a.volume(e, r); for(var u = a._getSoundIds(r), i = 0; i < u.length; i++) { var d = a._soundById(u[i]); if(d) { if(r || a._stopFade(u[i]), a._webAudio && !d._muted) { var _ = n.ctx.currentTime, s = _ + t / 1e3; d._volume = e, d._node.gain.setValueAtTime(e, _), d._node.gain.linearRampToValueAtTime(o, s) }a._startFadeInterval(d, e, o, t, u[i], void 0 === r) } }return a }, _startFadeInterval:function (e, n, o, t, r, a) { var u = this, i = n, d = o - n, _ = Math.abs(d / .01), s = Math.max(4, _ > 0 ? t / _ : t), l = Date.now(); e._fadeTo = o, e._interval = setInterval(function () { var r = (Date.now() - l) / t; l = Date.now(), i += d * r, i = d < 0 ? Math.max(o, i) : Math.min(o, i), i = Math.round(100 * i) / 100, u._webAudio ? e._volume = i : u.volume(i, e._id, !0), a && (u._volume = i), (o < n && i <= o || o > n && i >= o) && (clearInterval(e._interval), e._interval = null, e._fadeTo = null, u.volume(o, e._id), u._emit('fade', e._id)) }, s) }, _stopFade:function (e) { var o = this, t = o._soundById(e); return t && t._interval && (o._webAudio && t._node.gain.cancelScheduledValues(n.ctx.currentTime), clearInterval(t._interval), t._interval = null, o.volume(t._fadeTo, e), t._fadeTo = null, o._emit('fade', e)), o }, loop:function () { var e, n, o, t = this, r = arguments; if(0 === r.length)return t._loop; if(1 === r.length) { if('boolean' != typeof r[0])return!!(o = t._soundById(parseInt(r[0], 10))) && o._loop; e = r[0], t._loop = e }else 2 === r.length && (e = r[0], n = parseInt(r[1], 10)); for(var a = t._getSoundIds(n), u = 0; u < a.length; u++)(o = t._soundById(a[u])) && (o._loop = e, t._webAudio && o._node && o._node.bufferSource && (o._node.bufferSource.loop = e, e && (o._node.bufferSource.loopStart = o._start || 0, o._node.bufferSource.loopEnd = o._stop))); return t }, rate:function () { var e, o, t = this, r = arguments; if(0 === r.length)o = t._sounds[0]._id; else if(1 === r.length) { var a = t._getSoundIds(), u = a.indexOf(r[0]); u >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0]) }else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); var i; if('number' != typeof e)return i = t._soundById(o), i ? i._rate : t._rate; if('loaded' !== t._state || t._playLock)return t._queue.push({event:'rate', action:function () { t.rate.apply(t, r) }}), t; void 0 === o && (t._rate = e), o = t._getSoundIds(o); for(var d = 0; d < o.length; d++)if(i = t._soundById(o[d])) { t.playing(o[d]) && (i._rateSeek = t.seek(o[d]), i._playStart = t._webAudio ? n.ctx.currentTime : i._playStart), i._rate = e, t._webAudio && i._node && i._node.bufferSource ? i._node.bufferSource.playbackRate.setValueAtTime(e, n.ctx.currentTime) : i._node && (i._node.playbackRate = e); var _ = t.seek(o[d]), s = (t._sprite[i._sprite][0] + t._sprite[i._sprite][1]) / 1e3 - _, l = 1e3 * s / Math.abs(i._rate); !t._endTimers[o[d]] && i._paused || (t._clearTimer(o[d]), t._endTimers[o[d]] = setTimeout(t._ended.bind(t, i), l)), t._emit('rate', i._id) }return t }, seek:function () { var e, o, t = this, r = arguments; if(0 === r.length)o = t._sounds[0]._id; else if(1 === r.length) { var a = t._getSoundIds(), u = a.indexOf(r[0]); u >= 0 ? o = parseInt(r[0], 10) : t._sounds.length && (o = t._sounds[0]._id, e = parseFloat(r[0])) }else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); if(void 0 === o)return t; if('loaded' !== t._state || t._playLock)return t._queue.push({event:'seek', action:function () { t.seek.apply(t, r) }}), t; var i = t._soundById(o); if(i) { if(!('number' == typeof e && e >= 0)) { if(t._webAudio) { var d = t.playing(o) ? n.ctx.currentTime - i._playStart : 0, _ = i._rateSeek ? i._rateSeek - i._seek : 0; return i._seek + (_ + d * Math.abs(i._rate)) }return i._node.currentTime }var s = t.playing(o); s && t.pause(o, !0), i._seek = e, i._ended = !1, t._clearTimer(o), t._webAudio || !i._node || isNaN(i._node.duration) || (i._node.currentTime = e); var l = function () { t._emit('seek', o), s && t.play(o, !0) }; if(s && !t._webAudio) { var c = function () { t._playLock ? setTimeout(c, 0) : l() }; setTimeout(c, 0) }else l() }return t }, playing:function (e) { var n = this; if('number' == typeof e) { var o = n._soundById(e); return!!o && !o._paused }for(var t = 0; t < n._sounds.length; t++)if(!n._sounds[t]._paused)return!0; return!1 }, duration:function (e) { var n = this, o = n._duration, t = n._soundById(e); return t && (o = n._sprite[t._sprite][1] / 1e3), o }, state:function () { return this._state }, unload:function () { for(var e = this, o = e._sounds, t = 0; t < o.length; t++)o[t]._paused || e.stop(o[t]._id), e._webAudio || (e._clearSound(o[t]._node), o[t]._node.removeEventListener('error', o[t]._errorFn, !1), o[t]._node.removeEventListener(n._canPlayEvent, o[t]._loadFn, !1), n._releaseHtml5Audio(o[t]._node)), delete o[t]._node, e._clearTimer(o[t]._id); var a = n._howls.indexOf(e); a >= 0 && n._howls.splice(a, 1); var u = !0; for(t = 0; t < n._howls.length; t++)if(n._howls[t]._src === e._src || e._src.indexOf(n._howls[t]._src) >= 0) { u = !1; break }return r && u && delete r[e._src], n.noAudio = !1, e._state = 'unloaded', e._sounds = [], e = null, null }, on:function (e, n, o, t) { var r = this, a = r['_on' + e]; return'function' == typeof n && a.push(t ? {id:o, fn:n, once:t} : {id:o, fn:n}), r }, off:function (e, n, o) { var t = this, r = t['_on' + e], a = 0; if('number' == typeof n && (o = n, n = null), n || o)for(a = 0; a < r.length; a++) { var u = o === r[a].id; if(n === r[a].fn && u || !n && u) { r.splice(a, 1); break } }else if(e)t['_on' + e] = []; else{ var i = Object.keys(t); for(a = 0; a < i.length; a++)0 === i[a].indexOf('_on') && Array.isArray(t[i[a]]) && (t[i[a]] = []) }return t }, once:function (e, n, o) { var t = this; return t.on(e, n, o, 1), t }, _emit:function (e, n, o) { for(var t = this, r = t['_on' + e], a = r.length - 1; a >= 0; a--)r[a].id && r[a].id !== n && 'load' !== e || (setTimeout(function (e) { e.call(this, n, o) }.bind(t, r[a].fn), 0), r[a].once && t.off(e, r[a].fn, r[a].id)); return t._loadQueue(e), t }, _loadQueue:function (e) { var n = this; if(n._queue.length > 0) { var o = n._queue[0]; o.event === e && (n._queue.shift(), n._loadQueue()), e || o.action() }return n }, _ended:function (e) { var o = this, t = e._sprite; if(!o._webAudio && e._node && !e._node.paused && !e._node.ended && e._node.currentTime < e._stop)return setTimeout(o._ended.bind(o, e), 100), o; var r = !(!e._loop && !o._sprite[t][2]); if(o._emit('end', e._id), !o._webAudio && r && o.stop(e._id, !0).play(e._id), o._webAudio && r) { o._emit('play', e._id), e._seek = e._start || 0, e._rateSeek = 0, e._playStart = n.ctx.currentTime; var a = 1e3 * (e._stop - e._start) / Math.abs(e._rate); o._endTimers[e._id] = setTimeout(o._ended.bind(o, e), a) }return o._webAudio && !r && (e._paused = !0, e._ended = !0, e._seek = e._start || 0, e._rateSeek = 0, o._clearTimer(e._id), o._cleanBuffer(e._node), n._autoSuspend()), o._webAudio || r || o.stop(e._id, !0), o }, _clearTimer:function (e) { var n = this; if(n._endTimers[e]) { if('function' != typeof n._endTimers[e])clearTimeout(n._endTimers[e]); else{ var o = n._soundById(e); o && o._node && o._node.removeEventListener('ended', n._endTimers[e], !1) }delete n._endTimers[e] }return n }, _soundById:function (e) { for(var n = this, o = 0; o < n._sounds.length; o++)if(e === n._sounds[o]._id)return n._sounds[o]; return null }, _inactiveSound:function () { var e = this; e._drain(); for(var n = 0; n < e._sounds.length; n++)if(e._sounds[n]._ended)return e._sounds[n].reset(); return new t(e) }, _drain:function () { var e = this, n = e._pool, o = 0, t = 0; if(!(e._sounds.length < n)) { for(t = 0; t < e._sounds.length; t++)e._sounds[t]._ended && o++; for(t = e._sounds.length - 1; t >= 0; t--) { if(o <= n)return; e._sounds[t]._ended && (e._webAudio && e._sounds[t]._node && e._sounds[t]._node.disconnect(0), e._sounds.splice(t, 1), o--) } } }, _getSoundIds:function (e) { var n = this; if(void 0 === e) { for(var o = [], t = 0; t < n._sounds.length; t++)o.push(n._sounds[t]._id); return o }return[e] }, _refreshBuffer:function (e) { var o = this; return e._node.bufferSource = n.ctx.createBufferSource(), e._node.bufferSource.buffer = r[o._src], e._panner ? e._node.bufferSource.connect(e._panner) : e._node.bufferSource.connect(e._node), e._node.bufferSource.loop = e._loop, e._loop && (e._node.bufferSource.loopStart = e._start || 0, e._node.bufferSource.loopEnd = e._stop || 0), e._node.bufferSource.playbackRate.setValueAtTime(e._rate, n.ctx.currentTime), o }, _cleanBuffer:function (e) { var o = this, t = n._navigator && n._navigator.vendor.indexOf('Apple') >= 0; if(n._scratchBuffer && e.bufferSource && (e.bufferSource.onended = null, e.bufferSource.disconnect(0), t))try{ e.bufferSource.buffer = n._scratchBuffer }catch(e) {}return e.bufferSource = null, o }, _clearSound:function (e) { /MSIE |Trident\//.test(n._navigator && n._navigator.userAgent) || (e.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') }}; var t = function (e) { this._parent = e, this.init() }; t.prototype = {init:function () { var e = this, o = e._parent; return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._paused = !0, e._ended = !0, e._sprite = '__default', e._id = ++n._counter, o._sounds.push(e), e.create(), e }, create:function () { var e = this, o = e._parent, t = n._muted || e._muted || e._parent._muted ? 0 : e._volume; return o._webAudio ? (e._node = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), e._node.gain.setValueAtTime(t, n.ctx.currentTime), e._node.paused = !0, e._node.connect(n.masterGain)) : n.noAudio || (e._node = n._obtainHtml5Audio(), e._errorFn = e._errorListener.bind(e), e._node.addEventListener('error', e._errorFn, !1), e._loadFn = e._loadListener.bind(e), e._node.addEventListener(n._canPlayEvent, e._loadFn, !1), e._node.src = o._src, e._node.preload = !0 === o._preload ? 'auto' : o._preload, e._node.volume = t * n.volume(), e._node.load()), e }, reset:function () { var e = this, o = e._parent; return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._rateSeek = 0, e._paused = !0, e._ended = !0, e._sprite = '__default', e._id = ++n._counter, e }, _errorListener:function () { var e = this; e._parent._emit('loaderror', e._id, e._node.error ? e._node.error.code : 0), e._node.removeEventListener('error', e._errorFn, !1) }, _loadListener:function () { var e = this, o = e._parent; o._duration = Math.ceil(10 * e._node.duration) / 10, 0 === Object.keys(o._sprite).length && (o._sprite = {__default:[0, 1e3 * o._duration]}), 'loaded' !== o._state && (o._state = 'loaded', o._emit('load'), o._loadQueue()), e._node.removeEventListener(n._canPlayEvent, e._loadFn, !1) }}; var r = {}, a = function (e) { var n = e._src; if(r[n])return e._duration = r[n].duration, void d(e); if(/^data:[^;]+;base64,/.test(n)) { for(var o = atob(n.split(',')[1]), t = new Uint8Array(o.length), a = 0; a < o.length; ++a)t[a] = o.charCodeAt(a); i(t.buffer, e) }else{ var _ = new XMLHttpRequest; _.open(e._xhr.method, n, !0), _.withCredentials = e._xhr.withCredentials, _.responseType = 'arraybuffer', e._xhr.headers && Object.keys(e._xhr.headers).forEach(function (n) { _.setRequestHeader(n, e._xhr.headers[n]) }), _.onload = function () { var n = (_.status + '')[0]; if('0' !== n && '2' !== n && '3' !== n)return void e._emit('loaderror', null, 'Failed loading audio file with status: ' + _.status + '.'); i(_.response, e) }, _.onerror = function () { e._webAudio && (e._html5 = !0, e._webAudio = !1, e._sounds = [], delete r[n], e.load()) }, u(_) } }, u = function (e) { try{ e.send() }catch(n) { e.onerror() } }, i = function (e, o) { var t = function () { o._emit('loaderror', null, 'Decoding audio data failed.') }, a = function (e) { e && o._sounds.length > 0 ? (r[o._src] = e, d(o, e)) : t() }; 'undefined' != typeof Promise && 1 === n.ctx.decodeAudioData.length ? n.ctx.decodeAudioData(e).then(a).catch(t) : n.ctx.decodeAudioData(e, a, t) }, d = function (e, n) { n && !e._duration && (e._duration = n.duration), 0 === Object.keys(e._sprite).length && (e._sprite = {__default:[0, 1e3 * e._duration]}), 'loaded' !== e._state && (e._state = 'loaded', e._emit('load'), e._loadQueue()) }, _ = function () { if(n.usingWebAudio) { try{ 'undefined' != typeof AudioContext ? n.ctx = new AudioContext : 'undefined' != typeof webkitAudioContext ? n.ctx = new webkitAudioContext : n.usingWebAudio = !1 }catch(e) { n.usingWebAudio = !1 }n.ctx || (n.usingWebAudio = !1); var e = /iP(hone|od|ad)/.test(n._navigator && n._navigator.platform), o = n._navigator && n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/), t = o ? parseInt(o[1], 10) : null; if(e && t && t < 9) { var r = /safari/.test(n._navigator && n._navigator.userAgent.toLowerCase()); n._navigator && !r && (n.usingWebAudio = !1) }n.usingWebAudio && (n.masterGain = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), n.masterGain.gain.setValueAtTime(n._muted ? 0 : n._volume, n.ctx.currentTime), n.masterGain.connect(n.ctx.destination)), n._setup() } }; 'function' == typeof define && define.amd && define([], function () { return{Howler:n, Howl:o} }), 'undefined' != typeof exports && (exports.Howler = n, exports.Howl = o), 'undefined' != typeof global ? (global.HowlerGlobal = e, global.Howler = n, global.Howl = o, global.Sound = t) : 'undefined' != typeof window && (window.HowlerGlobal = e, window.Howler = n, window.Howl = o, window.Sound = t) }();
+!function () { 'use strict'; var e = function () { this.init() }; e.prototype = {init: function () { var e = this || n; return e._counter = 1e3, e._html5AudioPool = [], e.html5PoolSize = 10, e._codecs = {}, e._howls = [], e._muted = !1, e._volume = 1, e._canPlayEvent = 'canplaythrough', e._navigator = 'undefined' != typeof window && window.navigator ? window.navigator : null, e.masterGain = null, e.noAudio = !1, e.usingWebAudio = !0, e.autoSuspend = !0, e.ctx = null, e.autoUnlock = !0, e._setup(), e }, volume: function (e) { var o = this || n; if(e = parseFloat(e), o.ctx || _(), void 0 !== e && e >= 0 && e <= 1) { if(o._volume = e, o._muted)return o; o.usingWebAudio && o.masterGain.gain.setValueAtTime(e, n.ctx.currentTime); for(var t = 0; t < o._howls.length; t++)if(!o._howls[t]._webAudio)for(var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) { var u = o._howls[t]._soundById(r[a]); u && u._node && (u._node.volume = u._volume * e) }return o }return o._volume }, mute: function (e) { var o = this || n; o.ctx || _(), o._muted = e, o.usingWebAudio && o.masterGain.gain.setValueAtTime(e ? 0 : o._volume, n.ctx.currentTime); for(var t = 0; t < o._howls.length; t++)if(!o._howls[t]._webAudio)for(var r = o._howls[t]._getSoundIds(), a = 0; a < r.length; a++) { var u = o._howls[t]._soundById(r[a]); u && u._node && (u._node.muted = !!e || u._muted) }return o }, stop: function () { for(var e = this || n, o = 0; o < e._howls.length; o++)e._howls[o].stop(); return e }, unload: function () { for(var e = this || n, o = e._howls.length - 1; o >= 0; o--)e._howls[o].unload(); return e.usingWebAudio && e.ctx && void 0 !== e.ctx.close && (e.ctx.close(), e.ctx = null, _()), e }, codecs: function (e) { return(this || n)._codecs[e.replace(/^x-/, '')] }, _setup: function () { var e = this || n; if(e.state = e.ctx ? e.ctx.state || 'suspended' : 'suspended', e._autoSuspend(), !e.usingWebAudio)if('undefined' != typeof Audio)try{ var o = new Audio; void 0 === o.oncanplaythrough && (e._canPlayEvent = 'canplay') }catch(n) { e.noAudio = !0 }else e.noAudio = !0; try{ var o = new Audio; o.muted && (e.noAudio = !0) }catch(e) {}return e.noAudio || e._setupCodecs(), e }, _setupCodecs: function () { var e = this || n, o = null; try{ o = 'undefined' != typeof Audio ? new Audio : null }catch(n) { return e }if(!o || 'function' != typeof o.canPlayType)return e; var t = o.canPlayType('audio/mpeg;').replace(/^no$/, ''), r = e._navigator && e._navigator.userAgent.match(/OPR\/([0-6].)/g), a = r && parseInt(r[0].split('/')[1], 10) < 33; return e._codecs = {mp3: !(a || !t && !o.canPlayType('audio/mp3;').replace(/^no$/, '')), mpeg: !!t, opus: !!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/, ''), ogg: !!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''), oga: !!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''), wav: !!o.canPlayType('audio/wav; codecs="1"').replace(/^no$/, ''), aac: !!o.canPlayType('audio/aac;').replace(/^no$/, ''), caf: !!o.canPlayType('audio/x-caf;').replace(/^no$/, ''), m4a: !!(o.canPlayType('audio/x-m4a;') || o.canPlayType('audio/m4a;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), m4b: !!(o.canPlayType('audio/x-m4b;') || o.canPlayType('audio/m4b;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), mp4: !!(o.canPlayType('audio/x-mp4;') || o.canPlayType('audio/mp4;') || o.canPlayType('audio/aac;')).replace(/^no$/, ''), weba: !!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''), webm: !!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''), dolby: !!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/, ''), flac: !!(o.canPlayType('audio/x-flac;') || o.canPlayType('audio/flac;')).replace(/^no$/, '')}, e }, _unlockAudio: function () { var e = this || n; if(!e._audioUnlocked && e.ctx) { e._audioUnlocked = !1, e.autoUnlock = !1, e._mobileUnloaded || 44100 === e.ctx.sampleRate || (e._mobileUnloaded = !0, e.unload()), e._scratchBuffer = e.ctx.createBuffer(1, 1, 22050); var o = function (n) { for(;e._html5AudioPool.length < e.html5PoolSize;)try{ var t = new Audio; t._unlocked = !0, e._releaseHtml5Audio(t) }catch(n) { e.noAudio = !0; break }for(var r = 0; r < e._howls.length; r++)if(!e._howls[r]._webAudio)for(var a = e._howls[r]._getSoundIds(), u = 0; u < a.length; u++) { var i = e._howls[r]._soundById(a[u]); i && i._node && !i._node._unlocked && (i._node._unlocked = !0, i._node.load()) }e._autoResume(); var d = e.ctx.createBufferSource(); d.buffer = e._scratchBuffer, d.connect(e.ctx.destination), void 0 === d.start ? d.noteOn(0) : d.start(0), 'function' == typeof e.ctx.resume && e.ctx.resume(), d.onended = function () { d.disconnect(0), e._audioUnlocked = !0, document.removeEventListener('touchstart', o, !0), document.removeEventListener('touchend', o, !0), document.removeEventListener('click', o, !0); for(var n = 0; n < e._howls.length; n++)e._howls[n]._emit('unlock') } }; return document.addEventListener('touchstart', o, !0), document.addEventListener('touchend', o, !0), document.addEventListener('click', o, !0), e } }, _obtainHtml5Audio: function () { var e = this || n; if(e._html5AudioPool.length)return e._html5AudioPool.pop(); var o = (new Audio).play(); return o && 'undefined' != typeof Promise && (o instanceof Promise || 'function' == typeof o.then) && o.catch(function () { console.warn('HTML5 Audio pool exhausted, returning potentially locked audio object.') }), new Audio }, _releaseHtml5Audio: function (e) { var o = this || n; return e._unlocked && o._html5AudioPool.push(e), o }, _autoSuspend: function () { var e = this; if(e.autoSuspend && e.ctx && void 0 !== e.ctx.suspend && n.usingWebAudio) { for(var o = 0; o < e._howls.length; o++)if(e._howls[o]._webAudio)for(var t = 0; t < e._howls[o]._sounds.length; t++)if(!e._howls[o]._sounds[t]._paused)return e; return e._suspendTimer && clearTimeout(e._suspendTimer), e._suspendTimer = setTimeout(function () { if(e.autoSuspend) { e._suspendTimer = null, e.state = 'suspending'; var n = function () { e.state = 'suspended', e._resumeAfterSuspend && (delete e._resumeAfterSuspend, e._autoResume()) }; e.ctx.suspend().then(n, n) } }, 3e4), e } }, _autoResume: function () { var e = this; if(e.ctx && void 0 !== e.ctx.resume && n.usingWebAudio)return'running' === e.state && 'interrupted' !== e.ctx.state && e._suspendTimer ? (clearTimeout(e._suspendTimer), e._suspendTimer = null) : 'suspended' === e.state || 'running' === e.state && 'interrupted' === e.ctx.state ? (e.ctx.resume().then(function () { e.state = 'running'; for(var n = 0; n < e._howls.length; n++)e._howls[n]._emit('resume') }), e._suspendTimer && (clearTimeout(e._suspendTimer), e._suspendTimer = null)) : 'suspending' === e.state && (e._resumeAfterSuspend = !0), e }}; var n = new e, o = function (e) { var n = this; if(!e.src || 0 === e.src.length)return void console.error('An array of source files must be passed with any new Howl.'); n.init(e) }; o.prototype = {init: function (e) { var o = this; return n.ctx || _(), o._autoplay = e.autoplay || !1, o._format = 'string' != typeof e.format ? e.format : [e.format], o._html5 = e.html5 || !1, o._muted = e.mute || !1, o._loop = e.loop || !1, o._pool = e.pool || 5, o._preload = 'boolean' != typeof e.preload && 'metadata' !== e.preload || e.preload, o._rate = e.rate || 1, o._sprite = e.sprite || {}, o._src = 'string' != typeof e.src ? e.src : [e.src], o._volume = void 0 !== e.volume ? e.volume : 1, o._xhr = {method: e.xhr && e.xhr.method ? e.xhr.method : 'GET', headers: e.xhr && e.xhr.headers ? e.xhr.headers : null, withCredentials: !(!e.xhr || !e.xhr.withCredentials) && e.xhr.withCredentials}, o._duration = 0, o._state = 'unloaded', o._sounds = [], o._endTimers = {}, o._queue = [], o._playLock = !1, o._onend = e.onend ? [{fn: e.onend}] : [], o._onfade = e.onfade ? [{fn: e.onfade}] : [], o._onload = e.onload ? [{fn: e.onload}] : [], o._onloaderror = e.onloaderror ? [{fn: e.onloaderror}] : [], o._onplayerror = e.onplayerror ? [{fn: e.onplayerror}] : [], o._onpause = e.onpause ? [{fn: e.onpause}] : [], o._onplay = e.onplay ? [{fn: e.onplay}] : [], o._onstop = e.onstop ? [{fn: e.onstop}] : [], o._onmute = e.onmute ? [{fn: e.onmute}] : [], o._onvolume = e.onvolume ? [{fn: e.onvolume}] : [], o._onrate = e.onrate ? [{fn: e.onrate}] : [], o._onseek = e.onseek ? [{fn: e.onseek}] : [], o._onunlock = e.onunlock ? [{fn: e.onunlock}] : [], o._onresume = [], o._webAudio = n.usingWebAudio && !o._html5, void 0 !== n.ctx && n.ctx && n.autoUnlock && n._unlockAudio(), n._howls.push(o), o._autoplay && o._queue.push({event: 'play', action: function () { o.play() }}), o._preload && 'none' !== o._preload && o.load(), o }, load: function () { var e = this, o = null; if(n.noAudio)return void e._emit('loaderror', null, 'No audio support.'); 'string' == typeof e._src && (e._src = [e._src]); for(var r = 0; r < e._src.length; r++) { var u, i; if(e._format && e._format[r])u = e._format[r]; else{ if('string' != typeof(i = e._src[r])) { e._emit('loaderror', null, 'Non-string found in selected audio sources - ignoring.'); continue }u = /^data:audio\/([^;,]+);/i.exec(i), u || (u = /\.([^.]+)$/.exec(i.split('?', 1)[0])), u && (u = u[1].toLowerCase()) }if(u || console.warn('No file extension was found. Consider using the "format" property or specify an extension.'), u && n.codecs(u)) { o = e._src[r]; break } }return o ? (e._src = o, e._state = 'loading', 'https:' === window.location.protocol && 'http:' === o.slice(0, 5) && (e._html5 = !0, e._webAudio = !1), new t(e), e._webAudio && a(e), e) : void e._emit('loaderror', null, 'No codec support for selected audio sources.') }, play: function (e, o) { var t = this, r = null; if('number' == typeof e)r = e, e = null; else{ if('string' == typeof e && 'loaded' === t._state && !t._sprite[e])return null; if(void 0 === e && (e = '__default', !t._playLock)) { for(var a = 0, u = 0; u < t._sounds.length; u++)t._sounds[u]._paused && !t._sounds[u]._ended && (a++, r = t._sounds[u]._id); 1 === a ? e = null : r = null } }var i = r ? t._soundById(r) : t._inactiveSound(); if(!i)return null; if(r && !e && (e = i._sprite || '__default'), 'loaded' !== t._state) { i._sprite = e, i._ended = !1; var d = i._id; return t._queue.push({event: 'play', action: function () { t.play(d) }}), d }if(r && !i._paused)return o || t._loadQueue('play'), i._id; t._webAudio && n._autoResume(); var _ = Math.max(0, i._seek > 0 ? i._seek : t._sprite[e][0] / 1e3), s = Math.max(0, (t._sprite[e][0] + t._sprite[e][1]) / 1e3 - _), l = 1e3 * s / Math.abs(i._rate), c = t._sprite[e][0] / 1e3, f = (t._sprite[e][0] + t._sprite[e][1]) / 1e3; i._sprite = e, i._ended = !1; var p = function () { i._paused = !1, i._seek = _, i._start = c, i._stop = f, i._loop = !(!i._loop && !t._sprite[e][2]) }; if(_ >= f)return void t._ended(i); var m = i._node; if(t._webAudio) { var v = function () { t._playLock = !1, p(), t._refreshBuffer(i); var e = i._muted || t._muted ? 0 : i._volume; m.gain.setValueAtTime(e, n.ctx.currentTime), i._playStart = n.ctx.currentTime, void 0 === m.bufferSource.start ? i._loop ? m.bufferSource.noteGrainOn(0, _, 86400) : m.bufferSource.noteGrainOn(0, _, s) : i._loop ? m.bufferSource.start(0, _, 86400) : m.bufferSource.start(0, _, s), l !== 1 / 0 && (t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l)), o || setTimeout(function () { t._emit('play', i._id), t._loadQueue() }, 0) }; 'running' === n.state && 'interrupted' !== n.ctx.state ? v() : (t._playLock = !0, t.once('resume', v), t._clearTimer(i._id)) }else{ var h = function () { m.currentTime = _, m.muted = i._muted || t._muted || n._muted || m.muted, m.volume = i._volume * n.volume(), m.playbackRate = i._rate; try{ var r = m.play(); if(r && 'undefined' != typeof Promise && (r instanceof Promise || 'function' == typeof r.then) ? (t._playLock = !0, p(), r.then(function () { t._playLock = !1, m._unlocked = !0, o || (t._emit('play', i._id), t._loadQueue()) }).catch(function () { t._playLock = !1, t._emit('playerror', i._id, 'Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.'), i._ended = !0, i._paused = !0 })) : o || (t._playLock = !1, p(), t._emit('play', i._id), t._loadQueue()), m.playbackRate = i._rate, m.paused)return void t._emit('playerror', i._id, 'Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.'); '__default' !== e || i._loop ? t._endTimers[i._id] = setTimeout(t._ended.bind(t, i), l) : (t._endTimers[i._id] = function () { t._ended(i), m.removeEventListener('ended', t._endTimers[i._id], !1) }, m.addEventListener('ended', t._endTimers[i._id], !1)) }catch(e) { t._emit('playerror', i._id, e) } }; 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA' === m.src && (m.src = t._src, m.load()); var y = window && window.ejecta || !m.readyState && n._navigator.isCocoonJS; if(m.readyState >= 3 || y)h(); else{ t._playLock = !0; var g = function () { h(), m.removeEventListener(n._canPlayEvent, g, !1) }; m.addEventListener(n._canPlayEvent, g, !1), t._clearTimer(i._id) } }return i._id }, pause: function (e) { var n = this; if('loaded' !== n._state || n._playLock)return n._queue.push({event: 'pause', action: function () { n.pause(e) }}), n; for(var o = n._getSoundIds(e), t = 0; t < o.length; t++) { n._clearTimer(o[t]); var r = n._soundById(o[t]); if(r && !r._paused && (r._seek = n.seek(o[t]), r._rateSeek = 0, r._paused = !0, n._stopFade(o[t]), r._node))if(n._webAudio) { if(!r._node.bufferSource)continue; void 0 === r._node.bufferSource.stop ? r._node.bufferSource.noteOff(0) : r._node.bufferSource.stop(0), n._cleanBuffer(r._node) }else isNaN(r._node.duration) && r._node.duration !== 1 / 0 || r._node.pause(); arguments[1] || n._emit('pause', r ? r._id : null) }return n }, stop: function (e, n) { var o = this; if('loaded' !== o._state || o._playLock)return o._queue.push({event: 'stop', action: function () { o.stop(e) }}), o; for(var t = o._getSoundIds(e), r = 0; r < t.length; r++) { o._clearTimer(t[r]); var a = o._soundById(t[r]); a && (a._seek = a._start || 0, a._rateSeek = 0, a._paused = !0, a._ended = !0, o._stopFade(t[r]), a._node && (o._webAudio ? a._node.bufferSource && (void 0 === a._node.bufferSource.stop ? a._node.bufferSource.noteOff(0) : a._node.bufferSource.stop(0), o._cleanBuffer(a._node)) : isNaN(a._node.duration) && a._node.duration !== 1 / 0 || (a._node.currentTime = a._start || 0, a._node.pause(), a._node.duration === 1 / 0 && o._clearSound(a._node))), n || o._emit('stop', a._id)) }return o }, mute: function (e, o) { var t = this; if('loaded' !== t._state || t._playLock)return t._queue.push({event: 'mute', action: function () { t.mute(e, o) }}), t; if(void 0 === o) { if('boolean' != typeof e)return t._muted; t._muted = e }for(var r = t._getSoundIds(o), a = 0; a < r.length; a++) { var u = t._soundById(r[a]); u && (u._muted = e, u._interval && t._stopFade(u._id), t._webAudio && u._node ? u._node.gain.setValueAtTime(e ? 0 : u._volume, n.ctx.currentTime) : u._node && (u._node.muted = !!n._muted || e), t._emit('mute', u._id)) }return t }, volume: function () { var e, o, t = this, r = arguments; if(0 === r.length)return t._volume; if(1 === r.length || 2 === r.length && void 0 === r[1]) { t._getSoundIds().indexOf(r[0]) >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0]) }else r.length >= 2 && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); var a; if(!(void 0 !== e && e >= 0 && e <= 1))return a = o ? t._soundById(o) : t._sounds[0], a ? a._volume : 0; if('loaded' !== t._state || t._playLock)return t._queue.push({event: 'volume', action: function () { t.volume.apply(t, r) }}), t; void 0 === o && (t._volume = e), o = t._getSoundIds(o); for(var u = 0; u < o.length; u++)(a = t._soundById(o[u])) && (a._volume = e, r[2] || t._stopFade(o[u]), t._webAudio && a._node && !a._muted ? a._node.gain.setValueAtTime(e, n.ctx.currentTime) : a._node && !a._muted && (a._node.volume = e * n.volume()), t._emit('volume', a._id)); return t }, fade: function (e, o, t, r) { var a = this; if('loaded' !== a._state || a._playLock)return a._queue.push({event: 'fade', action: function () { a.fade(e, o, t, r) }}), a; e = Math.min(Math.max(0, parseFloat(e)), 1), o = Math.min(Math.max(0, parseFloat(o)), 1), t = parseFloat(t), a.volume(e, r); for(var u = a._getSoundIds(r), i = 0; i < u.length; i++) { var d = a._soundById(u[i]); if(d) { if(r || a._stopFade(u[i]), a._webAudio && !d._muted) { var _ = n.ctx.currentTime, s = _ + t / 1e3; d._volume = e, d._node.gain.setValueAtTime(e, _), d._node.gain.linearRampToValueAtTime(o, s) }a._startFadeInterval(d, e, o, t, u[i], void 0 === r) } }return a }, _startFadeInterval: function (e, n, o, t, r, a) { var u = this, i = n, d = o - n, _ = Math.abs(d / .01), s = Math.max(4, _ > 0 ? t / _ : t), l = Date.now(); e._fadeTo = o, e._interval = setInterval(function () { var r = (Date.now() - l) / t; l = Date.now(), i += d * r, i = d < 0 ? Math.max(o, i) : Math.min(o, i), i = Math.round(100 * i) / 100, u._webAudio ? e._volume = i : u.volume(i, e._id, !0), a && (u._volume = i), (o < n && i <= o || o > n && i >= o) && (clearInterval(e._interval), e._interval = null, e._fadeTo = null, u.volume(o, e._id), u._emit('fade', e._id)) }, s) }, _stopFade: function (e) { var o = this, t = o._soundById(e); return t && t._interval && (o._webAudio && t._node.gain.cancelScheduledValues(n.ctx.currentTime), clearInterval(t._interval), t._interval = null, o.volume(t._fadeTo, e), t._fadeTo = null, o._emit('fade', e)), o }, loop: function () { var e, n, o, t = this, r = arguments; if(0 === r.length)return t._loop; if(1 === r.length) { if('boolean' != typeof r[0])return!!(o = t._soundById(parseInt(r[0], 10))) && o._loop; e = r[0], t._loop = e }else 2 === r.length && (e = r[0], n = parseInt(r[1], 10)); for(var a = t._getSoundIds(n), u = 0; u < a.length; u++)(o = t._soundById(a[u])) && (o._loop = e, t._webAudio && o._node && o._node.bufferSource && (o._node.bufferSource.loop = e, e && (o._node.bufferSource.loopStart = o._start || 0, o._node.bufferSource.loopEnd = o._stop))); return t }, rate: function () { var e, o, t = this, r = arguments; if(0 === r.length)o = t._sounds[0]._id; else if(1 === r.length) { var a = t._getSoundIds(), u = a.indexOf(r[0]); u >= 0 ? o = parseInt(r[0], 10) : e = parseFloat(r[0]) }else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); var i; if('number' != typeof e)return i = t._soundById(o), i ? i._rate : t._rate; if('loaded' !== t._state || t._playLock)return t._queue.push({event: 'rate', action: function () { t.rate.apply(t, r) }}), t; void 0 === o && (t._rate = e), o = t._getSoundIds(o); for(var d = 0; d < o.length; d++)if(i = t._soundById(o[d])) { t.playing(o[d]) && (i._rateSeek = t.seek(o[d]), i._playStart = t._webAudio ? n.ctx.currentTime : i._playStart), i._rate = e, t._webAudio && i._node && i._node.bufferSource ? i._node.bufferSource.playbackRate.setValueAtTime(e, n.ctx.currentTime) : i._node && (i._node.playbackRate = e); var _ = t.seek(o[d]), s = (t._sprite[i._sprite][0] + t._sprite[i._sprite][1]) / 1e3 - _, l = 1e3 * s / Math.abs(i._rate); !t._endTimers[o[d]] && i._paused || (t._clearTimer(o[d]), t._endTimers[o[d]] = setTimeout(t._ended.bind(t, i), l)), t._emit('rate', i._id) }return t }, seek: function () { var e, o, t = this, r = arguments; if(0 === r.length)o = t._sounds[0]._id; else if(1 === r.length) { var a = t._getSoundIds(), u = a.indexOf(r[0]); u >= 0 ? o = parseInt(r[0], 10) : t._sounds.length && (o = t._sounds[0]._id, e = parseFloat(r[0])) }else 2 === r.length && (e = parseFloat(r[0]), o = parseInt(r[1], 10)); if(void 0 === o)return t; if('loaded' !== t._state || t._playLock)return t._queue.push({event: 'seek', action: function () { t.seek.apply(t, r) }}), t; var i = t._soundById(o); if(i) { if(!('number' == typeof e && e >= 0)) { if(t._webAudio) { var d = t.playing(o) ? n.ctx.currentTime - i._playStart : 0, _ = i._rateSeek ? i._rateSeek - i._seek : 0; return i._seek + (_ + d * Math.abs(i._rate)) }return i._node.currentTime }var s = t.playing(o); s && t.pause(o, !0), i._seek = e, i._ended = !1, t._clearTimer(o), t._webAudio || !i._node || isNaN(i._node.duration) || (i._node.currentTime = e); var l = function () { t._emit('seek', o), s && t.play(o, !0) }; if(s && !t._webAudio) { var c = function () { t._playLock ? setTimeout(c, 0) : l() }; setTimeout(c, 0) }else l() }return t }, playing: function (e) { var n = this; if('number' == typeof e) { var o = n._soundById(e); return!!o && !o._paused }for(var t = 0; t < n._sounds.length; t++)if(!n._sounds[t]._paused)return!0; return!1 }, duration: function (e) { var n = this, o = n._duration, t = n._soundById(e); return t && (o = n._sprite[t._sprite][1] / 1e3), o }, state: function () { return this._state }, unload: function () { for(var e = this, o = e._sounds, t = 0; t < o.length; t++)o[t]._paused || e.stop(o[t]._id), e._webAudio || (e._clearSound(o[t]._node), o[t]._node.removeEventListener('error', o[t]._errorFn, !1), o[t]._node.removeEventListener(n._canPlayEvent, o[t]._loadFn, !1), n._releaseHtml5Audio(o[t]._node)), delete o[t]._node, e._clearTimer(o[t]._id); var a = n._howls.indexOf(e); a >= 0 && n._howls.splice(a, 1); var u = !0; for(t = 0; t < n._howls.length; t++)if(n._howls[t]._src === e._src || e._src.indexOf(n._howls[t]._src) >= 0) { u = !1; break }return r && u && delete r[e._src], n.noAudio = !1, e._state = 'unloaded', e._sounds = [], e = null, null }, on: function (e, n, o, t) { var r = this, a = r['_on' + e]; return'function' == typeof n && a.push(t ? {id: o, fn: n, once: t} : {id: o, fn: n}), r }, off: function (e, n, o) { var t = this, r = t['_on' + e], a = 0; if('number' == typeof n && (o = n, n = null), n || o)for(a = 0; a < r.length; a++) { var u = o === r[a].id; if(n === r[a].fn && u || !n && u) { r.splice(a, 1); break } }else if(e)t['_on' + e] = []; else{ var i = Object.keys(t); for(a = 0; a < i.length; a++)0 === i[a].indexOf('_on') && Array.isArray(t[i[a]]) && (t[i[a]] = []) }return t }, once: function (e, n, o) { var t = this; return t.on(e, n, o, 1), t }, _emit: function (e, n, o) { for(var t = this, r = t['_on' + e], a = r.length - 1; a >= 0; a--)r[a].id && r[a].id !== n && 'load' !== e || (setTimeout(function (e) { e.call(this, n, o) }.bind(t, r[a].fn), 0), r[a].once && t.off(e, r[a].fn, r[a].id)); return t._loadQueue(e), t }, _loadQueue: function (e) { var n = this; if(n._queue.length > 0) { var o = n._queue[0]; o.event === e && (n._queue.shift(), n._loadQueue()), e || o.action() }return n }, _ended: function (e) { var o = this, t = e._sprite; if(!o._webAudio && e._node && !e._node.paused && !e._node.ended && e._node.currentTime < e._stop)return setTimeout(o._ended.bind(o, e), 100), o; var r = !(!e._loop && !o._sprite[t][2]); if(o._emit('end', e._id), !o._webAudio && r && o.stop(e._id, !0).play(e._id), o._webAudio && r) { o._emit('play', e._id), e._seek = e._start || 0, e._rateSeek = 0, e._playStart = n.ctx.currentTime; var a = 1e3 * (e._stop - e._start) / Math.abs(e._rate); o._endTimers[e._id] = setTimeout(o._ended.bind(o, e), a) }return o._webAudio && !r && (e._paused = !0, e._ended = !0, e._seek = e._start || 0, e._rateSeek = 0, o._clearTimer(e._id), o._cleanBuffer(e._node), n._autoSuspend()), o._webAudio || r || o.stop(e._id, !0), o }, _clearTimer: function (e) { var n = this; if(n._endTimers[e]) { if('function' != typeof n._endTimers[e])clearTimeout(n._endTimers[e]); else{ var o = n._soundById(e); o && o._node && o._node.removeEventListener('ended', n._endTimers[e], !1) }delete n._endTimers[e] }return n }, _soundById: function (e) { for(var n = this, o = 0; o < n._sounds.length; o++)if(e === n._sounds[o]._id)return n._sounds[o]; return null }, _inactiveSound: function () { var e = this; e._drain(); for(var n = 0; n < e._sounds.length; n++)if(e._sounds[n]._ended)return e._sounds[n].reset(); return new t(e) }, _drain: function () { var e = this, n = e._pool, o = 0, t = 0; if(!(e._sounds.length < n)) { for(t = 0; t < e._sounds.length; t++)e._sounds[t]._ended && o++; for(t = e._sounds.length - 1; t >= 0; t--) { if(o <= n)return; e._sounds[t]._ended && (e._webAudio && e._sounds[t]._node && e._sounds[t]._node.disconnect(0), e._sounds.splice(t, 1), o--) } } }, _getSoundIds: function (e) { var n = this; if(void 0 === e) { for(var o = [], t = 0; t < n._sounds.length; t++)o.push(n._sounds[t]._id); return o }return[e] }, _refreshBuffer: function (e) { var o = this; return e._node.bufferSource = n.ctx.createBufferSource(), e._node.bufferSource.buffer = r[o._src], e._panner ? e._node.bufferSource.connect(e._panner) : e._node.bufferSource.connect(e._node), e._node.bufferSource.loop = e._loop, e._loop && (e._node.bufferSource.loopStart = e._start || 0, e._node.bufferSource.loopEnd = e._stop || 0), e._node.bufferSource.playbackRate.setValueAtTime(e._rate, n.ctx.currentTime), o }, _cleanBuffer: function (e) { var o = this, t = n._navigator && n._navigator.vendor.indexOf('Apple') >= 0; if(n._scratchBuffer && e.bufferSource && (e.bufferSource.onended = null, e.bufferSource.disconnect(0), t))try{ e.bufferSource.buffer = n._scratchBuffer }catch(e) {}return e.bufferSource = null, o }, _clearSound: function (e) { /MSIE |Trident\//.test(n._navigator && n._navigator.userAgent) || (e.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') }}; var t = function (e) { this._parent = e, this.init() }; t.prototype = {init: function () { var e = this, o = e._parent; return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._paused = !0, e._ended = !0, e._sprite = '__default', e._id = ++n._counter, o._sounds.push(e), e.create(), e }, create: function () { var e = this, o = e._parent, t = n._muted || e._muted || e._parent._muted ? 0 : e._volume; return o._webAudio ? (e._node = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), e._node.gain.setValueAtTime(t, n.ctx.currentTime), e._node.paused = !0, e._node.connect(n.masterGain)) : n.noAudio || (e._node = n._obtainHtml5Audio(), e._errorFn = e._errorListener.bind(e), e._node.addEventListener('error', e._errorFn, !1), e._loadFn = e._loadListener.bind(e), e._node.addEventListener(n._canPlayEvent, e._loadFn, !1), e._node.src = o._src, e._node.preload = !0 === o._preload ? 'auto' : o._preload, e._node.volume = t * n.volume(), e._node.load()), e }, reset: function () { var e = this, o = e._parent; return e._muted = o._muted, e._loop = o._loop, e._volume = o._volume, e._rate = o._rate, e._seek = 0, e._rateSeek = 0, e._paused = !0, e._ended = !0, e._sprite = '__default', e._id = ++n._counter, e }, _errorListener: function () { var e = this; e._parent._emit('loaderror', e._id, e._node.error ? e._node.error.code : 0), e._node.removeEventListener('error', e._errorFn, !1) }, _loadListener: function () { var e = this, o = e._parent; o._duration = Math.ceil(10 * e._node.duration) / 10, 0 === Object.keys(o._sprite).length && (o._sprite = {__default: [0, 1e3 * o._duration]}), 'loaded' !== o._state && (o._state = 'loaded', o._emit('load'), o._loadQueue()), e._node.removeEventListener(n._canPlayEvent, e._loadFn, !1) }}; var r = {}, a = function (e) { var n = e._src; if(r[n])return e._duration = r[n].duration, void d(e); if(/^data:[^;]+;base64,/.test(n)) { for(var o = atob(n.split(',')[1]), t = new Uint8Array(o.length), a = 0; a < o.length; ++a)t[a] = o.charCodeAt(a); i(t.buffer, e) }else{ var _ = new XMLHttpRequest; _.open(e._xhr.method, n, !0), _.withCredentials = e._xhr.withCredentials, _.responseType = 'arraybuffer', e._xhr.headers && Object.keys(e._xhr.headers).forEach(function (n) { _.setRequestHeader(n, e._xhr.headers[n]) }), _.onload = function () { var n = (_.status + '')[0]; if('0' !== n && '2' !== n && '3' !== n)return void e._emit('loaderror', null, 'Failed loading audio file with status: ' + _.status + '.'); i(_.response, e) }, _.onerror = function () { e._webAudio && (e._html5 = !0, e._webAudio = !1, e._sounds = [], delete r[n], e.load()) }, u(_) } }, u = function (e) { try{ e.send() }catch(n) { e.onerror() } }, i = function (e, o) { var t = function () { o._emit('loaderror', null, 'Decoding audio data failed.') }, a = function (e) { e && o._sounds.length > 0 ? (r[o._src] = e, d(o, e)) : t() }; 'undefined' != typeof Promise && 1 === n.ctx.decodeAudioData.length ? n.ctx.decodeAudioData(e).then(a).catch(t) : n.ctx.decodeAudioData(e, a, t) }, d = function (e, n) { n && !e._duration && (e._duration = n.duration), 0 === Object.keys(e._sprite).length && (e._sprite = {__default: [0, 1e3 * e._duration]}), 'loaded' !== e._state && (e._state = 'loaded', e._emit('load'), e._loadQueue()) }, _ = function () { if(n.usingWebAudio) { try{ 'undefined' != typeof AudioContext ? n.ctx = new AudioContext : 'undefined' != typeof webkitAudioContext ? n.ctx = new webkitAudioContext : n.usingWebAudio = !1 }catch(e) { n.usingWebAudio = !1 }n.ctx || (n.usingWebAudio = !1); var e = /iP(hone|od|ad)/.test(n._navigator && n._navigator.platform), o = n._navigator && n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/), t = o ? parseInt(o[1], 10) : null; if(e && t && t < 9) { var r = /safari/.test(n._navigator && n._navigator.userAgent.toLowerCase()); n._navigator && !r && (n.usingWebAudio = !1) }n.usingWebAudio && (n.masterGain = void 0 === n.ctx.createGain ? n.ctx.createGainNode() : n.ctx.createGain(), n.masterGain.gain.setValueAtTime(n._muted ? 0 : n._volume, n.ctx.currentTime), n.masterGain.connect(n.ctx.destination)), n._setup() } }; 'function' == typeof define && define.amd && define([], function () { return{Howler: n, Howl: o} }), 'undefined' != typeof exports && (exports.Howler = n, exports.Howl = o), 'undefined' != typeof global ? (global.HowlerGlobal = e, global.Howler = n, global.Howl = o, global.Sound = t) : 'undefined' != typeof window && (window.HowlerGlobal = e, window.Howler = n, window.Howl = o, window.Sound = t) }();
 /*! Spatial Plugin */
-!function () { 'use strict'; HowlerGlobal.prototype._pos = [0, 0, 0], HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0], HowlerGlobal.prototype.stereo = function (e) { var n = this; if(!n.ctx || !n.ctx.listener)return n; for(var t = n._howls.length - 1; t >= 0; t--)n._howls[t].stereo(e); return n }, HowlerGlobal.prototype.pos = function (e, n, t) { var r = this; return r.ctx && r.ctx.listener ? (n = 'number' != typeof n ? r._pos[1] : n, t = 'number' != typeof t ? r._pos[2] : t, 'number' != typeof e ? r._pos : (r._pos = [e, n, t], void 0 !== r.ctx.listener.positionX ? (r.ctx.listener.positionX.setTargetAtTime(r._pos[0], Howler.ctx.currentTime, .1), r.ctx.listener.positionY.setTargetAtTime(r._pos[1], Howler.ctx.currentTime, .1), r.ctx.listener.positionZ.setTargetAtTime(r._pos[2], Howler.ctx.currentTime, .1)) : r.ctx.listener.setPosition(r._pos[0], r._pos[1], r._pos[2]), r)) : r }, HowlerGlobal.prototype.orientation = function (e, n, t, r, o, i) { var a = this; if(!a.ctx || !a.ctx.listener)return a; var s = a._orientation; return n = 'number' != typeof n ? s[1] : n, t = 'number' != typeof t ? s[2] : t, r = 'number' != typeof r ? s[3] : r, o = 'number' != typeof o ? s[4] : o, i = 'number' != typeof i ? s[5] : i, 'number' != typeof e ? s : (a._orientation = [e, n, t, r, o, i], void 0 !== a.ctx.listener.forwardX ? (a.ctx.listener.forwardX.setTargetAtTime(e, Howler.ctx.currentTime, .1), a.ctx.listener.forwardY.setTargetAtTime(n, Howler.ctx.currentTime, .1), a.ctx.listener.forwardZ.setTargetAtTime(t, Howler.ctx.currentTime, .1), a.ctx.listener.upX.setTargetAtTime(r, Howler.ctx.currentTime, .1), a.ctx.listener.upY.setTargetAtTime(o, Howler.ctx.currentTime, .1), a.ctx.listener.upZ.setTargetAtTime(i, Howler.ctx.currentTime, .1)) : a.ctx.listener.setOrientation(e, n, t, r, o, i), a) }, Howl.prototype.init = function (e) { return function (n) { var t = this; return t._orientation = n.orientation || [1, 0, 0], t._stereo = n.stereo || null, t._pos = n.pos || null, t._pannerAttr = {coneInnerAngle:void 0 !== n.coneInnerAngle ? n.coneInnerAngle : 360, coneOuterAngle:void 0 !== n.coneOuterAngle ? n.coneOuterAngle : 360, coneOuterGain:void 0 !== n.coneOuterGain ? n.coneOuterGain : 0, distanceModel:void 0 !== n.distanceModel ? n.distanceModel : 'inverse', maxDistance:void 0 !== n.maxDistance ? n.maxDistance : 1e4, panningModel:void 0 !== n.panningModel ? n.panningModel : 'HRTF', refDistance:void 0 !== n.refDistance ? n.refDistance : 1, rolloffFactor:void 0 !== n.rolloffFactor ? n.rolloffFactor : 1}, t._onstereo = n.onstereo ? [{fn:n.onstereo}] : [], t._onpos = n.onpos ? [{fn:n.onpos}] : [], t._onorientation = n.onorientation ? [{fn:n.onorientation}] : [], e.call(this, n) } }(Howl.prototype.init), Howl.prototype.stereo = function (n, t) { var r = this; if(!r._webAudio)return r; if('loaded' !== r._state)return r._queue.push({event:'stereo', action:function () { r.stereo(n, t) }}), r; var o = void 0 === Howler.ctx.createStereoPanner ? 'spatial' : 'stereo'; if(void 0 === t) { if('number' != typeof n)return r._stereo; r._stereo = n, r._pos = [n, 0, 0] }for(var i = r._getSoundIds(t), a = 0; a < i.length; a++) { var s = r._soundById(i[a]); if(s) { if('number' != typeof n)return s._stereo; s._stereo = n, s._pos = [n, 0, 0], s._node && (s._pannerAttr.panningModel = 'equalpower', s._panner && s._panner.pan || e(s, o), 'spatial' === o ? void 0 !== s._panner.positionX ? (s._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), s._panner.positionY.setValueAtTime(0, Howler.ctx.currentTime), s._panner.positionZ.setValueAtTime(0, Howler.ctx.currentTime)) : s._panner.setPosition(n, 0, 0) : s._panner.pan.setValueAtTime(n, Howler.ctx.currentTime)), r._emit('stereo', s._id) } }return r }, Howl.prototype.pos = function (n, t, r, o) { var i = this; if(!i._webAudio)return i; if('loaded' !== i._state)return i._queue.push({event:'pos', action:function () { i.pos(n, t, r, o) }}), i; if(t = 'number' != typeof t ? 0 : t, r = 'number' != typeof r ? -.5 : r, void 0 === o) { if('number' != typeof n)return i._pos; i._pos = [n, t, r] }for(var a = i._getSoundIds(o), s = 0; s < a.length; s++) { var p = i._soundById(a[s]); if(p) { if('number' != typeof n)return p._pos; p._pos = [n, t, r], p._node && (p._panner && !p._panner.pan || e(p, 'spatial'), void 0 !== p._panner.positionX ? (p._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.positionY.setValueAtTime(t, Howler.ctx.currentTime), p._panner.positionZ.setValueAtTime(r, Howler.ctx.currentTime)) : p._panner.setPosition(n, t, r)), i._emit('pos', p._id) } }return i }, Howl.prototype.orientation = function (n, t, r, o) { var i = this; if(!i._webAudio)return i; if('loaded' !== i._state)return i._queue.push({event:'orientation', action:function () { i.orientation(n, t, r, o) }}), i; if(t = 'number' != typeof t ? i._orientation[1] : t, r = 'number' != typeof r ? i._orientation[2] : r, void 0 === o) { if('number' != typeof n)return i._orientation; i._orientation = [n, t, r] }for(var a = i._getSoundIds(o), s = 0; s < a.length; s++) { var p = i._soundById(a[s]); if(p) { if('number' != typeof n)return p._orientation; p._orientation = [n, t, r], p._node && (p._panner || (p._pos || (p._pos = i._pos || [0, 0, -.5]), e(p, 'spatial')), void 0 !== p._panner.orientationX ? (p._panner.orientationX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.orientationY.setValueAtTime(t, Howler.ctx.currentTime), p._panner.orientationZ.setValueAtTime(r, Howler.ctx.currentTime)) : p._panner.setOrientation(n, t, r)), i._emit('orientation', p._id) } }return i }, Howl.prototype.pannerAttr = function () { var n, t, r, o = this, i = arguments; if(!o._webAudio)return o; if(0 === i.length)return o._pannerAttr; if(1 === i.length) { if('object' != typeof i[0])return r = o._soundById(parseInt(i[0], 10)), r ? r._pannerAttr : o._pannerAttr; n = i[0], void 0 === t && (n.pannerAttr || (n.pannerAttr = {coneInnerAngle:n.coneInnerAngle, coneOuterAngle:n.coneOuterAngle, coneOuterGain:n.coneOuterGain, distanceModel:n.distanceModel, maxDistance:n.maxDistance, refDistance:n.refDistance, rolloffFactor:n.rolloffFactor, panningModel:n.panningModel}), o._pannerAttr = {coneInnerAngle:void 0 !== n.pannerAttr.coneInnerAngle ? n.pannerAttr.coneInnerAngle : o._coneInnerAngle, coneOuterAngle:void 0 !== n.pannerAttr.coneOuterAngle ? n.pannerAttr.coneOuterAngle : o._coneOuterAngle, coneOuterGain:void 0 !== n.pannerAttr.coneOuterGain ? n.pannerAttr.coneOuterGain : o._coneOuterGain, distanceModel:void 0 !== n.pannerAttr.distanceModel ? n.pannerAttr.distanceModel : o._distanceModel, maxDistance:void 0 !== n.pannerAttr.maxDistance ? n.pannerAttr.maxDistance : o._maxDistance, refDistance:void 0 !== n.pannerAttr.refDistance ? n.pannerAttr.refDistance : o._refDistance, rolloffFactor:void 0 !== n.pannerAttr.rolloffFactor ? n.pannerAttr.rolloffFactor : o._rolloffFactor, panningModel:void 0 !== n.pannerAttr.panningModel ? n.pannerAttr.panningModel : o._panningModel}) }else 2 === i.length && (n = i[0], t = parseInt(i[1], 10)); for(var a = o._getSoundIds(t), s = 0; s < a.length; s++)if(r = o._soundById(a[s])) { var p = r._pannerAttr; p = {coneInnerAngle:void 0 !== n.coneInnerAngle ? n.coneInnerAngle : p.coneInnerAngle, coneOuterAngle:void 0 !== n.coneOuterAngle ? n.coneOuterAngle : p.coneOuterAngle, coneOuterGain:void 0 !== n.coneOuterGain ? n.coneOuterGain : p.coneOuterGain, distanceModel:void 0 !== n.distanceModel ? n.distanceModel : p.distanceModel, maxDistance:void 0 !== n.maxDistance ? n.maxDistance : p.maxDistance, refDistance:void 0 !== n.refDistance ? n.refDistance : p.refDistance, rolloffFactor:void 0 !== n.rolloffFactor ? n.rolloffFactor : p.rolloffFactor, panningModel:void 0 !== n.panningModel ? n.panningModel : p.panningModel}; var c = r._panner; c ? (c.coneInnerAngle = p.coneInnerAngle, c.coneOuterAngle = p.coneOuterAngle, c.coneOuterGain = p.coneOuterGain, c.distanceModel = p.distanceModel, c.maxDistance = p.maxDistance, c.refDistance = p.refDistance, c.rolloffFactor = p.rolloffFactor, c.panningModel = p.panningModel) : (r._pos || (r._pos = o._pos || [0, 0, -.5]), e(r, 'spatial')) }return o }, Sound.prototype.init = function (e) { return function () { var n = this, t = n._parent; n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, e.call(this), n._stereo ? t.stereo(n._stereo) : n._pos && t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) } }(Sound.prototype.init), Sound.prototype.reset = function (e) { return function () { var n = this, t = n._parent; return n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, n._stereo ? t.stereo(n._stereo) : n._pos ? t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) : n._panner && (n._panner.disconnect(0), n._panner = void 0, t._refreshBuffer(n)), e.call(this) } }(Sound.prototype.reset); var e = function (e, n) { n = n || 'spatial', 'spatial' === n ? (e._panner = Howler.ctx.createPanner(), e._panner.coneInnerAngle = e._pannerAttr.coneInnerAngle, e._panner.coneOuterAngle = e._pannerAttr.coneOuterAngle, e._panner.coneOuterGain = e._pannerAttr.coneOuterGain, e._panner.distanceModel = e._pannerAttr.distanceModel, e._panner.maxDistance = e._pannerAttr.maxDistance, e._panner.refDistance = e._pannerAttr.refDistance, e._panner.rolloffFactor = e._pannerAttr.rolloffFactor, e._panner.panningModel = e._pannerAttr.panningModel, void 0 !== e._panner.positionX ? (e._panner.positionX.setValueAtTime(e._pos[0], Howler.ctx.currentTime), e._panner.positionY.setValueAtTime(e._pos[1], Howler.ctx.currentTime), e._panner.positionZ.setValueAtTime(e._pos[2], Howler.ctx.currentTime)) : e._panner.setPosition(e._pos[0], e._pos[1], e._pos[2]), void 0 !== e._panner.orientationX ? (e._panner.orientationX.setValueAtTime(e._orientation[0], Howler.ctx.currentTime), e._panner.orientationY.setValueAtTime(e._orientation[1], Howler.ctx.currentTime), e._panner.orientationZ.setValueAtTime(e._orientation[2], Howler.ctx.currentTime)) : e._panner.setOrientation(e._orientation[0], e._orientation[1], e._orientation[2])) : (e._panner = Howler.ctx.createStereoPanner(), e._panner.pan.setValueAtTime(e._stereo, Howler.ctx.currentTime)), e._panner.connect(e._node), e._paused || e._parent.pause(e._id, !0).play(e._id, !0) } }();
+!function () { 'use strict'; HowlerGlobal.prototype._pos = [0, 0, 0], HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0], HowlerGlobal.prototype.stereo = function (e) { var n = this; if(!n.ctx || !n.ctx.listener)return n; for(var t = n._howls.length - 1; t >= 0; t--)n._howls[t].stereo(e); return n }, HowlerGlobal.prototype.pos = function (e, n, t) { var r = this; return r.ctx && r.ctx.listener ? (n = 'number' != typeof n ? r._pos[1] : n, t = 'number' != typeof t ? r._pos[2] : t, 'number' != typeof e ? r._pos : (r._pos = [e, n, t], void 0 !== r.ctx.listener.positionX ? (r.ctx.listener.positionX.setTargetAtTime(r._pos[0], Howler.ctx.currentTime, .1), r.ctx.listener.positionY.setTargetAtTime(r._pos[1], Howler.ctx.currentTime, .1), r.ctx.listener.positionZ.setTargetAtTime(r._pos[2], Howler.ctx.currentTime, .1)) : r.ctx.listener.setPosition(r._pos[0], r._pos[1], r._pos[2]), r)) : r }, HowlerGlobal.prototype.orientation = function (e, n, t, r, o, i) { var a = this; if(!a.ctx || !a.ctx.listener)return a; var s = a._orientation; return n = 'number' != typeof n ? s[1] : n, t = 'number' != typeof t ? s[2] : t, r = 'number' != typeof r ? s[3] : r, o = 'number' != typeof o ? s[4] : o, i = 'number' != typeof i ? s[5] : i, 'number' != typeof e ? s : (a._orientation = [e, n, t, r, o, i], void 0 !== a.ctx.listener.forwardX ? (a.ctx.listener.forwardX.setTargetAtTime(e, Howler.ctx.currentTime, .1), a.ctx.listener.forwardY.setTargetAtTime(n, Howler.ctx.currentTime, .1), a.ctx.listener.forwardZ.setTargetAtTime(t, Howler.ctx.currentTime, .1), a.ctx.listener.upX.setTargetAtTime(r, Howler.ctx.currentTime, .1), a.ctx.listener.upY.setTargetAtTime(o, Howler.ctx.currentTime, .1), a.ctx.listener.upZ.setTargetAtTime(i, Howler.ctx.currentTime, .1)) : a.ctx.listener.setOrientation(e, n, t, r, o, i), a) }, Howl.prototype.init = function (e) { return function (n) { var t = this; return t._orientation = n.orientation || [1, 0, 0], t._stereo = n.stereo || null, t._pos = n.pos || null, t._pannerAttr = {coneInnerAngle: void 0 !== n.coneInnerAngle ? n.coneInnerAngle : 360, coneOuterAngle: void 0 !== n.coneOuterAngle ? n.coneOuterAngle : 360, coneOuterGain: void 0 !== n.coneOuterGain ? n.coneOuterGain : 0, distanceModel: void 0 !== n.distanceModel ? n.distanceModel : 'inverse', maxDistance: void 0 !== n.maxDistance ? n.maxDistance : 1e4, panningModel: void 0 !== n.panningModel ? n.panningModel : 'HRTF', refDistance: void 0 !== n.refDistance ? n.refDistance : 1, rolloffFactor: void 0 !== n.rolloffFactor ? n.rolloffFactor : 1}, t._onstereo = n.onstereo ? [{fn: n.onstereo}] : [], t._onpos = n.onpos ? [{fn: n.onpos}] : [], t._onorientation = n.onorientation ? [{fn: n.onorientation}] : [], e.call(this, n) } }(Howl.prototype.init), Howl.prototype.stereo = function (n, t) { var r = this; if(!r._webAudio)return r; if('loaded' !== r._state)return r._queue.push({event: 'stereo', action: function () { r.stereo(n, t) }}), r; var o = void 0 === Howler.ctx.createStereoPanner ? 'spatial' : 'stereo'; if(void 0 === t) { if('number' != typeof n)return r._stereo; r._stereo = n, r._pos = [n, 0, 0] }for(var i = r._getSoundIds(t), a = 0; a < i.length; a++) { var s = r._soundById(i[a]); if(s) { if('number' != typeof n)return s._stereo; s._stereo = n, s._pos = [n, 0, 0], s._node && (s._pannerAttr.panningModel = 'equalpower', s._panner && s._panner.pan || e(s, o), 'spatial' === o ? void 0 !== s._panner.positionX ? (s._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), s._panner.positionY.setValueAtTime(0, Howler.ctx.currentTime), s._panner.positionZ.setValueAtTime(0, Howler.ctx.currentTime)) : s._panner.setPosition(n, 0, 0) : s._panner.pan.setValueAtTime(n, Howler.ctx.currentTime)), r._emit('stereo', s._id) } }return r }, Howl.prototype.pos = function (n, t, r, o) { var i = this; if(!i._webAudio)return i; if('loaded' !== i._state)return i._queue.push({event: 'pos', action: function () { i.pos(n, t, r, o) }}), i; if(t = 'number' != typeof t ? 0 : t, r = 'number' != typeof r ? -.5 : r, void 0 === o) { if('number' != typeof n)return i._pos; i._pos = [n, t, r] }for(var a = i._getSoundIds(o), s = 0; s < a.length; s++) { var p = i._soundById(a[s]); if(p) { if('number' != typeof n)return p._pos; p._pos = [n, t, r], p._node && (p._panner && !p._panner.pan || e(p, 'spatial'), void 0 !== p._panner.positionX ? (p._panner.positionX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.positionY.setValueAtTime(t, Howler.ctx.currentTime), p._panner.positionZ.setValueAtTime(r, Howler.ctx.currentTime)) : p._panner.setPosition(n, t, r)), i._emit('pos', p._id) } }return i }, Howl.prototype.orientation = function (n, t, r, o) { var i = this; if(!i._webAudio)return i; if('loaded' !== i._state)return i._queue.push({event: 'orientation', action: function () { i.orientation(n, t, r, o) }}), i; if(t = 'number' != typeof t ? i._orientation[1] : t, r = 'number' != typeof r ? i._orientation[2] : r, void 0 === o) { if('number' != typeof n)return i._orientation; i._orientation = [n, t, r] }for(var a = i._getSoundIds(o), s = 0; s < a.length; s++) { var p = i._soundById(a[s]); if(p) { if('number' != typeof n)return p._orientation; p._orientation = [n, t, r], p._node && (p._panner || (p._pos || (p._pos = i._pos || [0, 0, -.5]), e(p, 'spatial')), void 0 !== p._panner.orientationX ? (p._panner.orientationX.setValueAtTime(n, Howler.ctx.currentTime), p._panner.orientationY.setValueAtTime(t, Howler.ctx.currentTime), p._panner.orientationZ.setValueAtTime(r, Howler.ctx.currentTime)) : p._panner.setOrientation(n, t, r)), i._emit('orientation', p._id) } }return i }, Howl.prototype.pannerAttr = function () { var n, t, r, o = this, i = arguments; if(!o._webAudio)return o; if(0 === i.length)return o._pannerAttr; if(1 === i.length) { if('object' != typeof i[0])return r = o._soundById(parseInt(i[0], 10)), r ? r._pannerAttr : o._pannerAttr; n = i[0], void 0 === t && (n.pannerAttr || (n.pannerAttr = {coneInnerAngle: n.coneInnerAngle, coneOuterAngle: n.coneOuterAngle, coneOuterGain: n.coneOuterGain, distanceModel: n.distanceModel, maxDistance: n.maxDistance, refDistance: n.refDistance, rolloffFactor: n.rolloffFactor, panningModel: n.panningModel}), o._pannerAttr = {coneInnerAngle: void 0 !== n.pannerAttr.coneInnerAngle ? n.pannerAttr.coneInnerAngle : o._coneInnerAngle, coneOuterAngle: void 0 !== n.pannerAttr.coneOuterAngle ? n.pannerAttr.coneOuterAngle : o._coneOuterAngle, coneOuterGain: void 0 !== n.pannerAttr.coneOuterGain ? n.pannerAttr.coneOuterGain : o._coneOuterGain, distanceModel: void 0 !== n.pannerAttr.distanceModel ? n.pannerAttr.distanceModel : o._distanceModel, maxDistance: void 0 !== n.pannerAttr.maxDistance ? n.pannerAttr.maxDistance : o._maxDistance, refDistance: void 0 !== n.pannerAttr.refDistance ? n.pannerAttr.refDistance : o._refDistance, rolloffFactor: void 0 !== n.pannerAttr.rolloffFactor ? n.pannerAttr.rolloffFactor : o._rolloffFactor, panningModel: void 0 !== n.pannerAttr.panningModel ? n.pannerAttr.panningModel : o._panningModel}) }else 2 === i.length && (n = i[0], t = parseInt(i[1], 10)); for(var a = o._getSoundIds(t), s = 0; s < a.length; s++)if(r = o._soundById(a[s])) { var p = r._pannerAttr; p = {coneInnerAngle: void 0 !== n.coneInnerAngle ? n.coneInnerAngle : p.coneInnerAngle, coneOuterAngle: void 0 !== n.coneOuterAngle ? n.coneOuterAngle : p.coneOuterAngle, coneOuterGain: void 0 !== n.coneOuterGain ? n.coneOuterGain : p.coneOuterGain, distanceModel: void 0 !== n.distanceModel ? n.distanceModel : p.distanceModel, maxDistance: void 0 !== n.maxDistance ? n.maxDistance : p.maxDistance, refDistance: void 0 !== n.refDistance ? n.refDistance : p.refDistance, rolloffFactor: void 0 !== n.rolloffFactor ? n.rolloffFactor : p.rolloffFactor, panningModel: void 0 !== n.panningModel ? n.panningModel : p.panningModel}; var c = r._panner; c ? (c.coneInnerAngle = p.coneInnerAngle, c.coneOuterAngle = p.coneOuterAngle, c.coneOuterGain = p.coneOuterGain, c.distanceModel = p.distanceModel, c.maxDistance = p.maxDistance, c.refDistance = p.refDistance, c.rolloffFactor = p.rolloffFactor, c.panningModel = p.panningModel) : (r._pos || (r._pos = o._pos || [0, 0, -.5]), e(r, 'spatial')) }return o }, Sound.prototype.init = function (e) { return function () { var n = this, t = n._parent; n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, e.call(this), n._stereo ? t.stereo(n._stereo) : n._pos && t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) } }(Sound.prototype.init), Sound.prototype.reset = function (e) { return function () { var n = this, t = n._parent; return n._orientation = t._orientation, n._stereo = t._stereo, n._pos = t._pos, n._pannerAttr = t._pannerAttr, n._stereo ? t.stereo(n._stereo) : n._pos ? t.pos(n._pos[0], n._pos[1], n._pos[2], n._id) : n._panner && (n._panner.disconnect(0), n._panner = void 0, t._refreshBuffer(n)), e.call(this) } }(Sound.prototype.reset); var e = function (e, n) { n = n || 'spatial', 'spatial' === n ? (e._panner = Howler.ctx.createPanner(), e._panner.coneInnerAngle = e._pannerAttr.coneInnerAngle, e._panner.coneOuterAngle = e._pannerAttr.coneOuterAngle, e._panner.coneOuterGain = e._pannerAttr.coneOuterGain, e._panner.distanceModel = e._pannerAttr.distanceModel, e._panner.maxDistance = e._pannerAttr.maxDistance, e._panner.refDistance = e._pannerAttr.refDistance, e._panner.rolloffFactor = e._pannerAttr.rolloffFactor, e._panner.panningModel = e._pannerAttr.panningModel, void 0 !== e._panner.positionX ? (e._panner.positionX.setValueAtTime(e._pos[0], Howler.ctx.currentTime), e._panner.positionY.setValueAtTime(e._pos[1], Howler.ctx.currentTime), e._panner.positionZ.setValueAtTime(e._pos[2], Howler.ctx.currentTime)) : e._panner.setPosition(e._pos[0], e._pos[1], e._pos[2]), void 0 !== e._panner.orientationX ? (e._panner.orientationX.setValueAtTime(e._orientation[0], Howler.ctx.currentTime), e._panner.orientationY.setValueAtTime(e._orientation[1], Howler.ctx.currentTime), e._panner.orientationZ.setValueAtTime(e._orientation[2], Howler.ctx.currentTime)) : e._panner.setOrientation(e._orientation[0], e._orientation[1], e._orientation[2])) : (e._panner = Howler.ctx.createStereoPanner(), e._panner.pan.setValueAtTime(e._stereo, Howler.ctx.currentTime)), e._panner.connect(e._node), e._paused || e._parent.pause(e._id, !0).play(e._id, !0) } }();
diff --git a/player/js/animation/AnimationManager.js b/player/js/animation/AnimationManager.js
index 978cc07..bf2257b 100644
--- a/player/js/animation/AnimationManager.js
+++ b/player/js/animation/AnimationManager.js
@@ -62,7 +62,7 @@
     animItem.addEventListener('destroy', removeElement);
     animItem.addEventListener('_active', addPlayingCount);
     animItem.addEventListener('_idle', subtractPlayingCount);
-    registeredAnimations.push({elem: element, animation:animItem});
+    registeredAnimations.push({elem: element, animation: animItem});
     len += 1;
   }
 
diff --git a/player/js/animation/AnimationManagerWorkerOverride.js b/player/js/animation/AnimationManagerWorkerOverride.js
index 58445af..ec4d7b5 100644
--- a/player/js/animation/AnimationManagerWorkerOverride.js
+++ b/player/js/animation/AnimationManagerWorkerOverride.js
@@ -62,7 +62,7 @@
     animItem.addEventListener('destroy', removeElement);
     animItem.addEventListener('_active', addPlayingCount);
     animItem.addEventListener('_idle', subtractPlayingCount);
-    registeredAnimations.push({elem: element, animation:animItem});
+    registeredAnimations.push({elem: element, animation: animItem});
     len += 1;
   }
 
diff --git a/player/js/elements/AudioElement.js b/player/js/elements/AudioElement.js
index 6592d08..ba492e5 100644
--- a/player/js/elements/AudioElement.js
+++ b/player/js/elements/AudioElement.js
@@ -9,7 +9,7 @@
   this.audio = this.globalData.audioController.createAudio(assetPath);
   this._currentTime = 0;
   this.globalData.audioController.addAudio(this);
-  this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {_placeholder:true};
+  this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {_placeholder: true};
 }
 
 AudioElement.prototype.prepareFrame = function (num) {
diff --git a/player/js/elements/ImageElement.js b/player/js/elements/ImageElement.js
index 1911a18..6269954 100644
--- a/player/js/elements/ImageElement.js
+++ b/player/js/elements/ImageElement.js
@@ -1,7 +1,7 @@
 function IImageElement(data, globalData, comp) {
   this.assetData = globalData.getAssetData(data.refId);
   this.initElement(data, globalData, comp);
-  this.sourceRect = {top:0, left:0, width:this.assetData.w, height:this.assetData.h};
+  this.sourceRect = {top: 0, left: 0, width: this.assetData.w, height: this.assetData.h};
 }
 
 extendPrototype([BaseElement, TransformElement, SVGBaseElement, HierarchyElement, FrameElement, RenderableDOMElement], IImageElement);
diff --git a/player/js/elements/canvasElements/CVCompElement.js b/player/js/elements/canvasElements/CVCompElement.js
index 397a40a..149092a 100644
--- a/player/js/elements/canvasElements/CVCompElement.js
+++ b/player/js/elements/canvasElements/CVCompElement.js
@@ -4,7 +4,7 @@
   this.pendingElements = [];
   this.elements = createSizedArray(this.layers.length);
   this.initElement(data, globalData, comp);
-  this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {_placeholder:true};
+  this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {_placeholder: true};
 }
 
 extendPrototype([CanvasRenderer, ICompElement, CVBaseElement], CVCompElement);
diff --git a/player/js/elements/canvasElements/CVShapeElement.js b/player/js/elements/canvasElements/CVShapeElement.js
index 0d84f8c..e57d793 100644
--- a/player/js/elements/canvasElements/CVShapeElement.js
+++ b/player/js/elements/canvasElements/CVShapeElement.js
@@ -14,7 +14,7 @@
 
 CVShapeElement.prototype.initElement = RenderableDOMElement.prototype.initElement;
 
-CVShapeElement.prototype.transformHelper = {opacity:1, _opMdf:false};
+CVShapeElement.prototype.transformHelper = {opacity: 1, _opMdf: false};
 
 CVShapeElement.prototype.dashResetter = [];
 
@@ -40,8 +40,8 @@
   } else if (data.ty === 'gf' || data.ty === 'gs') {
     elementData.s = PropertyFactory.getProp(this, data.s, 1, null, this);
     elementData.e = PropertyFactory.getProp(this, data.e, 1, null, this);
-    elementData.h = PropertyFactory.getProp(this, data.h || {k:0}, 0, 0.01, this);
-    elementData.a = PropertyFactory.getProp(this, data.a || {k:0}, 0, degToRads, this);
+    elementData.h = PropertyFactory.getProp(this, data.h || {k: 0}, 0, 0.01, this);
+    elementData.a = PropertyFactory.getProp(this, data.a || {k: 0}, 0, degToRads, this);
     elementData.g = new GradientProperty(this, data.g, this);
   }
   elementData.o = PropertyFactory.getProp(this, data.o, 0, 0.01, this);
@@ -81,9 +81,9 @@
 
 CVShapeElement.prototype.createTransformElement = function (data) {
   var elementData = {
-    transform : {
+    transform: {
       opacity: 1,
-      _opMdf:false,
+      _opMdf: false,
       key: this.transformsManager.getNewKey(),
       op: PropertyFactory.getProp(this, data.o, 0, 0.01, this),
       mProps: TransformPropertyFactory.getTransformProperty(this, data, this),
diff --git a/player/js/elements/helpers/RenderableElement.js b/player/js/elements/helpers/RenderableElement.js
index e1d453a..1560079 100644
--- a/player/js/elements/helpers/RenderableElement.js
+++ b/player/js/elements/helpers/RenderableElement.js
@@ -72,17 +72,17 @@
   },
   sourceRectAtTime: function () {
     return {
-      top:0,
-      left:0,
-      width:100,
-      height:100,
+      top: 0,
+      left: 0,
+      width: 100,
+      height: 100,
     };
   },
   getLayerSize: function () {
     if(this.data.ty === 5) {
-      return {w:this.data.textData.width, h:this.data.textData.height};
+      return {w: this.data.textData.width, h: this.data.textData.height};
     }else{
-      return {w:this.data.width, h:this.data.height};
+      return {w: this.data.width, h: this.data.height};
     }
   },
 };
diff --git a/player/js/elements/helpers/TransformElement.js b/player/js/elements/helpers/TransformElement.js
index 2165b1d..ac1e1cc 100644
--- a/player/js/elements/helpers/TransformElement.js
+++ b/player/js/elements/helpers/TransformElement.js
@@ -3,7 +3,7 @@
 TransformElement.prototype = {
   initTransform: function () {
     this.finalTransform = {
-      mProp: this.data.ks ? TransformPropertyFactory.getTransformProperty(this, this.data.ks, this) : {o:0},
+      mProp: this.data.ks ? TransformPropertyFactory.getTransformProperty(this, this.data.ks, this) : {o: 0},
       _matMdf: false,
       _opMdf: false,
       mat: new Matrix(),
diff --git a/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js b/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js
index f8827ab..021f2cc 100644
--- a/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js
+++ b/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js
@@ -8,8 +8,8 @@
   this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, this);
   this.s = PropertyFactory.getProp(elem, data.s, 1, null, this);
   this.e = PropertyFactory.getProp(elem, data.e, 1, null, this);
-  this.h = PropertyFactory.getProp(elem, data.h || {k:0}, 0, 0.01, this);
-  this.a = PropertyFactory.getProp(elem, data.a || {k:0}, 0, degToRads, this);
+  this.h = PropertyFactory.getProp(elem, data.h || {k: 0}, 0, 0.01, this);
+  this.a = PropertyFactory.getProp(elem, data.a || {k: 0}, 0, degToRads, this);
   this.g = new GradientProperty(elem, data.g, this);
   this.style = styleOb;
   this.stops = [];
diff --git a/player/js/elements/htmlElements/HCompElement.js b/player/js/elements/htmlElements/HCompElement.js
index 222973c..ac4a609 100644
--- a/player/js/elements/htmlElements/HCompElement.js
+++ b/player/js/elements/htmlElements/HCompElement.js
@@ -5,7 +5,7 @@
   this.pendingElements = [];
   this.elements = this.layers ? createSizedArray(this.layers.length) : [];
   this.initElement(data, globalData, comp);
-  this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {_placeholder:true};
+  this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {_placeholder: true};
 }
 
 extendPrototype([HybridRenderer, ICompElement, HBaseElement], HCompElement);
diff --git a/player/js/elements/htmlElements/HShapeElement.js b/player/js/elements/htmlElements/HShapeElement.js
index ff11412..2777aaf 100644
--- a/player/js/elements/htmlElements/HShapeElement.js
+++ b/player/js/elements/htmlElements/HShapeElement.js
@@ -19,7 +19,7 @@
   // List of elements that have been created
   this.prevViewData = [];
   this.currentBBox = {
-    x:999999,
+    x: 999999,
     y: -999999,
     h: 0,
     w: 0,
@@ -89,19 +89,19 @@
 }
 
 HShapeElement.prototype.shapeBoundingBox = {
-  left:0,
-  right:0,
-  top:0,
-  bottom:0,
+  left: 0,
+  right: 0,
+  top: 0,
+  bottom: 0,
 }
 
 HShapeElement.prototype.tempBoundingBox = {
-  x:0,
-  xMax:0,
-  y:0,
-  yMax:0,
-  width:0,
-  height:0,
+  x: 0,
+  xMax: 0,
+  y: 0,
+  yMax: 0,
+  width: 0,
+  height: 0,
 }
 
 HShapeElement.prototype.getBoundsOfCurve = function (p0, p1, p2, p3) {
diff --git a/player/js/elements/htmlElements/HTextElement.js b/player/js/elements/htmlElements/HTextElement.js
index 0945b5a..18c4697 100644
--- a/player/js/elements/htmlElements/HTextElement.js
+++ b/player/js/elements/htmlElements/HTextElement.js
@@ -2,7 +2,7 @@
   this.textSpans = [];
   this.textPaths = [];
   this.currentBBox = {
-    x:999999,
+    x: 999999,
     y: -999999,
     h: 0,
     w: 0,
diff --git a/player/js/elements/svgElements/SVGCompElement.js b/player/js/elements/svgElements/SVGCompElement.js
index de0dc97..c1cd433 100644
--- a/player/js/elements/svgElements/SVGCompElement.js
+++ b/player/js/elements/svgElements/SVGCompElement.js
@@ -6,7 +6,7 @@
   this.elements = this.layers ? createSizedArray(this.layers.length) : [];
   // this.layerElement = createNS('g');
   this.initElement(data, globalData, comp);
-  this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {_placeholder:true};
+  this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : {_placeholder: true};
 }
 
 extendPrototype([SVGRenderer, ICompElement, SVGBaseElement], SVGCompElement);
diff --git a/player/js/elements/svgElements/effects/SVGProLevelsFilter.js b/player/js/elements/svgElements/effects/SVGProLevelsFilter.js
index 3a75bd0..dd68fc5 100644
--- a/player/js/elements/svgElements/effects/SVGProLevelsFilter.js
+++ b/player/js/elements/svgElements/effects/SVGProLevelsFilter.js
@@ -46,7 +46,7 @@
   var perc;
   var min = Math.min(inputBlack, inputWhite);
   var max = Math.max(inputBlack, inputWhite);
-  var table = Array.call(null, {length:segments});
+  var table = Array.call(null, {length: segments});
   var colorValue;
   var pos = 0;
   var outputDelta = outputWhite - outputBlack; 
diff --git a/player/js/elements/svgElements/effects/SVGStrokeEffect.js b/player/js/elements/svgElements/effects/SVGStrokeEffect.js
index 395ad63..b3d13f0 100644
--- a/player/js/elements/svgElements/effects/SVGStrokeEffect.js
+++ b/player/js/elements/svgElements/effects/SVGStrokeEffect.js
@@ -23,7 +23,7 @@
   for(i; i < len; i += 1) {
     path = createNS('path');
     groupPath.appendChild(path);
-    this.paths.push({p:path, m:i});
+    this.paths.push({p: path, m: i});
   }
   if(this.filterManager.effectElements[10].p.v === 3) {
     var mask = createNS('mask');
diff --git a/player/js/mask.js b/player/js/mask.js
index 3c0c7d5..bdd616a 100644
--- a/player/js/mask.js
+++ b/player/js/mask.js
@@ -77,9 +77,9 @@
       x: x,
       expan: feMorph,
       lastPath: '',
-      lastOperator:'',
-      filterId:filterID,
-      lastRadius:0,
+      lastOperator: '',
+      filterId: filterID,
+      lastRadius: 0,
     };
     if(properties[i].mode == 'i') {
       jLen = currentMasks.length;
@@ -107,7 +107,7 @@
       elem: path,
       lastPath: '',
       op: PropertyFactory.getProp(this.element, properties[i].o, 0, 0.01, this.element),
-      prop:ShapePropertyFactory.getShapeProp(this.element, properties[i], 3),
+      prop: ShapePropertyFactory.getShapeProp(this.element, properties[i], 3),
       invRect: rect,
     };
     if(!this.viewData[i].prop.k) {
diff --git a/player/js/renderers/CanvasRenderer.js b/player/js/renderers/CanvasRenderer.js
index 0226f45..98e4c6f 100644
--- a/player/js/renderers/CanvasRenderer.js
+++ b/player/js/renderers/CanvasRenderer.js
@@ -159,11 +159,11 @@
   this.layers = animData.layers;
   this.transformCanvas = {
     w: animData.w,
-    h:animData.h,
-    sx:0,
-    sy:0,
-    tx:0,
-    ty:0,
+    h: animData.h,
+    sx: 0,
+    sy: 0,
+    tx: 0,
+    ty: 0,
   };
   this.setupGlobalData(animData, document.body);
   this.globalData.canvasContext = this.canvasContext;
diff --git a/player/js/renderers/CanvasRendererWorkerOverride.js b/player/js/renderers/CanvasRendererWorkerOverride.js
index 13df5e5..21b3a93 100644
--- a/player/js/renderers/CanvasRendererWorkerOverride.js
+++ b/player/js/renderers/CanvasRendererWorkerOverride.js
@@ -18,11 +18,11 @@
   this.layers = animData.layers;
   this.transformCanvas = {
     w: animData.w,
-    h:animData.h,
-    sx:0,
-    sy:0,
-    tx:0,
-    ty:0,
+    h: animData.h,
+    sx: 0,
+    sy: 0,
+    tx: 0,
+    ty: 0,
   };
   this.globalData.frameId = 0;
   this.globalData.frameRate = animData.fr;
diff --git a/player/js/renderers/HybridRenderer.js b/player/js/renderers/HybridRenderer.js
index 6da53ad..6f9af44 100644
--- a/player/js/renderers/HybridRenderer.js
+++ b/player/js/renderers/HybridRenderer.js
@@ -143,8 +143,8 @@
   perspectiveElem.appendChild(container);
   // this.resizerElem.appendChild(perspectiveElem);
   var threeDContainerData = {
-    container:container,
-    perspectiveElem:perspectiveElem,
+    container: container,
+    perspectiveElem: perspectiveElem,
     startPos: pos,
     endPos: pos,
     type: type,
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index ddb5f5a..cc7e301 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -137,8 +137,8 @@
       textLayer.t.d = {
         k: [
           {
-            s:documentData,
-            t:0,
+            s: documentData,
+            t: 0,
           },
         ],
       };
diff --git a/player/js/utils/FontManager.js b/player/js/utils/FontManager.js
index 8c6471a..eab215f 100644
--- a/player/js/utils/FontManager.js
+++ b/player/js/utils/FontManager.js
@@ -3,8 +3,8 @@
   var maxWaitingTime = 5000;
   var emptyChar = {
     w: 0,
-    size:0,
-    shapes:[],
+    size: 0,
+    shapes: [],
   };
   var combinedCharacters = [];
   // Hindi characters
@@ -47,7 +47,7 @@
     // Remember width with no applied web font
     var width = node.offsetWidth;
     node.style.fontFamily = trimFontOptions(font) + ', ' + family;
-    return {node:node, w:width, parent:parentNode};
+    return {node: node, w: width, parent: parentNode};
   }
 
   function checkLoadedFonts() {
diff --git a/player/js/utils/PropertyFactory.js b/player/js/utils/PropertyFactory.js
index 8409c89..fb33c1c 100644
--- a/player/js/utils/PropertyFactory.js
+++ b/player/js/utils/PropertyFactory.js
@@ -409,7 +409,7 @@
       this.v[i] = initFrame;
       this.pv[i] = initFrame;
     }
-    this._caching = {lastFrame:initFrame, lastIndex:0, value:createTypedArray('float32', arrLen)};
+    this._caching = {lastFrame: initFrame, lastIndex: 0, value: createTypedArray('float32', arrLen)};
     this.addEffect = addEffect;
   }
 
diff --git a/player/js/utils/TransformProperty.js b/player/js/utils/TransformProperty.js
index 38e07a9..8ad1bcb 100644
--- a/player/js/utils/TransformProperty.js
+++ b/player/js/utils/TransformProperty.js
@@ -169,7 +169,7 @@
         this.pz = PropertyFactory.getProp(elem, data.p.z, 0, 0, this);
       }
     }else{
-      this.p = PropertyFactory.getProp(elem, data.p || {k:[0, 0, 0]}, 1, 0, this);
+      this.p = PropertyFactory.getProp(elem, data.p || {k: [0, 0, 0]}, 1, 0, this);
     }
     if(data.rx) {
       this.rx = PropertyFactory.getProp(elem, data.rx, 0, degToRads, this);
@@ -191,13 +191,13 @@
       this.sk = PropertyFactory.getProp(elem, data.sk, 0, degToRads, this);
       this.sa = PropertyFactory.getProp(elem, data.sa, 0, degToRads, this);
     }
-    this.a = PropertyFactory.getProp(elem, data.a || {k:[0, 0, 0]}, 1, 0, this);
-    this.s = PropertyFactory.getProp(elem, data.s || {k:[100, 100, 100]}, 1, 0.01, this);
+    this.a = PropertyFactory.getProp(elem, data.a || {k: [0, 0, 0]}, 1, 0, this);
+    this.s = PropertyFactory.getProp(elem, data.s || {k: [100, 100, 100]}, 1, 0.01, this);
     // Opacity is not part of the transform properties, that's why it won't use this.dynamicProperties. That way transforms won't get updated if opacity changes.
     if(data.o) {
       this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, elem);
     } else {
-      this.o = {_mdf:false, v:1};
+      this.o = {_mdf: false, v: 1};
     }
     this._isDirty = true;
     if(!this.dynamicProperties.length) {
diff --git a/player/js/utils/bez.js b/player/js/utils/bez.js
index ddb4b97..dd6d47f 100644
--- a/player/js/utils/bez.js
+++ b/player/js/utils/bez.js
@@ -220,12 +220,12 @@
   }
 
   return {
-    getSegmentsLength : getSegmentsLength,
-    getNewSegment : getNewSegment,
-    getPointInSegment : getPointInSegment,
-    buildBezierData : buildBezierData,
-    pointOnLine2D : pointOnLine2D,
-    pointOnLine3D : pointOnLine3D,
+    getSegmentsLength: getSegmentsLength,
+    getNewSegment: getNewSegment,
+    getPointInSegment: getPointInSegment,
+    buildBezierData: buildBezierData,
+    pointOnLine2D: pointOnLine2D,
+    pointOnLine3D: pointOnLine3D,
   };
 }
 
diff --git a/player/js/utils/expressions/ExpressionValueFactory.js b/player/js/utils/expressions/ExpressionValueFactory.js
index 20c55d1..651a612 100644
--- a/player/js/utils/expressions/ExpressionValueFactory.js
+++ b/player/js/utils/expressions/ExpressionValueFactory.js
@@ -1,7 +1,7 @@
 var ExpressionPropertyInterface = (function () {
 
-  var defaultUnidimensionalValue = {pv:0, v:0, mult: 1}
-  var defaultMultidimensionalValue = {pv:[0, 0, 0], v:[0, 0, 0], mult: 1}
+  var defaultUnidimensionalValue = {pv: 0, v: 0, mult: 1}
+  var defaultMultidimensionalValue = {pv: [0, 0, 0], v: [0, 0, 0], mult: 1}
 
   function completeProperty(expressionValue, property, type) {
     Object.defineProperty(expressionValue, 'velocity', {
diff --git a/player/js/utils/helpers/arrays.js b/player/js/utils/helpers/arrays.js
index 53d6f5e..7ffb862 100644
--- a/player/js/utils/helpers/arrays.js
+++ b/player/js/utils/helpers/arrays.js
@@ -32,5 +32,5 @@
 }());
 
 function createSizedArray(len) {
-  return Array.apply(null, {length:len});
+  return Array.apply(null, {length: len});
 }
diff --git a/player/js/utils/helpers/blendModes.js b/player/js/utils/helpers/blendModes.js
index 9af4a2f..f5688a6 100644
--- a/player/js/utils/helpers/blendModes.js
+++ b/player/js/utils/helpers/blendModes.js
@@ -1,22 +1,22 @@
 var getBlendMode = (function () {
 
   var blendModeEnums = {
-    0:'source-over',
-    1:'multiply',
-    2:'screen',
-    3:'overlay',
-    4:'darken',
-    5:'lighten',
-    6:'color-dodge',
-    7:'color-burn',
-    8:'hard-light',
-    9:'soft-light',
-    10:'difference',
-    11:'exclusion',
-    12:'hue',
-    13:'saturation',
-    14:'color',
-    15:'luminosity',
+    0: 'source-over',
+    1: 'multiply',
+    2: 'screen',
+    3: 'overlay',
+    4: 'darken',
+    5: 'lighten',
+    6: 'color-dodge',
+    7: 'color-burn',
+    8: 'hard-light',
+    9: 'soft-light',
+    10: 'difference',
+    11: 'exclusion',
+    12: 'hue',
+    13: 'saturation',
+    14: 'color',
+    15: 'luminosity',
   }
 
   return function (mode) {
diff --git a/player/js/utils/shapes/DashProperty.js b/player/js/utils/shapes/DashProperty.js
index c562597..204730c 100644
--- a/player/js/utils/shapes/DashProperty.js
+++ b/player/js/utils/shapes/DashProperty.js
@@ -12,7 +12,7 @@
   for(i = 0; i < len; i += 1) {
     prop = PropertyFactory.getProp(elem, data[i].v, 0, 0, this);
     this.k = prop.k || this.k;
-    this.dataProps[i] = {n:data[i].n, p:prop};
+    this.dataProps[i] = {n: data[i].n, p: prop};
   }
   if(!this.k) {
     this.getValue(true);
diff --git a/player/js/utils/shapes/MouseModifier.js b/player/js/utils/shapes/MouseModifier.js
index 8089d9e..85c63d5 100644
--- a/player/js/utils/shapes/MouseModifier.js
+++ b/player/js/utils/shapes/MouseModifier.js
@@ -169,10 +169,10 @@
 
 
   return {
-    v:vValues,
-    o:oValues,
-    i:iValues,
-    c:path.c,
+    v: vValues,
+    o: oValues,
+    i: iValues,
+    c: path.c,
   };
 }
 
@@ -198,12 +198,12 @@
         for(j = 0; j < jLen; j += 1) {
           if(!this.positions[i][j]) {
             this.positions[i][j] = {
-              v:[],
-              o:[],
-              i:[],
-              distV:[],
-              distO:[],
-              distI:[],
+              v: [],
+              o: [],
+              i: [],
+              distV: [],
+              distO: [],
+              distI: [],
             };
           }
           newPaths.push(this.processPath(shapePaths[j], localMouseCoords, this.positions[i][j]));
diff --git a/player/js/utils/shapes/RepeaterModifier.js b/player/js/utils/shapes/RepeaterModifier.js
index 0f2c507..6d7a9fb 100644
--- a/player/js/utils/shapes/RepeaterModifier.js
+++ b/player/js/utils/shapes/RepeaterModifier.js
@@ -92,10 +92,10 @@
     if(this._groups.length < copies) {
       while(this._groups.length < copies) {
         var group = {
-          it:this.cloneElements(this._elements),
-          ty:'gr',
+          it: this.cloneElements(this._elements),
+          ty: 'gr',
         };
-        group.it.push({'a':{'a':0, 'ix':1, 'k':[0, 0]}, 'nm':'Transform', 'o':{'a':0, 'ix':7, 'k':100}, 'p':{'a':0, 'ix':2, 'k':[0, 0]}, 'r':{'a':1, 'ix':6, 'k':[{s:0, e:0, t:0}, {s:0, e:0, t:1}]}, 's':{'a':0, 'ix':3, 'k':[100, 100]}, 'sa':{'a':0, 'ix':5, 'k':0}, 'sk':{'a':0, 'ix':4, 'k':0}, 'ty':'tr'});
+        group.it.push({'a': {'a': 0, 'ix': 1, 'k': [0, 0]}, 'nm': 'Transform', 'o': {'a': 0, 'ix': 7, 'k': 100}, 'p': {'a': 0, 'ix': 2, 'k': [0, 0]}, 'r': {'a': 1, 'ix': 6, 'k': [{s: 0, e: 0, t: 0}, {s: 0, e: 0, t: 1}]}, 's': {'a': 0, 'ix': 3, 'k': [100, 100]}, 'sa': {'a': 0, 'ix': 5, 'k': 0}, 'sk': {'a': 0, 'ix': 4, 'k': 0}, 'ty': 'tr'});
                 
         this.arr.splice(0, 0, group);
         this._groups.splice(0, 0, group);
diff --git a/player/js/utils/shapes/ShapeModifiers.js b/player/js/utils/shapes/ShapeModifiers.js
index bbaeb9d..89c6182 100644
--- a/player/js/utils/shapes/ShapeModifiers.js
+++ b/player/js/utils/shapes/ShapeModifiers.js
@@ -24,7 +24,7 @@
   if (!this.closed) {
     // Adding shape to dynamic properties. It covers the case where a shape has no effects applied, to reset it's _mdf state on every tick.
     data.sh.container.addDynamicProperty(data.sh);
-    var shapeData = {shape:data.sh, data: data, localShapeCollection:shapeCollection_pool.newShapeCollection()};
+    var shapeData = {shape: data.sh, data: data, localShapeCollection: shapeCollection_pool.newShapeCollection()};
     this.shapes.push(shapeData);
     this.addShapeToModifier(shapeData);
     if (this._isAnimated) {
diff --git a/player/js/utils/shapes/TrimModifier.js b/player/js/utils/shapes/TrimModifier.js
index 7cabf7d..1017d91 100644
--- a/player/js/utils/shapes/TrimModifier.js
+++ b/player/js/utils/shapes/TrimModifier.js
@@ -160,22 +160,22 @@
           segments.length = 0;
           if (shapeE <= 1) {
             segments.push({
-              s:shapeData.totalShapeLength * shapeS,
-              e:shapeData.totalShapeLength * shapeE,
+              s: shapeData.totalShapeLength * shapeS,
+              e: shapeData.totalShapeLength * shapeE,
             });
           } else if (shapeS >= 1) {
             segments.push({
-              s:shapeData.totalShapeLength * (shapeS - 1),
-              e:shapeData.totalShapeLength * (shapeE - 1),
+              s: shapeData.totalShapeLength * (shapeS - 1),
+              e: shapeData.totalShapeLength * (shapeE - 1),
             });
           } else {
             segments.push({
-              s:shapeData.totalShapeLength * shapeS,
-              e:shapeData.totalShapeLength,
+              s: shapeData.totalShapeLength * shapeS,
+              e: shapeData.totalShapeLength,
             });
             segments.push({
-              s:0,
-              e:shapeData.totalShapeLength * (shapeE - 1),
+              s: 0,
+              e: shapeData.totalShapeLength * (shapeE - 1),
             });
           }
           var newShapesData = this.addShapes(shapeData, segments[0]);
diff --git a/player/js/utils/text/TextAnimatorDataProperty.js b/player/js/utils/text/TextAnimatorDataProperty.js
index 3aa41d8..205f958 100644
--- a/player/js/utils/text/TextAnimatorDataProperty.js
+++ b/player/js/utils/text/TextAnimatorDataProperty.js
@@ -1,5 +1,5 @@
 function TextAnimatorDataProperty(elem, animatorProps, container) {
-  var defaultData = {propType:false};
+  var defaultData = {propType: false};
   var getProp = PropertyFactory.getProp;
   var textAnimator_animatables = animatorProps.a;
   this.a = {
diff --git a/player/js/utils/text/TextProperty.js b/player/js/utils/text/TextProperty.js
index 787af44..57c9c99 100644
--- a/player/js/utils/text/TextProperty.js
+++ b/player/js/utils/text/TextProperty.js
@@ -31,14 +31,14 @@
     sw: 0,
     t: 0,
     tr: 0,
-    sz:0,
-    ps:null,
+    sz: 0,
+    ps: null,
     fillColorAnim: false,
     strokeColorAnim: false,
     strokeWidthAnim: false,
     yOffset: 0,
-    finalSize:0,
-    finalText:[],
+    finalSize: 0,
+    finalText: [],
     finalLineHeight: 0,
     __complete: false,
 
@@ -307,7 +307,7 @@
       lineWidth += cLength + trackingOffset + uncollapsedSpaces;
       uncollapsedSpaces = 0;
     }
-    letters.push({l:cLength, an:cLength, add:currentSize, n:newLineFlag, anIndexes:[], val: val, line: currentLine, animatorJustifyOffset: 0});
+    letters.push({l: cLength, an: cLength, add: currentSize, n: newLineFlag, anIndexes: [], val: val, line: currentLine, animatorJustifyOffset: 0});
     if(anchorGrouping == 2) {
       currentSize += cLength;
       if(val === '' || val === ' ' || i === len - 1) {
diff --git a/player/js/utils/text/TextSelectorProperty.js b/player/js/utils/text/TextSelectorProperty.js
index 8ed3ffb..fe7fecb 100644
--- a/player/js/utils/text/TextSelectorProperty.js
+++ b/player/js/utils/text/TextSelectorProperty.js
@@ -12,15 +12,15 @@
     this.finalS = 0;
     this.finalE = 0;
     this.initDynamicPropertyContainer(elem);
-    this.s = PropertyFactory.getProp(elem, data.s || {k:0}, 0, 0, this);
+    this.s = PropertyFactory.getProp(elem, data.s || {k: 0}, 0, 0, this);
     if('e' in data) {
       this.e = PropertyFactory.getProp(elem, data.e, 0, 0, this);
     }else{
-      this.e = {v:100};
+      this.e = {v: 100};
     }
-    this.o = PropertyFactory.getProp(elem, data.o || {k:0}, 0, 0, this);
-    this.xe = PropertyFactory.getProp(elem, data.xe || {k:0}, 0, 0, this);
-    this.ne = PropertyFactory.getProp(elem, data.ne || {k:0}, 0, 0, this);
+    this.o = PropertyFactory.getProp(elem, data.o || {k: 0}, 0, 0, this);
+    this.xe = PropertyFactory.getProp(elem, data.xe || {k: 0}, 0, 0, this);
+    this.ne = PropertyFactory.getProp(elem, data.ne || {k: 0}, 0, 0, this);
     this.a = PropertyFactory.getProp(elem, data.a, 0, 0.01, this);
     if(!this.dynamicProperties.length) {
       this.getValue();