-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreveal.esm.js.map
1 lines (1 loc) · 408 KB
/
reveal.esm.js.map
1
{"version":3,"file":"reveal.esm.js","sources":["../js/components/playback.js","../js/config.js","../js/utils/util.js","../js/utils/constants.js","../js/controllers/autoanimate.js","../js/utils/color.js","../js/controllers/backgrounds.js","../js/utils/device.js","../js/controllers/controls.js","../js/controllers/focus.js","../js/controllers/fragments.js","../js/controllers/jumptoslide.js","../js/controllers/keyboard.js","../js/controllers/location.js","../js/controllers/notes.js","../js/controllers/overview.js","../js/utils/loader.js","../js/controllers/plugins.js","../js/controllers/pointer.js","../js/controllers/printview.js","../js/controllers/progress.js","../js/controllers/scrollview.js","../node_modules/fitty/dist/fitty.module.js","../js/controllers/slidecontent.js","../js/controllers/slidenumber.js","../js/controllers/touch.js","../js/reveal.js","../js/index.js"],"sourcesContent":["/**\n * UI component that lets the use control auto-slide\n * playback via play/pause.\n */\nexport default class Playback {\n\n\t/**\n\t * @param {HTMLElement} container The component will append\n\t * itself to this\n\t * @param {function} progressCheck A method which will be\n\t * called frequently to get the current playback progress on\n\t * a range of 0-1\n\t */\n\tconstructor( container, progressCheck ) {\n\n\t\t// Cosmetics\n\t\tthis.diameter = 100;\n\t\tthis.diameter2 = this.diameter/2;\n\t\tthis.thickness = 6;\n\n\t\t// Flags if we are currently playing\n\t\tthis.playing = false;\n\n\t\t// Current progress on a 0-1 range\n\t\tthis.progress = 0;\n\n\t\t// Used to loop the animation smoothly\n\t\tthis.progressOffset = 1;\n\n\t\tthis.container = container;\n\t\tthis.progressCheck = progressCheck;\n\n\t\tthis.canvas = document.createElement( 'canvas' );\n\t\tthis.canvas.className = 'playback';\n\t\tthis.canvas.width = this.diameter;\n\t\tthis.canvas.height = this.diameter;\n\t\tthis.canvas.style.width = this.diameter2 + 'px';\n\t\tthis.canvas.style.height = this.diameter2 + 'px';\n\t\tthis.context = this.canvas.getContext( '2d' );\n\n\t\tthis.container.appendChild( this.canvas );\n\n\t\tthis.render();\n\n\t}\n\n\tsetPlaying( value ) {\n\n\t\tconst wasPlaying = this.playing;\n\n\t\tthis.playing = value;\n\n\t\t// Start repainting if we weren't already\n\t\tif( !wasPlaying && this.playing ) {\n\t\t\tthis.animate();\n\t\t}\n\t\telse {\n\t\t\tthis.render();\n\t\t}\n\n\t}\n\n\tanimate() {\n\n\t\tconst progressBefore = this.progress;\n\n\t\tthis.progress = this.progressCheck();\n\n\t\t// When we loop, offset the progress so that it eases\n\t\t// smoothly rather than immediately resetting\n\t\tif( progressBefore > 0.8 && this.progress < 0.2 ) {\n\t\t\tthis.progressOffset = this.progress;\n\t\t}\n\n\t\tthis.render();\n\n\t\tif( this.playing ) {\n\t\t\trequestAnimationFrame( this.animate.bind( this ) );\n\t\t}\n\n\t}\n\n\t/**\n\t * Renders the current progress and playback state.\n\t */\n\trender() {\n\n\t\tlet progress = this.playing ? this.progress : 0,\n\t\t\tradius = ( this.diameter2 ) - this.thickness,\n\t\t\tx = this.diameter2,\n\t\t\ty = this.diameter2,\n\t\t\ticonSize = 28;\n\n\t\t// Ease towards 1\n\t\tthis.progressOffset += ( 1 - this.progressOffset ) * 0.1;\n\n\t\tconst endAngle = ( - Math.PI / 2 ) + ( progress * ( Math.PI * 2 ) );\n\t\tconst startAngle = ( - Math.PI / 2 ) + ( this.progressOffset * ( Math.PI * 2 ) );\n\n\t\tthis.context.save();\n\t\tthis.context.clearRect( 0, 0, this.diameter, this.diameter );\n\n\t\t// Solid background color\n\t\tthis.context.beginPath();\n\t\tthis.context.arc( x, y, radius + 4, 0, Math.PI * 2, false );\n\t\tthis.context.fillStyle = 'rgba( 0, 0, 0, 0.4 )';\n\t\tthis.context.fill();\n\n\t\t// Draw progress track\n\t\tthis.context.beginPath();\n\t\tthis.context.arc( x, y, radius, 0, Math.PI * 2, false );\n\t\tthis.context.lineWidth = this.thickness;\n\t\tthis.context.strokeStyle = 'rgba( 255, 255, 255, 0.2 )';\n\t\tthis.context.stroke();\n\n\t\tif( this.playing ) {\n\t\t\t// Draw progress on top of track\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc( x, y, radius, startAngle, endAngle, false );\n\t\t\tthis.context.lineWidth = this.thickness;\n\t\t\tthis.context.strokeStyle = '#fff';\n\t\t\tthis.context.stroke();\n\t\t}\n\n\t\tthis.context.translate( x - ( iconSize / 2 ), y - ( iconSize / 2 ) );\n\n\t\t// Draw play/pause icons\n\t\tif( this.playing ) {\n\t\t\tthis.context.fillStyle = '#fff';\n\t\t\tthis.context.fillRect( 0, 0, iconSize / 2 - 4, iconSize );\n\t\t\tthis.context.fillRect( iconSize / 2 + 4, 0, iconSize / 2 - 4, iconSize );\n\t\t}\n\t\telse {\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.translate( 4, 0 );\n\t\t\tthis.context.moveTo( 0, 0 );\n\t\t\tthis.context.lineTo( iconSize - 4, iconSize / 2 );\n\t\t\tthis.context.lineTo( 0, iconSize );\n\t\t\tthis.context.fillStyle = '#fff';\n\t\t\tthis.context.fill();\n\t\t}\n\n\t\tthis.context.restore();\n\n\t}\n\n\ton( type, listener ) {\n\t\tthis.canvas.addEventListener( type, listener, false );\n\t}\n\n\toff( type, listener ) {\n\t\tthis.canvas.removeEventListener( type, listener, false );\n\t}\n\n\tdestroy() {\n\n\t\tthis.playing = false;\n\n\t\tif( this.canvas.parentNode ) {\n\t\t\tthis.container.removeChild( this.canvas );\n\t\t}\n\n\t}\n\n}","/**\n * The default reveal.js config object.\n */\nexport default {\n\n\t// The \"normal\" size of the presentation, aspect ratio will be preserved\n\t// when the presentation is scaled to fit different resolutions\n\twidth: 960,\n\theight: 700,\n\n\t// Factor of the display size that should remain empty around the content\n\tmargin: 0.04,\n\n\t// Bounds for smallest/largest possible scale to apply to content\n\tminScale: 0.2,\n\tmaxScale: 2.0,\n\n\t// Display presentation control arrows\n\tcontrols: true,\n\n\t// Help the user learn the controls by providing hints, for example by\n\t// bouncing the down arrow when they first encounter a vertical slide\n\tcontrolsTutorial: true,\n\n\t// Determines where controls appear, \"edges\" or \"bottom-right\"\n\tcontrolsLayout: 'bottom-right',\n\n\t// Visibility rule for backwards navigation arrows; \"faded\", \"hidden\"\n\t// or \"visible\"\n\tcontrolsBackArrows: 'faded',\n\n\t// Display a presentation progress bar\n\tprogress: true,\n\n\t// Display the page number of the current slide\n\t// - true: Show slide number\n\t// - false: Hide slide number\n\t//\n\t// Can optionally be set as a string that specifies the number formatting:\n\t// - \"h.v\":\t Horizontal . vertical slide number (default)\n\t// - \"h/v\":\t Horizontal / vertical slide number\n\t// - \"c\":\t Flattened slide number\n\t// - \"c/t\":\t Flattened slide number / total slides\n\t//\n\t// Alternatively, you can provide a function that returns the slide\n\t// number for the current slide. The function should take in a slide\n\t// object and return an array with one string [slideNumber] or\n\t// three strings [n1,delimiter,n2]. See #formatSlideNumber().\n\tslideNumber: false,\n\n\t// Can be used to limit the contexts in which the slide number appears\n\t// - \"all\": Always show the slide number\n\t// - \"print\": Only when printing to PDF\n\t// - \"speaker\": Only in the speaker view\n\tshowSlideNumber: 'all',\n\n\t// Use 1 based indexing for # links to match slide number (default is zero\n\t// based)\n\thashOneBasedIndex: false,\n\n\t// Add the current slide number to the URL hash so that reloading the\n\t// page/copying the URL will return you to the same slide\n\thash: false,\n\n\t// Flags if we should monitor the hash and change slides accordingly\n\trespondToHashChanges: true,\n\n\t// Enable support for jump-to-slide navigation shortcuts\n\tjumpToSlide: true,\n\n\t// Push each slide change to the browser history. Implies `hash: true`\n\thistory: false,\n\n\t// Enable keyboard shortcuts for navigation\n\tkeyboard: true,\n\n\t// Optional function that blocks keyboard events when retuning false\n\t//\n\t// If you set this to 'focused', we will only capture keyboard events\n\t// for embedded decks when they are in focus\n\tkeyboardCondition: null,\n\n\t// Disables the default reveal.js slide layout (scaling and centering)\n\t// so that you can use custom CSS layout\n\tdisableLayout: false,\n\n\t// Enable the slide overview mode\n\toverview: true,\n\n\t// Vertical centering of slides\n\tcenter: true,\n\n\t// Enables touch navigation on devices with touch input\n\ttouch: true,\n\n\t// Loop the presentation\n\tloop: false,\n\n\t// Change the presentation direction to be RTL\n\trtl: false,\n\n\t// Changes the behavior of our navigation directions.\n\t//\n\t// \"default\"\n\t// Left/right arrow keys step between horizontal slides, up/down\n\t// arrow keys step between vertical slides. Space key steps through\n\t// all slides (both horizontal and vertical).\n\t//\n\t// \"linear\"\n\t// Removes the up/down arrows. Left/right arrows step through all\n\t// slides (both horizontal and vertical).\n\t//\n\t// \"grid\"\n\t// When this is enabled, stepping left/right from a vertical stack\n\t// to an adjacent vertical stack will land you at the same vertical\n\t// index.\n\t//\n\t// Consider a deck with six slides ordered in two vertical stacks:\n\t// 1.1 2.1\n\t// 1.2 2.2\n\t// 1.3 2.3\n\t//\n\t// If you're on slide 1.3 and navigate right, you will normally move\n\t// from 1.3 -> 2.1. If \"grid\" is used, the same navigation takes you\n\t// from 1.3 -> 2.3.\n\tnavigationMode: 'default',\n\n\t// Randomizes the order of slides each time the presentation loads\n\tshuffle: false,\n\n\t// Turns fragments on and off globally\n\tfragments: true,\n\n\t// Flags whether to include the current fragment in the URL,\n\t// so that reloading brings you to the same fragment position\n\tfragmentInURL: true,\n\n\t// Flags if the presentation is running in an embedded mode,\n\t// i.e. contained within a limited portion of the screen\n\tembedded: false,\n\n\t// Flags if we should show a help overlay when the question-mark\n\t// key is pressed\n\thelp: true,\n\n\t// Flags if it should be possible to pause the presentation (blackout)\n\tpause: true,\n\n\t// Flags if speaker notes should be visible to all viewers\n\tshowNotes: false,\n\n\t// Flags if slides with data-visibility=\"hidden\" should be kep visible\n\tshowHiddenSlides: false,\n\n\t// Global override for autoplaying embedded media (video/audio/iframe)\n\t// - null: Media will only autoplay if data-autoplay is present\n\t// - true: All media will autoplay, regardless of individual setting\n\t// - false: No media will autoplay, regardless of individual setting\n\tautoPlayMedia: null,\n\n\t// Global override for preloading lazy-loaded iframes\n\t// - null: Iframes with data-src AND data-preload will be loaded when within\n\t// the viewDistance, iframes with only data-src will be loaded when visible\n\t// - true: All iframes with data-src will be loaded when within the viewDistance\n\t// - false: All iframes with data-src will be loaded only when visible\n\tpreloadIframes: null,\n\n\t// Can be used to globally disable auto-animation\n\tautoAnimate: true,\n\n\t// Optionally provide a custom element matcher that will be\n\t// used to dictate which elements we can animate between.\n\tautoAnimateMatcher: null,\n\n\t// Default settings for our auto-animate transitions, can be\n\t// overridden per-slide or per-element via data arguments\n\tautoAnimateEasing: 'ease',\n\tautoAnimateDuration: 1.0,\n\tautoAnimateUnmatched: true,\n\n\t// CSS properties that can be auto-animated. Position & scale\n\t// is matched separately so there's no need to include styles\n\t// like top/right/bottom/left, width/height or margin.\n\tautoAnimateStyles: [\n\t\t'opacity',\n\t\t'color',\n\t\t'background-color',\n\t\t'padding',\n\t\t'font-size',\n\t\t'line-height',\n\t\t'letter-spacing',\n\t\t'border-width',\n\t\t'border-color',\n\t\t'border-radius',\n\t\t'outline',\n\t\t'outline-offset'\n\t],\n\n\t// Controls automatic progression to the next slide\n\t// - 0: Auto-sliding only happens if the data-autoslide HTML attribute\n\t// is present on the current slide or fragment\n\t// - 1+: All slides will progress automatically at the given interval\n\t// - false: No auto-sliding, even if data-autoslide is present\n\tautoSlide: 0,\n\n\t// Stop auto-sliding after user input\n\tautoSlideStoppable: true,\n\n\t// Use this method for navigation when auto-sliding (defaults to navigateNext)\n\tautoSlideMethod: null,\n\n\t// Specify the average time in seconds that you think you will spend\n\t// presenting each slide. This is used to show a pacing timer in the\n\t// speaker view\n\tdefaultTiming: null,\n\n\t// Enable slide navigation via mouse wheel\n\tmouseWheel: false,\n\n\t// Opens links in an iframe preview overlay\n\t// Add `data-preview-link` and `data-preview-link=\"false\"` to customise each link\n\t// individually\n\tpreviewLinks: false,\n\n\t// Exposes the reveal.js API through window.postMessage\n\tpostMessage: true,\n\n\t// Dispatches all reveal.js events to the parent window through postMessage\n\tpostMessageEvents: false,\n\n\t// Focuses body when page changes visibility to ensure keyboard shortcuts work\n\tfocusBodyOnPageVisibilityChange: true,\n\n\t// Transition style\n\ttransition: 'slide', // none/fade/slide/convex/concave/zoom\n\n\t// Transition speed\n\ttransitionSpeed: 'default', // default/fast/slow\n\n\t// Transition style for full page slide backgrounds\n\tbackgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom\n\n\t// Parallax background image\n\tparallaxBackgroundImage: '', // CSS syntax, e.g. \"a.jpg\"\n\n\t// Parallax background size\n\tparallaxBackgroundSize: '', // CSS syntax, e.g. \"3000px 2000px\"\n\n\t// Parallax background repeat\n\tparallaxBackgroundRepeat: '', // repeat/repeat-x/repeat-y/no-repeat/initial/inherit\n\n\t// Parallax background position\n\tparallaxBackgroundPosition: '', // CSS syntax, e.g. \"top left\"\n\n\t// Amount of pixels to move the parallax background per slide step\n\tparallaxBackgroundHorizontal: null,\n\tparallaxBackgroundVertical: null,\n\n\t// Can be used to initialize reveal.js in one of the following views:\n\t// - print: Render the presentation so that it can be printed to PDF\n\t// - scroll: Show the presentation as a tall scrollable page with scroll\n\t// triggered animations\n\tview: null,\n\n\t// Adjusts the height of each slide in the scroll view.\n\t// - full: Each slide is as tall as the viewport\n\t// - compact: Slides are as small as possible, allowing multiple slides\n\t// to be visible in parallel on tall devices\n\tscrollLayout: 'full',\n\n\t// Control how scroll snapping works in the scroll view.\n\t// - false: \tNo snapping, scrolling is continuous\n\t// - proximity: Snap when close to a slide\n\t// - mandatory: Always snap to the closest slide\n\t//\n\t// Only applies to presentations in scroll view.\n\tscrollSnap: 'mandatory',\n\n\t// Enables and configure the scroll view progress bar.\n\t// - 'auto': Show the scrollbar while scrolling, hide while idle\n\t// - true: Always show the scrollbar\n\t// - false: Never show the scrollbar\n\tscrollProgress: 'auto',\n\n\t// Automatically activate the scroll view when we the viewport falls\n\t// below the given width.\n\tscrollActivationWidth: 435,\n\n\t// The maximum number of pages a single slide can expand onto when printing\n\t// to PDF, unlimited by default\n\tpdfMaxPagesPerSlide: Number.POSITIVE_INFINITY,\n\n\t// Prints each fragment on a separate slide\n\tpdfSeparateFragments: true,\n\n\t// Offset used to reduce the height of content within exported PDF pages.\n\t// This exists to account for environment differences based on how you\n\t// print to PDF. CLI printing options, like phantomjs and wkpdf, can end\n\t// on precisely the total height of the document whereas in-browser\n\t// printing has to end one pixel before.\n\tpdfPageHeightOffset: -1,\n\n\t// Number of slides away from the current that are visible\n\tviewDistance: 3,\n\n\t// Number of slides away from the current that are visible on mobile\n\t// devices. It is advisable to set this to a lower number than\n\t// viewDistance in order to save resources.\n\tmobileViewDistance: 2,\n\n\t// The display mode that will be used to show slides\n\tdisplay: 'block',\n\n\t// Hide cursor if inactive\n\thideInactiveCursor: true,\n\n\t// Time before the cursor is hidden (in ms)\n\thideCursorTime: 5000,\n\n\t// Should we automatically sort and set indices for fragments\n\t// at each sync? (See Reveal.sync)\n\tsortFragmentsOnSync: true,\n\n\t// Script dependencies to load\n\tdependencies: [],\n\n\t// Plugin objects to register and use for this presentation\n\tplugins: []\n\n}","/**\n * Extend object a with the properties of object b.\n * If there's a conflict, object b takes precedence.\n *\n * @param {object} a\n * @param {object} b\n */\nexport const extend = ( a, b ) => {\n\n\tfor( let i in b ) {\n\t\ta[ i ] = b[ i ];\n\t}\n\n\treturn a;\n\n}\n\n/**\n * querySelectorAll but returns an Array.\n */\nexport const queryAll = ( el, selector ) => {\n\n\treturn Array.from( el.querySelectorAll( selector ) );\n\n}\n\n/**\n * classList.toggle() with cross browser support\n */\nexport const toggleClass = ( el, className, value ) => {\n\tif( value ) {\n\t\tel.classList.add( className );\n\t}\n\telse {\n\t\tel.classList.remove( className );\n\t}\n}\n\n/**\n * Utility for deserializing a value.\n *\n * @param {*} value\n * @return {*}\n */\nexport const deserialize = ( value ) => {\n\n\tif( typeof value === 'string' ) {\n\t\tif( value === 'null' ) return null;\n\t\telse if( value === 'true' ) return true;\n\t\telse if( value === 'false' ) return false;\n\t\telse if( value.match( /^-?[\\d\\.]+$/ ) ) return parseFloat( value );\n\t}\n\n\treturn value;\n\n}\n\n/**\n * Measures the distance in pixels between point a\n * and point b.\n *\n * @param {object} a point with x/y properties\n * @param {object} b point with x/y properties\n *\n * @return {number}\n */\nexport const distanceBetween = ( a, b ) => {\n\n\tlet dx = a.x - b.x,\n\t\tdy = a.y - b.y;\n\n\treturn Math.sqrt( dx*dx + dy*dy );\n\n}\n\n/**\n * Applies a CSS transform to the target element.\n *\n * @param {HTMLElement} element\n * @param {string} transform\n */\nexport const transformElement = ( element, transform ) => {\n\n\telement.style.transform = transform;\n\n}\n\n/**\n * Element.matches with IE support.\n *\n * @param {HTMLElement} target The element to match\n * @param {String} selector The CSS selector to match\n * the element against\n *\n * @return {Boolean}\n */\nexport const matches = ( target, selector ) => {\n\n\tlet matchesMethod = target.matches || target.matchesSelector || target.msMatchesSelector;\n\n\treturn !!( matchesMethod && matchesMethod.call( target, selector ) );\n\n}\n\n/**\n * Find the closest parent that matches the given\n * selector.\n *\n * @param {HTMLElement} target The child element\n * @param {String} selector The CSS selector to match\n * the parents against\n *\n * @return {HTMLElement} The matched parent or null\n * if no matching parent was found\n */\nexport const closest = ( target, selector ) => {\n\n\t// Native Element.closest\n\tif( typeof target.closest === 'function' ) {\n\t\treturn target.closest( selector );\n\t}\n\n\t// Polyfill\n\twhile( target ) {\n\t\tif( matches( target, selector ) ) {\n\t\t\treturn target;\n\t\t}\n\n\t\t// Keep searching\n\t\ttarget = target.parentNode;\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Handling the fullscreen functionality via the fullscreen API\n *\n * @see http://fullscreen.spec.whatwg.org/\n * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode\n */\nexport const enterFullscreen = element => {\n\n\telement = element || document.documentElement;\n\n\t// Check which implementation is available\n\tlet requestMethod = element.requestFullscreen ||\n\t\t\t\t\t\telement.webkitRequestFullscreen ||\n\t\t\t\t\t\telement.webkitRequestFullScreen ||\n\t\t\t\t\t\telement.mozRequestFullScreen ||\n\t\t\t\t\t\telement.msRequestFullscreen;\n\n\tif( requestMethod ) {\n\t\trequestMethod.apply( element );\n\t}\n\n}\n\n/**\n * Creates an HTML element and returns a reference to it.\n * If the element already exists the existing instance will\n * be returned.\n *\n * @param {HTMLElement} container\n * @param {string} tagname\n * @param {string} classname\n * @param {string} innerHTML\n *\n * @return {HTMLElement}\n */\nexport const createSingletonNode = ( container, tagname, classname, innerHTML='' ) => {\n\n\t// Find all nodes matching the description\n\tlet nodes = container.querySelectorAll( '.' + classname );\n\n\t// Check all matches to find one which is a direct child of\n\t// the specified container\n\tfor( let i = 0; i < nodes.length; i++ ) {\n\t\tlet testNode = nodes[i];\n\t\tif( testNode.parentNode === container ) {\n\t\t\treturn testNode;\n\t\t}\n\t}\n\n\t// If no node was found, create it now\n\tlet node = document.createElement( tagname );\n\tnode.className = classname;\n\tnode.innerHTML = innerHTML;\n\tcontainer.appendChild( node );\n\n\treturn node;\n\n}\n\n/**\n * Injects the given CSS styles into the DOM.\n *\n * @param {string} value\n */\nexport const createStyleSheet = ( value ) => {\n\n\tlet tag = document.createElement( 'style' );\n\ttag.type = 'text/css';\n\n\tif( value && value.length > 0 ) {\n\t\tif( tag.styleSheet ) {\n\t\t\ttag.styleSheet.cssText = value;\n\t\t}\n\t\telse {\n\t\t\ttag.appendChild( document.createTextNode( value ) );\n\t\t}\n\t}\n\n\tdocument.head.appendChild( tag );\n\n\treturn tag;\n\n}\n\n/**\n * Returns a key:value hash of all query params.\n */\nexport const getQueryHash = () => {\n\n\tlet query = {};\n\n\tlocation.search.replace( /[A-Z0-9]+?=([\\w\\.%-]*)/gi, a => {\n\t\tquery[ a.split( '=' ).shift() ] = a.split( '=' ).pop();\n\t} );\n\n\t// Basic deserialization\n\tfor( let i in query ) {\n\t\tlet value = query[ i ];\n\n\t\tquery[ i ] = deserialize( unescape( value ) );\n\t}\n\n\t// Do not accept new dependencies via query config to avoid\n\t// the potential of malicious script injection\n\tif( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies'];\n\n\treturn query;\n\n}\n\n/**\n * Returns the remaining height within the parent of the\n * target element.\n *\n * remaining height = [ configured parent height ] - [ current parent height ]\n *\n * @param {HTMLElement} element\n * @param {number} [height]\n */\nexport const getRemainingHeight = ( element, height = 0 ) => {\n\n\tif( element ) {\n\t\tlet newHeight, oldHeight = element.style.height;\n\n\t\t// Change the .stretch element height to 0 in order find the height of all\n\t\t// the other elements\n\t\telement.style.height = '0px';\n\n\t\t// In Overview mode, the parent (.slide) height is set of 700px.\n\t\t// Restore it temporarily to its natural height.\n\t\telement.parentNode.style.height = 'auto';\n\n\t\tnewHeight = height - element.parentNode.offsetHeight;\n\n\t\t// Restore the old height, just in case\n\t\telement.style.height = oldHeight + 'px';\n\n\t\t// Clear the parent (.slide) height. .removeProperty works in IE9+\n\t\telement.parentNode.style.removeProperty('height');\n\n\t\treturn newHeight;\n\t}\n\n\treturn height;\n\n}\n\nconst fileExtensionToMimeMap = {\n\t'mp4': 'video/mp4',\n\t'm4a': 'video/mp4',\n\t'ogv': 'video/ogg',\n\t'mpeg': 'video/mpeg',\n\t'webm': 'video/webm'\n}\n\n/**\n * Guess the MIME type for common file formats.\n */\nexport const getMimeTypeFromFile = ( filename='' ) => {\n\treturn fileExtensionToMimeMap[filename.split('.').pop()]\n}\n\n/**\n * Encodes a string for RFC3986-compliant URL format.\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI#encoding_for_rfc3986\n *\n * @param {string} url\n */\nexport const encodeRFC3986URI = ( url='' ) => {\n\treturn encodeURI(url)\n\t .replace(/%5B/g, \"[\")\n\t .replace(/%5D/g, \"]\")\n\t .replace(\n\t\t/[!'()*]/g,\n\t\t(c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n\t );\n}","\nexport const SLIDES_SELECTOR = '.slides section';\nexport const HORIZONTAL_SLIDES_SELECTOR = '.slides>section';\nexport const VERTICAL_SLIDES_SELECTOR = '.slides>section.present>section';\n\n// Methods that may not be invoked via the postMessage API\nexport const POST_MESSAGE_METHOD_BLACKLIST = /registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener|showPreview/;\n\n// Regex for retrieving the fragment style from a class attribute\nexport const FRAGMENT_STYLE_REGEX = /fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/;\n\n// Slide number formats\nexport const SLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL = 'h.v';\nexport const SLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL = 'h/v';\nexport const SLIDE_NUMBER_FORMAT_CURRENT = 'c';\nexport const SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL = 'c/t';","import { queryAll, extend, createStyleSheet, matches, closest } from '../utils/util.js'\nimport { FRAGMENT_STYLE_REGEX } from '../utils/constants.js'\n\n// Counter used to generate unique IDs for auto-animated elements\nlet autoAnimateCounter = 0;\n\n/**\n * Automatically animates matching elements across\n * slides with the [data-auto-animate] attribute.\n */\nexport default class AutoAnimate {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Runs an auto-animation between the given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t */\n\trun( fromSlide, toSlide ) {\n\n\t\t// Clean up after prior animations\n\t\tthis.reset();\n\n\t\tlet allSlides = this.Reveal.getSlides();\n\t\tlet toSlideIndex = allSlides.indexOf( toSlide );\n\t\tlet fromSlideIndex = allSlides.indexOf( fromSlide );\n\n\t\t// Ensure that both slides are auto-animate targets with the same data-auto-animate-id value\n\t\t// (including null if absent on both) and that data-auto-animate-restart isn't set on the\n\t\t// physically latter slide (independent of slide direction)\n\t\tif( fromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' )\n\t\t\t\t&& fromSlide.getAttribute( 'data-auto-animate-id' ) === toSlide.getAttribute( 'data-auto-animate-id' ) \n\t\t\t\t&& !( toSlideIndex > fromSlideIndex ? toSlide : fromSlide ).hasAttribute( 'data-auto-animate-restart' ) ) {\n\n\t\t\t// Create a new auto-animate sheet\n\t\t\tthis.autoAnimateStyleSheet = this.autoAnimateStyleSheet || createStyleSheet();\n\n\t\t\tlet animationOptions = this.getAutoAnimateOptions( toSlide );\n\n\t\t\t// Set our starting state\n\t\t\tfromSlide.dataset.autoAnimate = 'pending';\n\t\t\ttoSlide.dataset.autoAnimate = 'pending';\n\n\t\t\t// Flag the navigation direction, needed for fragment buildup\n\t\t\tanimationOptions.slideDirection = toSlideIndex > fromSlideIndex ? 'forward' : 'backward';\n\n\t\t\t// If the from-slide is hidden because it has moved outside\n\t\t\t// the view distance, we need to temporarily show it while\n\t\t\t// measuring\n\t\t\tlet fromSlideIsHidden = fromSlide.style.display === 'none';\n\t\t\tif( fromSlideIsHidden ) fromSlide.style.display = this.Reveal.getConfig().display;\n\n\t\t\t// Inject our auto-animate styles for this transition\n\t\t\tlet css = this.getAutoAnimatableElements( fromSlide, toSlide ).map( elements => {\n\t\t\t\treturn this.autoAnimateElements( elements.from, elements.to, elements.options || {}, animationOptions, autoAnimateCounter++ );\n\t\t\t} );\n\n\t\t\tif( fromSlideIsHidden ) fromSlide.style.display = 'none';\n\n\t\t\t// Animate unmatched elements, if enabled\n\t\t\tif( toSlide.dataset.autoAnimateUnmatched !== 'false' && this.Reveal.getConfig().autoAnimateUnmatched === true ) {\n\n\t\t\t\t// Our default timings for unmatched elements\n\t\t\t\tlet defaultUnmatchedDuration = animationOptions.duration * 0.8,\n\t\t\t\t\tdefaultUnmatchedDelay = animationOptions.duration * 0.2;\n\n\t\t\t\tthis.getUnmatchedAutoAnimateElements( toSlide ).forEach( unmatchedElement => {\n\n\t\t\t\t\tlet unmatchedOptions = this.getAutoAnimateOptions( unmatchedElement, animationOptions );\n\t\t\t\t\tlet id = 'unmatched';\n\n\t\t\t\t\t// If there is a duration or delay set specifically for this\n\t\t\t\t\t// element our unmatched elements should adhere to those\n\t\t\t\t\tif( unmatchedOptions.duration !== animationOptions.duration || unmatchedOptions.delay !== animationOptions.delay ) {\n\t\t\t\t\t\tid = 'unmatched-' + autoAnimateCounter++;\n\t\t\t\t\t\tcss.push( `[data-auto-animate=\"running\"] [data-auto-animate-target=\"${id}\"] { transition: opacity ${unmatchedOptions.duration}s ease ${unmatchedOptions.delay}s; }` );\n\t\t\t\t\t}\n\n\t\t\t\t\tunmatchedElement.dataset.autoAnimateTarget = id;\n\n\t\t\t\t}, this );\n\n\t\t\t\t// Our default transition for unmatched elements\n\t\t\t\tcss.push( `[data-auto-animate=\"running\"] [data-auto-animate-target=\"unmatched\"] { transition: opacity ${defaultUnmatchedDuration}s ease ${defaultUnmatchedDelay}s; }` );\n\n\t\t\t}\n\n\t\t\t// Setting the whole chunk of CSS at once is the most\n\t\t\t// efficient way to do this. Using sheet.insertRule\n\t\t\t// is multiple factors slower.\n\t\t\tthis.autoAnimateStyleSheet.innerHTML = css.join( '' );\n\n\t\t\t// Start the animation next cycle\n\t\t\trequestAnimationFrame( () => {\n\t\t\t\tif( this.autoAnimateStyleSheet ) {\n\t\t\t\t\t// This forces our newly injected styles to be applied in Firefox\n\t\t\t\t\tgetComputedStyle( this.autoAnimateStyleSheet ).fontWeight;\n\n\t\t\t\t\ttoSlide.dataset.autoAnimate = 'running';\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'autoanimate',\n\t\t\t\tdata: {\n\t\t\t\t\tfromSlide,\n\t\t\t\t\ttoSlide,\n\t\t\t\t\tsheet: this.autoAnimateStyleSheet\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Rolls back all changes that we've made to the DOM so\n\t * that as part of animating.\n\t */\n\treset() {\n\n\t\t// Reset slides\n\t\tqueryAll( this.Reveal.getRevealElement(), '[data-auto-animate]:not([data-auto-animate=\"\"])' ).forEach( element => {\n\t\t\telement.dataset.autoAnimate = '';\n\t\t} );\n\n\t\t// Reset elements\n\t\tqueryAll( this.Reveal.getRevealElement(), '[data-auto-animate-target]' ).forEach( element => {\n\t\t\tdelete element.dataset.autoAnimateTarget;\n\t\t} );\n\n\t\t// Remove the animation sheet\n\t\tif( this.autoAnimateStyleSheet && this.autoAnimateStyleSheet.parentNode ) {\n\t\t\tthis.autoAnimateStyleSheet.parentNode.removeChild( this.autoAnimateStyleSheet );\n\t\t\tthis.autoAnimateStyleSheet = null;\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a FLIP animation where the `to` element starts out\n\t * in the `from` element position and animates to its original\n\t * state.\n\t *\n\t * @param {HTMLElement} from\n\t * @param {HTMLElement} to\n\t * @param {Object} elementOptions Options for this element pair\n\t * @param {Object} animationOptions Options set at the slide level\n\t * @param {String} id Unique ID that we can use to identify this\n\t * auto-animate element in the DOM\n\t */\n\tautoAnimateElements( from, to, elementOptions, animationOptions, id ) {\n\n\t\t// 'from' elements are given a data-auto-animate-target with no value,\n\t\t// 'to' elements are are given a data-auto-animate-target with an ID\n\t\tfrom.dataset.autoAnimateTarget = '';\n\t\tto.dataset.autoAnimateTarget = id;\n\n\t\t// Each element may override any of the auto-animate options\n\t\t// like transition easing, duration and delay via data-attributes\n\t\tlet options = this.getAutoAnimateOptions( to, animationOptions );\n\n\t\t// If we're using a custom element matcher the element options\n\t\t// may contain additional transition overrides\n\t\tif( typeof elementOptions.delay !== 'undefined' ) options.delay = elementOptions.delay;\n\t\tif( typeof elementOptions.duration !== 'undefined' ) options.duration = elementOptions.duration;\n\t\tif( typeof elementOptions.easing !== 'undefined' ) options.easing = elementOptions.easing;\n\n\t\tlet fromProps = this.getAutoAnimatableProperties( 'from', from, elementOptions ),\n\t\t\ttoProps = this.getAutoAnimatableProperties( 'to', to, elementOptions );\n\n\t\t// Maintain fragment visibility for matching elements when\n\t\t// we're navigating forwards, this way the viewer won't need\n\t\t// to step through the same fragments twice\n\t\tif( to.classList.contains( 'fragment' ) ) {\n\n\t\t\t// Don't auto-animate the opacity of fragments to avoid\n\t\t\t// conflicts with fragment animations\n\t\t\tdelete toProps.styles['opacity'];\n\n\t\t\tif( from.classList.contains( 'fragment' ) ) {\n\n\t\t\t\tlet fromFragmentStyle = ( from.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0];\n\t\t\t\tlet toFragmentStyle = ( to.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0];\n\n\t\t\t\t// Only skip the fragment if the fragment animation style\n\t\t\t\t// remains unchanged\n\t\t\t\tif( fromFragmentStyle === toFragmentStyle && animationOptions.slideDirection === 'forward' ) {\n\t\t\t\t\tto.classList.add( 'visible', 'disabled' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If translation and/or scaling are enabled, css transform\n\t\t// the 'to' element so that it matches the position and size\n\t\t// of the 'from' element\n\t\tif( elementOptions.translate !== false || elementOptions.scale !== false ) {\n\n\t\t\tlet presentationScale = this.Reveal.getScale();\n\n\t\t\tlet delta = {\n\t\t\t\tx: ( fromProps.x - toProps.x ) / presentationScale,\n\t\t\t\ty: ( fromProps.y - toProps.y ) / presentationScale,\n\t\t\t\tscaleX: fromProps.width / toProps.width,\n\t\t\t\tscaleY: fromProps.height / toProps.height\n\t\t\t};\n\n\t\t\t// Limit decimal points to avoid 0.0001px blur and stutter\n\t\t\tdelta.x = Math.round( delta.x * 1000 ) / 1000;\n\t\t\tdelta.y = Math.round( delta.y * 1000 ) / 1000;\n\t\t\tdelta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;\n\t\t\tdelta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;\n\n\t\t\tlet translate = elementOptions.translate !== false && ( delta.x !== 0 || delta.y !== 0 ),\n\t\t\t\tscale = elementOptions.scale !== false && ( delta.scaleX !== 0 || delta.scaleY !== 0 );\n\n\t\t\t// No need to transform if nothing's changed\n\t\t\tif( translate || scale ) {\n\n\t\t\t\tlet transform = [];\n\n\t\t\t\tif( translate ) transform.push( `translate(${delta.x}px, ${delta.y}px)` );\n\t\t\t\tif( scale ) transform.push( `scale(${delta.scaleX}, ${delta.scaleY})` );\n\n\t\t\t\tfromProps.styles['transform'] = transform.join( ' ' );\n\t\t\t\tfromProps.styles['transform-origin'] = 'top left';\n\n\t\t\t\ttoProps.styles['transform'] = 'none';\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Delete all unchanged 'to' styles\n\t\tfor( let propertyName in toProps.styles ) {\n\t\t\tconst toValue = toProps.styles[propertyName];\n\t\t\tconst fromValue = fromProps.styles[propertyName];\n\n\t\t\tif( toValue === fromValue ) {\n\t\t\t\tdelete toProps.styles[propertyName];\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// If these property values were set via a custom matcher providing\n\t\t\t\t// an explicit 'from' and/or 'to' value, we always inject those values.\n\t\t\t\tif( toValue.explicitValue === true ) {\n\t\t\t\t\ttoProps.styles[propertyName] = toValue.value;\n\t\t\t\t}\n\n\t\t\t\tif( fromValue.explicitValue === true ) {\n\t\t\t\t\tfromProps.styles[propertyName] = fromValue.value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet css = '';\n\n\t\tlet toStyleProperties = Object.keys( toProps.styles );\n\n\t\t// Only create animate this element IF at least one style\n\t\t// property has changed\n\t\tif( toStyleProperties.length > 0 ) {\n\n\t\t\t// Instantly move to the 'from' state\n\t\t\tfromProps.styles['transition'] = 'none';\n\n\t\t\t// Animate towards the 'to' state\n\t\t\ttoProps.styles['transition'] = `all ${options.duration}s ${options.easing} ${options.delay}s`;\n\t\t\ttoProps.styles['transition-property'] = toStyleProperties.join( ', ' );\n\t\t\ttoProps.styles['will-change'] = toStyleProperties.join( ', ' );\n\n\t\t\t// Build up our custom CSS. We need to override inline styles\n\t\t\t// so we need to make our styles vErY IMPORTANT!1!!\n\t\t\tlet fromCSS = Object.keys( fromProps.styles ).map( propertyName => {\n\t\t\t\treturn propertyName + ': ' + fromProps.styles[propertyName] + ' !important;';\n\t\t\t} ).join( '' );\n\n\t\t\tlet toCSS = Object.keys( toProps.styles ).map( propertyName => {\n\t\t\t\treturn propertyName + ': ' + toProps.styles[propertyName] + ' !important;';\n\t\t\t} ).join( '' );\n\n\t\t\tcss = \t'[data-auto-animate-target=\"'+ id +'\"] {'+ fromCSS +'}' +\n\t\t\t\t\t'[data-auto-animate=\"running\"] [data-auto-animate-target=\"'+ id +'\"] {'+ toCSS +'}';\n\n\t\t}\n\n\t\treturn css;\n\n\t}\n\n\t/**\n\t * Returns the auto-animate options for the given element.\n\t *\n\t * @param {HTMLElement} element Element to pick up options\n\t * from, either a slide or an animation target\n\t * @param {Object} [inheritedOptions] Optional set of existing\n\t * options\n\t */\n\tgetAutoAnimateOptions( element, inheritedOptions ) {\n\n\t\tlet options = {\n\t\t\teasing: this.Reveal.getConfig().autoAnimateEasing,\n\t\t\tduration: this.Reveal.getConfig().autoAnimateDuration,\n\t\t\tdelay: 0\n\t\t};\n\n\t\toptions = extend( options, inheritedOptions );\n\n\t\t// Inherit options from parent elements\n\t\tif( element.parentNode ) {\n\t\t\tlet autoAnimatedParent = closest( element.parentNode, '[data-auto-animate-target]' );\n\t\t\tif( autoAnimatedParent ) {\n\t\t\t\toptions = this.getAutoAnimateOptions( autoAnimatedParent, options );\n\t\t\t}\n\t\t}\n\n\t\tif( element.dataset.autoAnimateEasing ) {\n\t\t\toptions.easing = element.dataset.autoAnimateEasing;\n\t\t}\n\n\t\tif( element.dataset.autoAnimateDuration ) {\n\t\t\toptions.duration = parseFloat( element.dataset.autoAnimateDuration );\n\t\t}\n\n\t\tif( element.dataset.autoAnimateDelay ) {\n\t\t\toptions.delay = parseFloat( element.dataset.autoAnimateDelay );\n\t\t}\n\n\t\treturn options;\n\n\t}\n\n\t/**\n\t * Returns an object containing all of the properties\n\t * that can be auto-animated for the given element and\n\t * their current computed values.\n\t *\n\t * @param {String} direction 'from' or 'to'\n\t */\n\tgetAutoAnimatableProperties( direction, element, elementOptions ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\tlet properties = { styles: [] };\n\n\t\t// Position and size\n\t\tif( elementOptions.translate !== false || elementOptions.scale !== false ) {\n\t\t\tlet bounds;\n\n\t\t\t// Custom auto-animate may optionally return a custom tailored\n\t\t\t// measurement function\n\t\t\tif( typeof elementOptions.measure === 'function' ) {\n\t\t\t\tbounds = elementOptions.measure( element );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( config.center ) {\n\t\t\t\t\t// More precise, but breaks when used in combination\n\t\t\t\t\t// with zoom for scaling the deck ¯\\_(ツ)_/¯\n\t\t\t\t\tbounds = element.getBoundingClientRect();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet scale = this.Reveal.getScale();\n\t\t\t\t\tbounds = {\n\t\t\t\t\t\tx: element.offsetLeft * scale,\n\t\t\t\t\t\ty: element.offsetTop * scale,\n\t\t\t\t\t\twidth: element.offsetWidth * scale,\n\t\t\t\t\t\theight: element.offsetHeight * scale\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tproperties.x = bounds.x;\n\t\t\tproperties.y = bounds.y;\n\t\t\tproperties.width = bounds.width;\n\t\t\tproperties.height = bounds.height;\n\t\t}\n\n\t\tconst computedStyles = getComputedStyle( element );\n\n\t\t// CSS styles\n\t\t( elementOptions.styles || config.autoAnimateStyles ).forEach( style => {\n\t\t\tlet value;\n\n\t\t\t// `style` is either the property name directly, or an object\n\t\t\t// definition of a style property\n\t\t\tif( typeof style === 'string' ) style = { property: style };\n\n\t\t\tif( typeof style.from !== 'undefined' && direction === 'from' ) {\n\t\t\t\tvalue = { value: style.from, explicitValue: true };\n\t\t\t}\n\t\t\telse if( typeof style.to !== 'undefined' && direction === 'to' ) {\n\t\t\t\tvalue = { value: style.to, explicitValue: true };\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Use a unitless value for line-height so that it inherits properly\n\t\t\t\tif( style.property === 'line-height' ) {\n\t\t\t\t\tvalue = parseFloat( computedStyles['line-height'] ) / parseFloat( computedStyles['font-size'] );\n\t\t\t\t}\n\n\t\t\t\tif( isNaN(value) ) {\n\t\t\t\t\tvalue = computedStyles[style.property];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( value !== '' ) {\n\t\t\t\tproperties.styles[style.property] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn properties;\n\n\t}\n\n\t/**\n\t * Get a list of all element pairs that we can animate\n\t * between the given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t *\n\t * @return {Array} Each value is an array where [0] is\n\t * the element we're animating from and [1] is the\n\t * element we're animating to\n\t */\n\tgetAutoAnimatableElements( fromSlide, toSlide ) {\n\n\t\tlet matcher = typeof this.Reveal.getConfig().autoAnimateMatcher === 'function' ? this.Reveal.getConfig().autoAnimateMatcher : this.getAutoAnimatePairs;\n\n\t\tlet pairs = matcher.call( this, fromSlide, toSlide );\n\n\t\tlet reserved = [];\n\n\t\t// Remove duplicate pairs\n\t\treturn pairs.filter( ( pair, index ) => {\n\t\t\tif( reserved.indexOf( pair.to ) === -1 ) {\n\t\t\t\treserved.push( pair.to );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Identifies matching elements between slides.\n\t *\n\t * You can specify a custom matcher function by using\n\t * the `autoAnimateMatcher` config option.\n\t */\n\tgetAutoAnimatePairs( fromSlide, toSlide ) {\n\n\t\tlet pairs = [];\n\n\t\tconst codeNodes = 'pre';\n\t\tconst textNodes = 'h1, h2, h3, h4, h5, h6, p, li';\n\t\tconst mediaNodes = 'img, video, iframe';\n\n\t\t// Explicit matches via data-id\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, '[data-id]', node => {\n\t\t\treturn node.nodeName + ':::' + node.getAttribute( 'data-id' );\n\t\t} );\n\n\t\t// Text\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, textNodes, node => {\n\t\t\treturn node.nodeName + ':::' + node.innerText;\n\t\t} );\n\n\t\t// Media\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, mediaNodes, node => {\n\t\t\treturn node.nodeName + ':::' + ( node.getAttribute( 'src' ) || node.getAttribute( 'data-src' ) );\n\t\t} );\n\n\t\t// Code\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, codeNodes, node => {\n\t\t\treturn node.nodeName + ':::' + node.innerText;\n\t\t} );\n\n\t\tpairs.forEach( pair => {\n\t\t\t// Disable scale transformations on text nodes, we transition\n\t\t\t// each individual text property instead\n\t\t\tif( matches( pair.from, textNodes ) ) {\n\t\t\t\tpair.options = { scale: false };\n\t\t\t}\n\t\t\t// Animate individual lines of code\n\t\t\telse if( matches( pair.from, codeNodes ) ) {\n\n\t\t\t\t// Transition the code block's width and height instead of scaling\n\t\t\t\t// to prevent its content from being squished\n\t\t\t\tpair.options = { scale: false, styles: [ 'width', 'height' ] };\n\n\t\t\t\t// Lines of code\n\t\t\t\tthis.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-code', node => {\n\t\t\t\t\treturn node.textContent;\n\t\t\t\t}, {\n\t\t\t\t\tscale: false,\n\t\t\t\t\tstyles: [],\n\t\t\t\t\tmeasure: this.getLocalBoundingBox.bind( this )\n\t\t\t\t} );\n\n\t\t\t\t// Line numbers\n\t\t\t\tthis.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-numbers[data-line-number]', node => {\n\t\t\t\t\treturn node.getAttribute( 'data-line-number' );\n\t\t\t\t}, {\n\t\t\t\t\tscale: false,\n\t\t\t\t\tstyles: [ 'width' ],\n\t\t\t\t\tmeasure: this.getLocalBoundingBox.bind( this )\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}, this );\n\n\t\treturn pairs;\n\n\t}\n\n\t/**\n\t * Helper method which returns a bounding box based on\n\t * the given elements offset coordinates.\n\t *\n\t * @param {HTMLElement} element\n\t * @return {Object} x, y, width, height\n\t */\n\tgetLocalBoundingBox( element ) {\n\n\t\tconst presentationScale = this.Reveal.getScale();\n\n\t\treturn {\n\t\t\tx: Math.round( ( element.offsetLeft * presentationScale ) * 100 ) / 100,\n\t\t\ty: Math.round( ( element.offsetTop * presentationScale ) * 100 ) / 100,\n\t\t\twidth: Math.round( ( element.offsetWidth * presentationScale ) * 100 ) / 100,\n\t\t\theight: Math.round( ( element.offsetHeight * presentationScale ) * 100 ) / 100\n\t\t};\n\n\t}\n\n\t/**\n\t * Finds matching elements between two slides.\n\t *\n\t * @param {Array} pairs \tList of pairs to push matches to\n\t * @param {HTMLElement} fromScope Scope within the from element exists\n\t * @param {HTMLElement} toScope Scope within the to element exists\n\t * @param {String} selector CSS selector of the element to match\n\t * @param {Function} serializer A function that accepts an element and returns\n\t * a stringified ID based on its contents\n\t * @param {Object} animationOptions Optional config options for this pair\n\t */\n\tfindAutoAnimateMatches( pairs, fromScope, toScope, selector, serializer, animationOptions ) {\n\n\t\tlet fromMatches = {};\n\t\tlet toMatches = {};\n\n\t\t[].slice.call( fromScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {\n\t\t\tconst key = serializer( element );\n\t\t\tif( typeof key === 'string' && key.length ) {\n\t\t\t\tfromMatches[key] = fromMatches[key] || [];\n\t\t\t\tfromMatches[key].push( element );\n\t\t\t}\n\t\t} );\n\n\t\t[].slice.call( toScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {\n\t\t\tconst key = serializer( element );\n\t\t\ttoMatches[key] = toMatches[key] || [];\n\t\t\ttoMatches[key].push( element );\n\n\t\t\tlet fromElement;\n\n\t\t\t// Retrieve the 'from' element\n\t\t\tif( fromMatches[key] ) {\n\t\t\t\tconst primaryIndex = toMatches[key].length - 1;\n\t\t\t\tconst secondaryIndex = fromMatches[key].length - 1;\n\n\t\t\t\t// If there are multiple identical from elements, retrieve\n\t\t\t\t// the one at the same index as our to-element.\n\t\t\t\tif( fromMatches[key][ primaryIndex ] ) {\n\t\t\t\t\tfromElement = fromMatches[key][ primaryIndex ];\n\t\t\t\t\tfromMatches[key][ primaryIndex ] = null;\n\t\t\t\t}\n\t\t\t\t// If there are no matching from-elements at the same index,\n\t\t\t\t// use the last one.\n\t\t\t\telse if( fromMatches[key][ secondaryIndex ] ) {\n\t\t\t\t\tfromElement = fromMatches[key][ secondaryIndex ];\n\t\t\t\t\tfromMatches[key][ secondaryIndex ] = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we've got a matching pair, push it to the list of pairs\n\t\t\tif( fromElement ) {\n\t\t\t\tpairs.push({\n\t\t\t\t\tfrom: fromElement,\n\t\t\t\t\tto: element,\n\t\t\t\t\toptions: animationOptions\n\t\t\t\t});\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns a all elements within the given scope that should\n\t * be considered unmatched in an auto-animate transition. If\n\t * fading of unmatched elements is turned on, these elements\n\t * will fade when going between auto-animate slides.\n\t *\n\t * Note that parents of auto-animate targets are NOT considered\n\t * unmatched since fading them would break the auto-animation.\n\t *\n\t * @param {HTMLElement} rootElement\n\t * @return {Array}\n\t */\n\tgetUnmatchedAutoAnimateElements( rootElement ) {\n\n\t\treturn [].slice.call( rootElement.children ).reduce( ( result, element ) => {\n\n\t\t\tconst containsAnimatedElements = element.querySelector( '[data-auto-animate-target]' );\n\n\t\t\t// The element is unmatched if\n\t\t\t// - It is not an auto-animate target\n\t\t\t// - It does not contain any auto-animate targets\n\t\t\tif( !element.hasAttribute( 'data-auto-animate-target' ) && !containsAnimatedElements ) {\n\t\t\t\tresult.push( element );\n\t\t\t}\n\n\t\t\tif( element.querySelector( '[data-auto-animate-target]' ) ) {\n\t\t\t\tresult = result.concat( this.getUnmatchedAutoAnimateElements( element ) );\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}, [] );\n\n\t}\n\n}\n","/**\n * Converts various color input formats to an {r:0,g:0,b:0} object.\n *\n * @param {string} color The string representation of a color\n * @example\n * colorToRgb('#000');\n * @example\n * colorToRgb('#000000');\n * @example\n * colorToRgb('rgb(0,0,0)');\n * @example\n * colorToRgb('rgba(0,0,0)');\n *\n * @return {{r: number, g: number, b: number, [a]: number}|null}\n */\nexport const colorToRgb = ( color ) => {\n\n\tlet hex3 = color.match( /^#([0-9a-f]{3})$/i );\n\tif( hex3 && hex3[1] ) {\n\t\thex3 = hex3[1];\n\t\treturn {\n\t\t\tr: parseInt( hex3.charAt( 0 ), 16 ) * 0x11,\n\t\t\tg: parseInt( hex3.charAt( 1 ), 16 ) * 0x11,\n\t\t\tb: parseInt( hex3.charAt( 2 ), 16 ) * 0x11\n\t\t};\n\t}\n\n\tlet hex6 = color.match( /^#([0-9a-f]{6})$/i );\n\tif( hex6 && hex6[1] ) {\n\t\thex6 = hex6[1];\n\t\treturn {\n\t\t\tr: parseInt( hex6.slice( 0, 2 ), 16 ),\n\t\t\tg: parseInt( hex6.slice( 2, 4 ), 16 ),\n\t\t\tb: parseInt( hex6.slice( 4, 6 ), 16 )\n\t\t};\n\t}\n\n\tlet rgb = color.match( /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i );\n\tif( rgb ) {\n\t\treturn {\n\t\t\tr: parseInt( rgb[1], 10 ),\n\t\t\tg: parseInt( rgb[2], 10 ),\n\t\t\tb: parseInt( rgb[3], 10 )\n\t\t};\n\t}\n\n\tlet rgba = color.match( /^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\,\\s*([\\d]+|[\\d]*.[\\d]+)\\s*\\)$/i );\n\tif( rgba ) {\n\t\treturn {\n\t\t\tr: parseInt( rgba[1], 10 ),\n\t\t\tg: parseInt( rgba[2], 10 ),\n\t\t\tb: parseInt( rgba[3], 10 ),\n\t\t\ta: parseFloat( rgba[4] )\n\t\t};\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Calculates brightness on a scale of 0-255.\n *\n * @param {string} color See colorToRgb for supported formats.\n * @see {@link colorToRgb}\n */\nexport const colorBrightness = ( color ) => {\n\n\tif( typeof color === 'string' ) color = colorToRgb( color );\n\n\tif( color ) {\n\t\treturn ( color.r * 299 + color.g * 587 + color.b * 114 ) / 1000;\n\t}\n\n\treturn null;\n\n}","import { queryAll } from '../utils/util.js'\nimport { colorToRgb, colorBrightness } from '../utils/color.js'\n\n/**\n * Creates and updates slide backgrounds.\n */\nexport default class Backgrounds {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'backgrounds';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Creates the slide background elements and appends them\n\t * to the background container. One element is created per\n\t * slide no matter if the given slide has visible background.\n\t */\n\tcreate() {\n\n\t\t// Clear prior backgrounds\n\t\tthis.element.innerHTML = '';\n\t\tthis.element.classList.add( 'no-transition' );\n\n\t\t// Iterate over all horizontal slides\n\t\tthis.Reveal.getHorizontalSlides().forEach( slideh => {\n\n\t\t\tlet backgroundStack = this.createBackground( slideh, this.element );\n\n\t\t\t// Iterate over all vertical slides\n\t\t\tqueryAll( slideh, 'section' ).forEach( slidev => {\n\n\t\t\t\tthis.createBackground( slidev, backgroundStack );\n\n\t\t\t\tbackgroundStack.classList.add( 'stack' );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\t// Add parallax background if specified\n\t\tif( this.Reveal.getConfig().parallaxBackgroundImage ) {\n\n\t\t\tthis.element.style.backgroundImage = 'url(\"' + this.Reveal.getConfig().parallaxBackgroundImage + '\")';\n\t\t\tthis.element.style.backgroundSize = this.Reveal.getConfig().parallaxBackgroundSize;\n\t\t\tthis.element.style.backgroundRepeat = this.Reveal.getConfig().parallaxBackgroundRepeat;\n\t\t\tthis.element.style.backgroundPosition = this.Reveal.getConfig().parallaxBackgroundPosition;\n\n\t\t\t// Make sure the below properties are set on the element - these properties are\n\t\t\t// needed for proper transitions to be set on the element via CSS. To remove\n\t\t\t// annoying background slide-in effect when the presentation starts, apply\n\t\t\t// these properties after short time delay\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.Reveal.getRevealElement().classList.add( 'has-parallax-background' );\n\t\t\t}, 1 );\n\n\t\t}\n\t\telse {\n\n\t\t\tthis.element.style.backgroundImage = '';\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'has-parallax-background' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a background for the given slide.\n\t *\n\t * @param {HTMLElement} slide\n\t * @param {HTMLElement} container The element that the background\n\t * should be appended to\n\t * @return {HTMLElement} New background div\n\t */\n\tcreateBackground( slide, container ) {\n\n\t\t// Main slide background element\n\t\tlet element = document.createElement( 'div' );\n\t\telement.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' );\n\n\t\t// Inner background element that wraps images/videos/iframes\n\t\tlet contentElement = document.createElement( 'div' );\n\t\tcontentElement.className = 'slide-background-content';\n\n\t\telement.appendChild( contentElement );\n\t\tcontainer.appendChild( element );\n\n\t\tslide.slideBackgroundElement = element;\n\t\tslide.slideBackgroundContentElement = contentElement;\n\n\t\t// Syncs the background to reflect all current background settings\n\t\tthis.sync( slide );\n\n\t\treturn element;\n\n\t}\n\n\t/**\n\t * Renders all of the visual properties of a slide background\n\t * based on the various background attributes.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tsync( slide ) {\n\n\t\tconst element = slide.slideBackgroundElement,\n\t\t\tcontentElement = slide.slideBackgroundContentElement;\n\n\t\tconst data = {\n\t\t\tbackground: slide.getAttribute( 'data-background' ),\n\t\t\tbackgroundSize: slide.getAttribute( 'data-background-size' ),\n\t\t\tbackgroundImage: slide.getAttribute( 'data-background-image' ),\n\t\t\tbackgroundVideo: slide.getAttribute( 'data-background-video' ),\n\t\t\tbackgroundIframe: slide.getAttribute( 'data-background-iframe' ),\n\t\t\tbackgroundColor: slide.getAttribute( 'data-background-color' ),\n\t\t\tbackgroundGradient: slide.getAttribute( 'data-background-gradient' ),\n\t\t\tbackgroundRepeat: slide.getAttribute( 'data-background-repeat' ),\n\t\t\tbackgroundPosition: slide.getAttribute( 'data-background-position' ),\n\t\t\tbackgroundTransition: slide.getAttribute( 'data-background-transition' ),\n\t\t\tbackgroundOpacity: slide.getAttribute( 'data-background-opacity' ),\n\t\t};\n\n\t\tconst dataPreload = slide.hasAttribute( 'data-preload' );\n\n\t\t// Reset the prior background state in case this is not the\n\t\t// initial sync\n\t\tslide.classList.remove( 'has-dark-background' );\n\t\tslide.classList.remove( 'has-light-background' );\n\n\t\telement.removeAttribute( 'data-loaded' );\n\t\telement.removeAttribute( 'data-background-hash' );\n\t\telement.removeAttribute( 'data-background-size' );\n\t\telement.removeAttribute( 'data-background-transition' );\n\t\telement.style.backgroundColor = '';\n\n\t\tcontentElement.style.backgroundSize = '';\n\t\tcontentElement.style.backgroundRepeat = '';\n\t\tcontentElement.style.backgroundPosition = '';\n\t\tcontentElement.style.backgroundImage = '';\n\t\tcontentElement.style.opacity = '';\n\t\tcontentElement.innerHTML = '';\n\n\t\tif( data.background ) {\n\t\t\t// Auto-wrap image urls in url(...)\n\t\t\tif( /^(http|file|\\/\\/)/gi.test( data.background ) || /\\.(svg|png|jpg|jpeg|gif|bmp|webp)([?#\\s]|$)/gi.test( data.background ) ) {\n\t\t\t\tslide.setAttribute( 'data-background-image', data.background );\n\t\t\t}\n\t\t\telse {\n\t\t\t\telement.style.background = data.background;\n\t\t\t}\n\t\t}\n\n\t\t// Create a hash for this combination of background settings.\n\t\t// This is used to determine when two slide backgrounds are\n\t\t// the same.\n\t\tif( data.background || data.backgroundColor || data.backgroundGradient || data.backgroundImage || data.backgroundVideo || data.backgroundIframe ) {\n\t\t\telement.setAttribute( 'data-background-hash', data.background +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundSize +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundImage +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundVideo +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundIframe +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundColor +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundGradient +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundRepeat +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundPosition +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundTransition +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundOpacity );\n\t\t}\n\n\t\t// Additional and optional background properties\n\t\tif( data.backgroundSize ) element.setAttribute( 'data-background-size', data.backgroundSize );\n\t\tif( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor;\n\t\tif( data.backgroundGradient ) element.style.backgroundImage = data.backgroundGradient;\n\t\tif( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition );\n\n\t\tif( dataPreload ) element.setAttribute( 'data-preload', '' );\n\n\t\t// Background image options are set on the content wrapper\n\t\tif( data.backgroundSize ) contentElement.style.backgroundSize = data.backgroundSize;\n\t\tif( data.backgroundRepeat ) contentElement.style.backgroundRepeat = data.backgroundRepeat;\n\t\tif( data.backgroundPosition ) contentElement.style.backgroundPosition = data.backgroundPosition;\n\t\tif( data.backgroundOpacity ) contentElement.style.opacity = data.backgroundOpacity;\n\n\t\tconst contrastClass = this.getContrastClass( slide );\n\n\t\tif( typeof contrastClass === 'string' ) {\n\t\t\tslide.classList.add( contrastClass );\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a class name that can be applied to a slide to indicate\n\t * if it has a light or dark background.\n\t *\n\t * @param {*} slide\n\t *\n\t * @returns {string|null}\n\t */\n\tgetContrastClass( slide ) {\n\n\t\tconst element = slide.slideBackgroundElement;\n\n\t\t// If this slide has a background color, we add a class that\n\t\t// signals if it is light or dark. If the slide has no background\n\t\t// color, no class will be added\n\t\tlet contrastColor = slide.getAttribute( 'data-background-color' );\n\n\t\t// If no bg color was found, or it cannot be converted by colorToRgb, check the computed background\n\t\tif( !contrastColor || !colorToRgb( contrastColor ) ) {\n\t\t\tlet computedBackgroundStyle = window.getComputedStyle( element );\n\t\t\tif( computedBackgroundStyle && computedBackgroundStyle.backgroundColor ) {\n\t\t\t\tcontrastColor = computedBackgroundStyle.backgroundColor;\n\t\t\t}\n\t\t}\n\n\t\tif( contrastColor ) {\n\t\t\tconst rgb = colorToRgb( contrastColor );\n\n\t\t\t// Ignore fully transparent backgrounds. Some browsers return\n\t\t\t// rgba(0,0,0,0) when reading the computed background color of\n\t\t\t// an element with no background\n\t\t\tif( rgb && rgb.a !== 0 ) {\n\t\t\t\tif( colorBrightness( contrastColor ) < 128 ) {\n\t\t\t\t\treturn 'has-dark-background';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn 'has-light-background';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Bubble the 'has-light-background'/'has-dark-background' classes.\n\t */\n\tbubbleSlideContrastClassToElement( slide, target ) {\n\n\t\t[ 'has-light-background', 'has-dark-background' ].forEach( classToBubble => {\n\t\t\tif( slide.classList.contains( classToBubble ) ) {\n\t\t\t\ttarget.classList.add( classToBubble );\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttarget.classList.remove( classToBubble );\n\t\t\t}\n\t\t}, this );\n\n\t}\n\n\t/**\n\t * Updates the background elements to reflect the current\n\t * slide.\n\t *\n\t * @param {boolean} includeAll If true, the backgrounds of\n\t * all vertical slides (not just the present) will be updated.\n\t */\n\tupdate( includeAll = false ) {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tlet indices = this.Reveal.getIndices();\n\n\t\tlet currentBackground = null;\n\n\t\t// Reverse past/future classes when in RTL mode\n\t\tlet horizontalPast = this.Reveal.getConfig().rtl ? 'future' : 'past',\n\t\t\thorizontalFuture = this.Reveal.getConfig().rtl ? 'past' : 'future';\n\n\t\t// Update the classes of all backgrounds to match the\n\t\t// states of their slides (past/present/future)\n\t\tArray.from( this.element.childNodes ).forEach( ( backgroundh, h ) => {\n\n\t\t\tbackgroundh.classList.remove( 'past', 'present', 'future' );\n\n\t\t\tif( h < indices.h ) {\n\t\t\t\tbackgroundh.classList.add( horizontalPast );\n\t\t\t}\n\t\t\telse if ( h > indices.h ) {\n\t\t\t\tbackgroundh.classList.add( horizontalFuture );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundh.classList.add( 'present' );\n\n\t\t\t\t// Store a reference to the current background element\n\t\t\t\tcurrentBackground = backgroundh;\n\t\t\t}\n\n\t\t\tif( includeAll || h === indices.h ) {\n\t\t\t\tqueryAll( backgroundh, '.slide-background' ).forEach( ( backgroundv, v ) => {\n\n\t\t\t\t\tbackgroundv.classList.remove( 'past', 'present', 'future' );\n\n\t\t\t\t\tconst indexv = typeof indices.v === 'number' ? indices.v : 0;\n\n\t\t\t\t\tif( v < indexv ) {\n\t\t\t\t\t\tbackgroundv.classList.add( 'past' );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( v > indexv ) {\n\t\t\t\t\t\tbackgroundv.classList.add( 'future' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbackgroundv.classList.add( 'present' );\n\n\t\t\t\t\t\t// Only if this is the present horizontal and vertical slide\n\t\t\t\t\t\tif( h === indices.h ) currentBackground = backgroundv;\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t}\n\n\t\t} );\n\n\t\t// Stop content inside of previous backgrounds\n\t\tif( this.previousBackground ) {\n\n\t\t\tthis.Reveal.slideContent.stopEmbeddedContent( this.previousBackground, { unloadIframes: !this.Reveal.slideContent.shouldPreload( this.previousBackground ) } );\n\n\t\t}\n\n\t\t// Start content in the current background\n\t\tif( currentBackground ) {\n\n\t\t\tthis.Reveal.slideContent.startEmbeddedContent( currentBackground );\n\n\t\t\tlet currentBackgroundContent = currentBackground.querySelector( '.slide-background-content' );\n\t\t\tif( currentBackgroundContent ) {\n\n\t\t\t\tlet backgroundImageURL = currentBackgroundContent.style.backgroundImage || '';\n\n\t\t\t\t// Restart GIFs (doesn't work in Firefox)\n\t\t\t\tif( /\\.gif/i.test( backgroundImageURL ) ) {\n\t\t\t\t\tcurrentBackgroundContent.style.backgroundImage = '';\n\t\t\t\t\twindow.getComputedStyle( currentBackgroundContent ).opacity;\n\t\t\t\t\tcurrentBackgroundContent.style.backgroundImage = backgroundImageURL;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Don't transition between identical backgrounds. This\n\t\t\t// prevents unwanted flicker.\n\t\t\tlet previousBackgroundHash = this.previousBackground ? this.previousBackground.getAttribute( 'data-background-hash' ) : null;\n\t\t\tlet currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' );\n\t\t\tif( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== this.previousBackground ) {\n\t\t\t\tthis.element.classList.add( 'no-transition' );\n\t\t\t}\n\n\t\t\tthis.previousBackground = currentBackground;\n\n\t\t}\n\n\t\t// If there's a background brightness flag for this slide,\n\t\t// bubble it to the .reveal container\n\t\tif( currentSlide ) {\n\t\t\tthis.bubbleSlideContrastClassToElement( currentSlide, this.Reveal.getRevealElement() );\n\t\t}\n\n\t\t// Allow the first background to apply without transition\n\t\tsetTimeout( () => {\n\t\t\tthis.element.classList.remove( 'no-transition' );\n\t\t}, 1 );\n\n\t}\n\n\t/**\n\t * Updates the position of the parallax background based\n\t * on the current slide index.\n\t */\n\tupdateParallax() {\n\n\t\tlet indices = this.Reveal.getIndices();\n\n\t\tif( this.Reveal.getConfig().parallaxBackgroundImage ) {\n\n\t\t\tlet horizontalSlides = this.Reveal.getHorizontalSlides(),\n\t\t\t\tverticalSlides = this.Reveal.getVerticalSlides();\n\n\t\t\tlet backgroundSize = this.element.style.backgroundSize.split( ' ' ),\n\t\t\t\tbackgroundWidth, backgroundHeight;\n\n\t\t\tif( backgroundSize.length === 1 ) {\n\t\t\t\tbackgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundWidth = parseInt( backgroundSize[0], 10 );\n\t\t\t\tbackgroundHeight = parseInt( backgroundSize[1], 10 );\n\t\t\t}\n\n\t\t\tlet slideWidth = this.element.offsetWidth,\n\t\t\t\thorizontalSlideCount = horizontalSlides.length,\n\t\t\t\thorizontalOffsetMultiplier,\n\t\t\t\thorizontalOffset;\n\n\t\t\tif( typeof this.Reveal.getConfig().parallaxBackgroundHorizontal === 'number' ) {\n\t\t\t\thorizontalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundHorizontal;\n\t\t\t}\n\t\t\telse {\n\t\t\t\thorizontalOffsetMultiplier = horizontalSlideCount > 1 ? ( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) : 0;\n\t\t\t}\n\n\t\t\thorizontalOffset = horizontalOffsetMultiplier * indices.h * -1;\n\n\t\t\tlet slideHeight = this.element.offsetHeight,\n\t\t\t\tverticalSlideCount = verticalSlides.length,\n\t\t\t\tverticalOffsetMultiplier,\n\t\t\t\tverticalOffset;\n\n\t\t\tif( typeof this.Reveal.getConfig().parallaxBackgroundVertical === 'number' ) {\n\t\t\t\tverticalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundVertical;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tverticalOffsetMultiplier = ( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 );\n\t\t\t}\n\n\t\t\tverticalOffset = verticalSlideCount > 0 ? verticalOffsetMultiplier * indices.v : 0;\n\n\t\t\tthis.element.style.backgroundPosition = horizontalOffset + 'px ' + -verticalOffset + 'px';\n\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}\n","const UA = navigator.userAgent;\n\nexport const isMobile = /(iphone|ipod|ipad|android)/gi.test( UA ) ||\n\t\t\t\t\t\t( navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1 ); // iPadOS\n\nexport const isChrome = /chrome/i.test( UA ) && !/edge/i.test( UA );\n\nexport const isAndroid = /android/gi.test( UA );","import { queryAll } from '../utils/util.js'\nimport { isAndroid } from '../utils/device.js'\n\n/**\n * Manages our presentation controls. This includes both\n * the built-in control arrows as well as event monitoring\n * of any elements within the presentation with either of the\n * following helper classes:\n * - .navigate-up\n * - .navigate-right\n * - .navigate-down\n * - .navigate-left\n * - .navigate-next\n * - .navigate-prev\n */\nexport default class Controls {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onNavigateLeftClicked = this.onNavigateLeftClicked.bind( this );\n\t\tthis.onNavigateRightClicked = this.onNavigateRightClicked.bind( this );\n\t\tthis.onNavigateUpClicked = this.onNavigateUpClicked.bind( this );\n\t\tthis.onNavigateDownClicked = this.onNavigateDownClicked.bind( this );\n\t\tthis.onNavigatePrevClicked = this.onNavigatePrevClicked.bind( this );\n\t\tthis.onNavigateNextClicked = this.onNavigateNextClicked.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tconst rtl = this.Reveal.getConfig().rtl;\n\t\tconst revealElement = this.Reveal.getRevealElement();\n\n\t\tthis.element = document.createElement( 'aside' );\n\t\tthis.element.className = 'controls';\n\t\tthis.element.innerHTML =\n\t\t\t`<button class=\"navigate-left\" aria-label=\"${ rtl ? 'next slide' : 'previous slide' }\"><div class=\"controls-arrow\"></div></button>\n\t\t\t<button class=\"navigate-right\" aria-label=\"${ rtl ? 'previous slide' : 'next slide' }\"><div class=\"controls-arrow\"></div></button>\n\t\t\t<button class=\"navigate-up\" aria-label=\"above slide\"><div class=\"controls-arrow\"></div></button>\n\t\t\t<button class=\"navigate-down\" aria-label=\"below slide\"><div class=\"controls-arrow\"></div></button>`;\n\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t\t// There can be multiple instances of controls throughout the page\n\t\tthis.controlsLeft = queryAll( revealElement, '.navigate-left' );\n\t\tthis.controlsRight = queryAll( revealElement, '.navigate-right' );\n\t\tthis.controlsUp = queryAll( revealElement, '.navigate-up' );\n\t\tthis.controlsDown = queryAll( revealElement, '.navigate-down' );\n\t\tthis.controlsPrev = queryAll( revealElement, '.navigate-prev' );\n\t\tthis.controlsNext = queryAll( revealElement, '.navigate-next' );\n\n\t\t// The left, right and down arrows in the standard reveal.js controls\n\t\tthis.controlsRightArrow = this.element.querySelector( '.navigate-right' );\n\t\tthis.controlsLeftArrow = this.element.querySelector( '.navigate-left' );\n\t\tthis.controlsDownArrow = this.element.querySelector( '.navigate-down' );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tthis.element.style.display = config.controls ? 'block' : 'none';\n\n\t\tthis.element.setAttribute( 'data-controls-layout', config.controlsLayout );\n\t\tthis.element.setAttribute( 'data-controls-back-arrows', config.controlsBackArrows );\n\n\t}\n\n\tbind() {\n\n\t\t// Listen to both touch and click events, in case the device\n\t\t// supports both\n\t\tlet pointerEvents = [ 'touchstart', 'click' ];\n\n\t\t// Only support touch for Android, fixes double navigations in\n\t\t// stock browser\n\t\tif( isAndroid ) {\n\t\t\tpointerEvents = [ 'touchstart' ];\n\t\t}\n\n\t\tpointerEvents.forEach( eventName => {\n\t\t\tthis.controlsLeft.forEach( el => el.addEventListener( eventName, this.onNavigateLeftClicked, false ) );\n\t\t\tthis.controlsRight.forEach( el => el.addEventListener( eventName, this.onNavigateRightClicked, false ) );\n\t\t\tthis.controlsUp.forEach( el => el.addEventListener( eventName, this.onNavigateUpClicked, false ) );\n\t\t\tthis.controlsDown.forEach( el => el.addEventListener( eventName, this.onNavigateDownClicked, false ) );\n\t\t\tthis.controlsPrev.forEach( el => el.addEventListener( eventName, this.onNavigatePrevClicked, false ) );\n\t\t\tthis.controlsNext.forEach( el => el.addEventListener( eventName, this.onNavigateNextClicked, false ) );\n\t\t} );\n\n\t}\n\n\tunbind() {\n\n\t\t[ 'touchstart', 'click' ].forEach( eventName => {\n\t\t\tthis.controlsLeft.forEach( el => el.removeEventListener( eventName, this.onNavigateLeftClicked, false ) );\n\t\t\tthis.controlsRight.forEach( el => el.removeEventListener( eventName, this.onNavigateRightClicked, false ) );\n\t\t\tthis.controlsUp.forEach( el => el.removeEventListener( eventName, this.onNavigateUpClicked, false ) );\n\t\t\tthis.controlsDown.forEach( el => el.removeEventListener( eventName, this.onNavigateDownClicked, false ) );\n\t\t\tthis.controlsPrev.forEach( el => el.removeEventListener( eventName, this.onNavigatePrevClicked, false ) );\n\t\t\tthis.controlsNext.forEach( el => el.removeEventListener( eventName, this.onNavigateNextClicked, false ) );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates the state of all control/navigation arrows.\n\t */\n\tupdate() {\n\n\t\tlet routes = this.Reveal.availableRoutes();\n\n\t\t// Remove the 'enabled' class from all directions\n\t\t[...this.controlsLeft, ...this.controlsRight, ...this.controlsUp, ...this.controlsDown, ...this.controlsPrev, ...this.controlsNext].forEach( node => {\n\t\t\tnode.classList.remove( 'enabled', 'fragmented' );\n\n\t\t\t// Set 'disabled' attribute on all directions\n\t\t\tnode.setAttribute( 'disabled', 'disabled' );\n\t\t} );\n\n\t\t// Add the 'enabled' class to the available routes; remove 'disabled' attribute to enable buttons\n\t\tif( routes.left ) this.controlsLeft.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.right ) this.controlsRight.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.up ) this.controlsUp.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.down ) this.controlsDown.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t// Prev/next buttons\n\t\tif( routes.left || routes.up ) this.controlsPrev.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.right || routes.down ) this.controlsNext.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t// Highlight fragment directions\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide ) {\n\n\t\t\tlet fragmentsRoutes = this.Reveal.fragments.availableRoutes();\n\n\t\t\t// Always apply fragment decorator to prev/next buttons\n\t\t\tif( fragmentsRoutes.prev ) this.controlsPrev.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\tif( fragmentsRoutes.next ) this.controlsNext.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t\t// Apply fragment decorators to directional buttons based on\n\t\t\t// what slide axis they are in\n\t\t\tif( this.Reveal.isVerticalSlide( currentSlide ) ) {\n\t\t\t\tif( fragmentsRoutes.prev ) this.controlsUp.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t\tif( fragmentsRoutes.next ) this.controlsDown.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( fragmentsRoutes.prev ) this.controlsLeft.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t\tif( fragmentsRoutes.next ) this.controlsRight.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t}\n\n\t\t}\n\n\t\tif( this.Reveal.getConfig().controlsTutorial ) {\n\n\t\t\tlet indices = this.Reveal.getIndices();\n\n\t\t\t// Highlight control arrows with an animation to ensure\n\t\t\t// that the viewer knows how to navigate\n\t\t\tif( !this.Reveal.hasNavigatedVertically() && routes.down ) {\n\t\t\t\tthis.controlsDownArrow.classList.add( 'highlight' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.controlsDownArrow.classList.remove( 'highlight' );\n\n\t\t\t\tif( this.Reveal.getConfig().rtl ) {\n\n\t\t\t\t\tif( !this.Reveal.hasNavigatedHorizontally() && routes.left && indices.v === 0 ) {\n\t\t\t\t\t\tthis.controlsLeftArrow.classList.add( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.controlsLeftArrow.classList.remove( 'highlight' );\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif( !this.Reveal.hasNavigatedHorizontally() && routes.right && indices.v === 0 ) {\n\t\t\t\t\t\tthis.controlsRightArrow.classList.add( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.controlsRightArrow.classList.remove( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy() {\n\n\t\tthis.unbind();\n\t\tthis.element.remove();\n\n\t}\n\n\t/**\n\t * Event handlers for navigation control buttons.\n\t */\n\tonNavigateLeftClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tif( this.Reveal.getConfig().navigationMode === 'linear' ) {\n\t\t\tthis.Reveal.prev();\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.left();\n\t\t}\n\n\t}\n\n\tonNavigateRightClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tif( this.Reveal.getConfig().navigationMode === 'linear' ) {\n\t\t\tthis.Reveal.next();\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.right();\n\t\t}\n\n\t}\n\n\tonNavigateUpClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.up();\n\n\t}\n\n\tonNavigateDownClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.down();\n\n\t}\n\n\tonNavigatePrevClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.prev();\n\n\t}\n\n\tonNavigateNextClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.next();\n\n\t}\n\n\n}","import { closest } from '../utils/util.js'\n\n/**\n * Manages focus when a presentation is embedded. This\n * helps us only capture keyboard from the presentation\n * a user is currently interacting with in a page where\n * multiple presentations are embedded.\n */\n\nconst STATE_FOCUS = 'focus';\nconst STATE_BLUR = 'blur';\n\nexport default class Focus {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onRevealPointerDown = this.onRevealPointerDown.bind( this );\n\t\tthis.onDocumentPointerDown = this.onDocumentPointerDown.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.embedded ) {\n\t\t\tthis.blur();\n\t\t}\n\t\telse {\n\t\t\tthis.focus();\n\t\t\tthis.unbind();\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tif( this.Reveal.getConfig().embedded ) {\n\t\t\tthis.Reveal.getRevealElement().addEventListener( 'pointerdown', this.onRevealPointerDown, false );\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tthis.Reveal.getRevealElement().removeEventListener( 'pointerdown', this.onRevealPointerDown, false );\n\t\tdocument.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\n\t}\n\n\tfocus() {\n\n\t\tif( this.state !== STATE_FOCUS ) {\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'focused' );\n\t\t\tdocument.addEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\t\t}\n\n\t\tthis.state = STATE_FOCUS;\n\n\t}\n\n\tblur() {\n\n\t\tif( this.state !== STATE_BLUR ) {\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'focused' );\n\t\t\tdocument.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\t\t}\n\n\t\tthis.state = STATE_BLUR;\n\n\t}\n\n\tisFocused() {\n\n\t\treturn this.state === STATE_FOCUS;\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.Reveal.getRevealElement().classList.remove( 'focused' );\n\n\t}\n\n\tonRevealPointerDown( event ) {\n\n\t\tthis.focus();\n\n\t}\n\n\tonDocumentPointerDown( event ) {\n\n\t\tlet revealElement = closest( event.target, '.reveal' );\n\t\tif( !revealElement || revealElement !== this.Reveal.getRevealElement() ) {\n\t\t\tthis.blur();\n\t\t}\n\n\t}\n\n}","import { extend, queryAll } from '../utils/util.js'\n\n/**\n * Handles sorting and navigation of slide fragments.\n * Fragments are elements within a slide that are\n * revealed/animated incrementally.\n */\nexport default class Fragments {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.fragments === false ) {\n\t\t\tthis.disable();\n\t\t}\n\t\telse if( oldConfig.fragments === false ) {\n\t\t\tthis.enable();\n\t\t}\n\n\t}\n\n\t/**\n\t * If fragments are disabled in the deck, they should all be\n\t * visible rather than stepped through.\n\t */\n\tdisable() {\n\n\t\tqueryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {\n\t\t\telement.classList.add( 'visible' );\n\t\t\telement.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Reverse of #disable(). Only called if fragments have\n\t * previously been disabled.\n\t */\n\tenable() {\n\n\t\tqueryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {\n\t\t\telement.classList.remove( 'visible' );\n\t\t\telement.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns an object describing the available fragment\n\t * directions.\n\t *\n\t * @return {{prev: boolean, next: boolean}}\n\t */\n\tavailableRoutes() {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\t\t\tlet fragments = currentSlide.querySelectorAll( '.fragment:not(.disabled)' );\n\t\t\tlet hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.disabled):not(.visible)' );\n\n\t\t\treturn {\n\t\t\t\tprev: fragments.length - hiddenFragments.length > 0,\n\t\t\t\tnext: !!hiddenFragments.length\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\treturn { prev: false, next: false };\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a sorted fragments list, ordered by an increasing\n\t * \"data-fragment-index\" attribute.\n\t *\n\t * Fragments will be revealed in the order that they are returned by\n\t * this function, so you can use the index attributes to control the\n\t * order of fragment appearance.\n\t *\n\t * To maintain a sensible default fragment order, fragments are presumed\n\t * to be passed in document order. This function adds a \"fragment-index\"\n\t * attribute to each node if such an attribute is not already present,\n\t * and sets that attribute to an integer value which is the position of\n\t * the fragment within the fragments list.\n\t *\n\t * @param {object[]|*} fragments\n\t * @param {boolean} grouped If true the returned array will contain\n\t * nested arrays for all fragments with the same index\n\t * @return {object[]} sorted Sorted array of fragments\n\t */\n\tsort( fragments, grouped = false ) {\n\n\t\tfragments = Array.from( fragments );\n\n\t\tlet ordered = [],\n\t\t\tunordered = [],\n\t\t\tsorted = [];\n\n\t\t// Group ordered and unordered elements\n\t\tfragments.forEach( fragment => {\n\t\t\tif( fragment.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\tlet index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 );\n\n\t\t\t\tif( !ordered[index] ) {\n\t\t\t\t\tordered[index] = [];\n\t\t\t\t}\n\n\t\t\t\tordered[index].push( fragment );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tunordered.push( [ fragment ] );\n\t\t\t}\n\t\t} );\n\n\t\t// Append fragments without explicit indices in their\n\t\t// DOM order\n\t\tordered = ordered.concat( unordered );\n\n\t\t// Manually count the index up per group to ensure there\n\t\t// are no gaps\n\t\tlet index = 0;\n\n\t\t// Push all fragments in their sorted order to an array,\n\t\t// this flattens the groups\n\t\tordered.forEach( group => {\n\t\t\tgroup.forEach( fragment => {\n\t\t\t\tsorted.push( fragment );\n\t\t\t\tfragment.setAttribute( 'data-fragment-index', index );\n\t\t\t} );\n\n\t\t\tindex ++;\n\t\t} );\n\n\t\treturn grouped === true ? ordered : sorted;\n\n\t}\n\n\t/**\n\t * Sorts and formats all of fragments in the\n\t * presentation.\n\t */\n\tsortAll() {\n\n\t\tthis.Reveal.getHorizontalSlides().forEach( horizontalSlide => {\n\n\t\t\tlet verticalSlides = queryAll( horizontalSlide, 'section' );\n\t\t\tverticalSlides.forEach( ( verticalSlide, y ) => {\n\n\t\t\t\tthis.sort( verticalSlide.querySelectorAll( '.fragment' ) );\n\n\t\t\t}, this );\n\n\t\t\tif( verticalSlides.length === 0 ) this.sort( horizontalSlide.querySelectorAll( '.fragment' ) );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Refreshes the fragments on the current slide so that they\n\t * have the appropriate classes (.visible + .current-fragment).\n\t *\n\t * @param {number} [index] The index of the current fragment\n\t * @param {array} [fragments] Array containing all fragments\n\t * in the current slide\n\t *\n\t * @return {{shown: array, hidden: array}}\n\t */\n\tupdate( index, fragments, slide = this.Reveal.getCurrentSlide() ) {\n\n\t\tlet changedFragments = {\n\t\t\tshown: [],\n\t\t\thidden: []\n\t\t};\n\n\t\tif( slide && this.Reveal.getConfig().fragments ) {\n\n\t\t\tfragments = fragments || this.sort( slide.querySelectorAll( '.fragment' ) );\n\n\t\t\tif( fragments.length ) {\n\n\t\t\t\tlet maxIndex = 0;\n\n\t\t\t\tif( typeof index !== 'number' ) {\n\t\t\t\t\tlet currentFragment = this.sort( slide.querySelectorAll( '.fragment.visible' ) ).pop();\n\t\t\t\t\tif( currentFragment ) {\n\t\t\t\t\t\tindex = parseInt( currentFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tArray.from( fragments ).forEach( ( el, i ) => {\n\n\t\t\t\t\tif( el.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\t\t\ti = parseInt( el.getAttribute( 'data-fragment-index' ), 10 );\n\t\t\t\t\t}\n\n\t\t\t\t\tmaxIndex = Math.max( maxIndex, i );\n\n\t\t\t\t\t// Visible fragments\n\t\t\t\t\tif( i <= index ) {\n\t\t\t\t\t\tlet wasVisible = el.classList.contains( 'visible' )\n\t\t\t\t\t\tel.classList.add( 'visible' );\n\t\t\t\t\t\tel.classList.remove( 'current-fragment' );\n\n\t\t\t\t\t\tif( i === index ) {\n\t\t\t\t\t\t\t// Announce the fragments one by one to the Screen Reader\n\t\t\t\t\t\t\tthis.Reveal.announceStatus( this.Reveal.getStatusText( el ) );\n\n\t\t\t\t\t\t\tel.classList.add( 'current-fragment' );\n\t\t\t\t\t\t\tthis.Reveal.slideContent.startEmbeddedContent( el );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif( !wasVisible ) {\n\t\t\t\t\t\t\tchangedFragments.shown.push( el )\n\t\t\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\ttype: 'visible',\n\t\t\t\t\t\t\t\tbubbles: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Hidden fragments\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet wasVisible = el.classList.contains( 'visible' )\n\t\t\t\t\t\tel.classList.remove( 'visible' );\n\t\t\t\t\t\tel.classList.remove( 'current-fragment' );\n\n\t\t\t\t\t\tif( wasVisible ) {\n\t\t\t\t\t\t\tthis.Reveal.slideContent.stopEmbeddedContent( el );\n\t\t\t\t\t\t\tchangedFragments.hidden.push( el );\n\t\t\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\t\t\tbubbles: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t// Write the current fragment index to the slide <section>.\n\t\t\t\t// This can be used by end users to apply styles based on\n\t\t\t\t// the current fragment index.\n\t\t\t\tindex = typeof index === 'number' ? index : -1;\n\t\t\t\tindex = Math.max( Math.min( index, maxIndex ), -1 );\n\t\t\t\tslide.setAttribute( 'data-fragment', index );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn changedFragments;\n\n\t}\n\n\t/**\n\t * Formats the fragments on the given slide so that they have\n\t * valid indices. Call this if fragments are changed in the DOM\n\t * after reveal.js has already initialized.\n\t *\n\t * @param {HTMLElement} slide\n\t * @return {Array} a list of the HTML fragments that were synced\n\t */\n\tsync( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\treturn this.sort( slide.querySelectorAll( '.fragment' ) );\n\n\t}\n\n\t/**\n\t * Navigate to the specified slide fragment.\n\t *\n\t * @param {?number} index The index of the fragment that\n\t * should be shown, -1 means all are invisible\n\t * @param {number} offset Integer offset to apply to the\n\t * fragment index\n\t *\n\t * @return {boolean} true if a change was made in any\n\t * fragments visibility as part of this call\n\t */\n\tgoto( index, offset = 0 ) {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\n\t\t\tlet fragments = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled)' ) );\n\t\t\tif( fragments.length ) {\n\n\t\t\t\t// If no index is specified, find the current\n\t\t\t\tif( typeof index !== 'number' ) {\n\t\t\t\t\tlet lastVisibleFragment = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled).visible' ) ).pop();\n\n\t\t\t\t\tif( lastVisibleFragment ) {\n\t\t\t\t\t\tindex = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tindex = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply the offset if there is one\n\t\t\t\tindex += offset;\n\n\t\t\t\tlet changedFragments = this.update( index, fragments );\n\n\t\t\t\tif( changedFragments.hidden.length ) {\n\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\ttype: 'fragmenthidden',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tfragment: changedFragments.hidden[0],\n\t\t\t\t\t\t\tfragments: changedFragments.hidden\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif( changedFragments.shown.length ) {\n\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\ttype: 'fragmentshown',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tfragment: changedFragments.shown[0],\n\t\t\t\t\t\t\tfragments: changedFragments.shown\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.Reveal.controls.update();\n\t\t\t\tthis.Reveal.progress.update();\n\n\t\t\t\tif( this.Reveal.getConfig().fragmentInURL ) {\n\t\t\t\t\tthis.Reveal.location.writeURL();\n\t\t\t\t}\n\n\t\t\t\treturn !!( changedFragments.shown.length || changedFragments.hidden.length );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Navigate to the next slide fragment.\n\t *\n\t * @return {boolean} true if there was a next fragment,\n\t * false otherwise\n\t */\n\tnext() {\n\n\t\treturn this.goto( null, 1 );\n\n\t}\n\n\t/**\n\t * Navigate to the previous slide fragment.\n\t *\n\t * @return {boolean} true if there was a previous fragment,\n\t * false otherwise\n\t */\n\tprev() {\n\n\t\treturn this.goto( null, -1 );\n\n\t}\n\n}","import {\n\tSLIDE_NUMBER_FORMAT_CURRENT,\n\tSLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL\n} from \"../utils/constants\";\n\n/**\n * Makes it possible to jump to a slide by entering its\n * slide number or id.\n */\nexport default class JumpToSlide {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onInput = this.onInput.bind( this );\n\t\tthis.onBlur = this.onBlur.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'jump-to-slide';\n\n this.jumpInput = document.createElement( 'input' );\n this.jumpInput.type = 'text';\n this.jumpInput.className = 'jump-to-slide-input';\n this.jumpInput.placeholder = 'Jump to slide';\n\t\tthis.jumpInput.addEventListener( 'input', this.onInput );\n\t\tthis.jumpInput.addEventListener( 'keydown', this.onKeyDown );\n\t\tthis.jumpInput.addEventListener( 'blur', this.onBlur );\n\n this.element.appendChild( this.jumpInput );\n\n\t}\n\n\tshow() {\n\n\t\tthis.indicesOnShow = this.Reveal.getIndices();\n\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\t\tthis.jumpInput.focus();\n\n\t}\n\n\thide() {\n\n\t\tif( this.isVisible() ) {\n\t\t\tthis.element.remove();\n\t\t\tthis.jumpInput.value = '';\n\n\t\t\tclearTimeout( this.jumpTimeout );\n\t\t\tdelete this.jumpTimeout;\n\t\t}\n\n\t}\n\n\tisVisible() {\n\n\t\treturn !!this.element.parentNode;\n\n\t}\n\n\t/**\n\t * Parses the current input and jumps to the given slide.\n\t */\n\tjump() {\n\n\t\tclearTimeout( this.jumpTimeout );\n\t\tdelete this.jumpTimeout;\n\n\t\tlet query = this.jumpInput.value.trim( '' );\n\t\tlet indices;\n\n\t\t// When slide numbers are formatted to be a single linear mumber\n\t\t// (instead of showing a separate horizontal/vertical index) we\n\t\t// use the same format for slide jumps\n\t\tif( /^\\d+$/.test( query ) ) {\n\t\t\tconst slideNumberFormat = this.Reveal.getConfig().slideNumber;\n\t\t\tif( slideNumberFormat === SLIDE_NUMBER_FORMAT_CURRENT || slideNumberFormat === SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL ) {\n\t\t\t\tconst slide = this.Reveal.getSlides()[ parseInt( query, 10 ) - 1 ];\n\t\t\t\tif( slide ) {\n\t\t\t\t\tindices = this.Reveal.getIndices( slide );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( !indices ) {\n\t\t\t// If the query uses \"horizontal.vertical\" format, convert to\n\t\t\t// \"horizontal/vertical\" so that our URL parser can understand\n\t\t\tif( /^\\d+\\.\\d+$/.test( query ) ) {\n\t\t\t\tquery = query.replace( '.', '/' );\n\t\t\t}\n\n\t\t\tindices = this.Reveal.location.getIndicesFromHash( query, { oneBasedIndex: true } );\n\t\t}\n\n\t\t// Still no valid index? Fall back on a text search\n\t\tif( !indices && /\\S+/i.test( query ) && query.length > 1 ) {\n\t\t\tindices = this.search( query );\n\t\t}\n\n\t\tif( indices && query !== '' ) {\n\t\t\tthis.Reveal.slide( indices.h, indices.v, indices.f );\n\t\t\treturn true;\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.slide( this.indicesOnShow.h, this.indicesOnShow.v, this.indicesOnShow.f );\n\t\t\treturn false;\n\t\t}\n\n\t}\n\n\tjumpAfter( delay ) {\n\n\t\tclearTimeout( this.jumpTimeout );\n\t\tthis.jumpTimeout = setTimeout( () => this.jump(), delay );\n\n\t}\n\n\t/**\n\t * A lofi search that looks for the given query in all\n\t * of our slides and returns the first match.\n\t */\n\tsearch( query ) {\n\n\t\tconst regex = new RegExp( '\\\\b' + query.trim() + '\\\\b', 'i' );\n\n\t\tconst slide = this.Reveal.getSlides().find( ( slide ) => {\n\t\t\treturn regex.test( slide.innerText );\n\t\t} );\n\n\t\tif( slide ) {\n\t\t\treturn this.Reveal.getIndices( slide );\n\t\t}\n\t\telse {\n\t\t\treturn null;\n\t\t}\n\n\t}\n\n\t/**\n\t * Reverts back to the slide we were on when jump to slide was\n\t * invoked.\n\t */\n\tcancel() {\n\n\t\tthis.Reveal.slide( this.indicesOnShow.h, this.indicesOnShow.v, this.indicesOnShow.f );\n\t\tthis.hide();\n\n\t}\n\n\tconfirm() {\n\n\t\tthis.jump();\n\t\tthis.hide();\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.jumpInput.removeEventListener( 'input', this.onInput );\n\t\tthis.jumpInput.removeEventListener( 'keydown', this.onKeyDown );\n\t\tthis.jumpInput.removeEventListener( 'blur', this.onBlur );\n\n\t\tthis.element.remove();\n\n\t}\n\n\tonKeyDown( event ) {\n\n\t\tif( event.keyCode === 13 ) {\n\t\t\tthis.confirm();\n\t\t}\n\t\telse if( event.keyCode === 27 ) {\n\t\t\tthis.cancel();\n\n\t\t\tevent.stopImmediatePropagation();\n\t\t}\n\n\t}\n\n\tonInput( event ) {\n\n\t\tthis.jumpAfter( 200 );\n\n\t}\n\n\tonBlur() {\n\n\t\tsetTimeout( () => this.hide(), 1 );\n\n\t}\n\n}","import { enterFullscreen } from '../utils/util.js'\n\n/**\n * Handles all reveal.js keyboard interactions.\n */\nexport default class Keyboard {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// A key:value map of keyboard keys and descriptions of\n\t\t// the actions they trigger\n\t\tthis.shortcuts = {};\n\n\t\t// Holds custom key code mappings\n\t\tthis.bindings = {};\n\n\t\tthis.onDocumentKeyDown = this.onDocumentKeyDown.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.navigationMode === 'linear' ) {\n\t\t\tthis.shortcuts['→ , ↓ , SPACE , N , L , J'] = 'Next slide';\n\t\t\tthis.shortcuts['← , ↑ , P , H , K'] = 'Previous slide';\n\t\t}\n\t\telse {\n\t\t\tthis.shortcuts['N , SPACE'] = 'Next slide';\n\t\t\tthis.shortcuts['P , Shift SPACE'] = 'Previous slide';\n\t\t\tthis.shortcuts['← , H'] = 'Navigate left';\n\t\t\tthis.shortcuts['→ , L'] = 'Navigate right';\n\t\t\tthis.shortcuts['↑ , K'] = 'Navigate up';\n\t\t\tthis.shortcuts['↓ , J'] = 'Navigate down';\n\t\t}\n\n\t\tthis.shortcuts['Alt + ←/↑/→/↓'] = 'Navigate without fragments';\n\t\tthis.shortcuts['Shift + ←/↑/→/↓'] = 'Jump to first/last slide';\n\t\tthis.shortcuts['B , .'] = 'Pause';\n\t\tthis.shortcuts['F'] = 'Fullscreen';\n\t\tthis.shortcuts['G'] = 'Jump to slide';\n\t\tthis.shortcuts['ESC, O'] = 'Slide overview';\n\n\t}\n\n\t/**\n\t * Starts listening for keyboard events.\n\t */\n\tbind() {\n\n\t\tdocument.addEventListener( 'keydown', this.onDocumentKeyDown, false );\n\n\t}\n\n\t/**\n\t * Stops listening for keyboard events.\n\t */\n\tunbind() {\n\n\t\tdocument.removeEventListener( 'keydown', this.onDocumentKeyDown, false );\n\n\t}\n\n\t/**\n\t * Add a custom key binding with optional description to\n\t * be added to the help screen.\n\t */\n\taddKeyBinding( binding, callback ) {\n\n\t\tif( typeof binding === 'object' && binding.keyCode ) {\n\t\t\tthis.bindings[binding.keyCode] = {\n\t\t\t\tcallback: callback,\n\t\t\t\tkey: binding.key,\n\t\t\t\tdescription: binding.description\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\tthis.bindings[binding] = {\n\t\t\t\tcallback: callback,\n\t\t\t\tkey: null,\n\t\t\t\tdescription: null\n\t\t\t};\n\t\t}\n\n\t}\n\n\t/**\n\t * Removes the specified custom key binding.\n\t */\n\tremoveKeyBinding( keyCode ) {\n\n\t\tdelete this.bindings[keyCode];\n\n\t}\n\n\t/**\n\t * Programmatically triggers a keyboard event\n\t *\n\t * @param {int} keyCode\n\t */\n\ttriggerKey( keyCode ) {\n\n\t\tthis.onDocumentKeyDown( { keyCode } );\n\n\t}\n\n\t/**\n\t * Registers a new shortcut to include in the help overlay\n\t *\n\t * @param {String} key\n\t * @param {String} value\n\t */\n\tregisterKeyboardShortcut( key, value ) {\n\n\t\tthis.shortcuts[key] = value;\n\n\t}\n\n\tgetShortcuts() {\n\n\t\treturn this.shortcuts;\n\n\t}\n\n\tgetBindings() {\n\n\t\treturn this.bindings;\n\n\t}\n\n\t/**\n\t * Handler for the document level 'keydown' event.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentKeyDown( event ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\t// If there's a condition specified and it returns false,\n\t\t// ignore this event\n\t\tif( typeof config.keyboardCondition === 'function' && config.keyboardCondition(event) === false ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If keyboardCondition is set, only capture keyboard events\n\t\t// for embedded decks when they are focused\n\t\tif( config.keyboardCondition === 'focused' && !this.Reveal.isFocused() ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Shorthand\n\t\tlet keyCode = event.keyCode;\n\n\t\t// Remember if auto-sliding was paused so we can toggle it\n\t\tlet autoSlideWasPaused = !this.Reveal.isAutoSliding();\n\n\t\tthis.Reveal.onUserInput( event );\n\n\t\t// Is there a focused element that could be using the keyboard?\n\t\tlet activeElementIsCE = document.activeElement && document.activeElement.isContentEditable === true;\n\t\tlet activeElementIsInput = document.activeElement && document.activeElement.tagName && /input|textarea/i.test( document.activeElement.tagName );\n\t\tlet activeElementIsNotes = document.activeElement && document.activeElement.className && /speaker-notes/i.test( document.activeElement.className);\n\n\t\t// Whitelist certain modifiers for slide navigation shortcuts\n\t\tlet keyCodeUsesModifier = [32, 37, 38, 39, 40, 78, 80, 191].indexOf( event.keyCode ) !== -1;\n\n\t\t// Prevent all other events when a modifier is pressed\n\t\tlet unusedModifier = \t!( keyCodeUsesModifier && event.shiftKey || event.altKey ) &&\n\t\t\t\t\t\t\t\t( event.shiftKey || event.altKey || event.ctrlKey || event.metaKey );\n\n\t\t// Disregard the event if there's a focused element or a\n\t\t// keyboard modifier key is present\n\t\tif( activeElementIsCE || activeElementIsInput || activeElementIsNotes || unusedModifier ) return;\n\n\t\t// While paused only allow resume keyboard events; 'b', 'v', '.'\n\t\tlet resumeKeyCodes = [66,86,190,191];\n\t\tlet key;\n\n\t\t// Custom key bindings for togglePause should be able to resume\n\t\tif( typeof config.keyboard === 'object' ) {\n\t\t\tfor( key in config.keyboard ) {\n\t\t\t\tif( config.keyboard[key] === 'togglePause' ) {\n\t\t\t\t\tresumeKeyCodes.push( parseInt( key, 10 ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( this.Reveal.isPaused() && resumeKeyCodes.indexOf( keyCode ) === -1 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Use linear navigation if we're configured to OR if\n\t\t// the presentation is one-dimensional\n\t\tlet useLinearMode = config.navigationMode === 'linear' || !this.Reveal.hasHorizontalSlides() || !this.Reveal.hasVerticalSlides();\n\n\t\tlet triggered = false;\n\n\t\t// 1. User defined key bindings\n\t\tif( typeof config.keyboard === 'object' ) {\n\n\t\t\tfor( key in config.keyboard ) {\n\n\t\t\t\t// Check if this binding matches the pressed key\n\t\t\t\tif( parseInt( key, 10 ) === keyCode ) {\n\n\t\t\t\t\tlet value = config.keyboard[ key ];\n\n\t\t\t\t\t// Callback function\n\t\t\t\t\tif( typeof value === 'function' ) {\n\t\t\t\t\t\tvalue.apply( null, [ event ] );\n\t\t\t\t\t}\n\t\t\t\t\t// String shortcuts to reveal.js API\n\t\t\t\t\telse if( typeof value === 'string' && typeof this.Reveal[ value ] === 'function' ) {\n\t\t\t\t\t\tthis.Reveal[ value ].call();\n\t\t\t\t\t}\n\n\t\t\t\t\ttriggered = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// 2. Registered custom key bindings\n\t\tif( triggered === false ) {\n\n\t\t\tfor( key in this.bindings ) {\n\n\t\t\t\t// Check if this binding matches the pressed key\n\t\t\t\tif( parseInt( key, 10 ) === keyCode ) {\n\n\t\t\t\t\tlet action = this.bindings[ key ].callback;\n\n\t\t\t\t\t// Callback function\n\t\t\t\t\tif( typeof action === 'function' ) {\n\t\t\t\t\t\taction.apply( null, [ event ] );\n\t\t\t\t\t}\n\t\t\t\t\t// String shortcuts to reveal.js API\n\t\t\t\t\telse if( typeof action === 'string' && typeof this.Reveal[ action ] === 'function' ) {\n\t\t\t\t\t\tthis.Reveal[ action ].call();\n\t\t\t\t\t}\n\n\t\t\t\t\ttriggered = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 3. System defined key bindings\n\t\tif( triggered === false ) {\n\n\t\t\t// Assume true and try to prove false\n\t\t\ttriggered = true;\n\n\t\t\t// P, PAGE UP\n\t\t\tif( keyCode === 80 || keyCode === 33 ) {\n\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t}\n\t\t\t// N, PAGE DOWN\n\t\t\telse if( keyCode === 78 || keyCode === 34 ) {\n\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t}\n\t\t\t// H, LEFT\n\t\t\telse if( keyCode === 72 || keyCode === 37 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( 0 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.left({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// L, RIGHT\n\t\t\telse if( keyCode === 76 || keyCode === 39 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.right({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// K, UP\n\t\t\telse if( keyCode === 75 || keyCode === 38 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( undefined, 0 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.up({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// J, DOWN\n\t\t\telse if( keyCode === 74 || keyCode === 40 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( undefined, Number.MAX_VALUE );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.down({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// HOME\n\t\t\telse if( keyCode === 36 ) {\n\t\t\t\tthis.Reveal.slide( 0 );\n\t\t\t}\n\t\t\t// END\n\t\t\telse if( keyCode === 35 ) {\n\t\t\t\tthis.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 );\n\t\t\t}\n\t\t\t// SPACE\n\t\t\telse if( keyCode === 32 ) {\n\t\t\t\tif( this.Reveal.overview.isActive() ) {\n\t\t\t\t\tthis.Reveal.overview.deactivate();\n\t\t\t\t}\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// TWO-SPOT, SEMICOLON, B, V, PERIOD, LOGITECH PRESENTER TOOLS \"BLACK SCREEN\" BUTTON\n\t\t\telse if( [58, 59, 66, 86, 190].includes( keyCode ) || ( keyCode === 191 && !event.shiftKey ) ) {\n\t\t\t\tthis.Reveal.togglePause();\n\t\t\t}\n\t\t\t// F\n\t\t\telse if( keyCode === 70 ) {\n\t\t\t\tenterFullscreen( config.embedded ? this.Reveal.getViewportElement() : document.documentElement );\n\t\t\t}\n\t\t\t// A\n\t\t\telse if( keyCode === 65 ) {\n\t\t\t\tif( config.autoSlideStoppable ) {\n\t\t\t\t\tthis.Reveal.toggleAutoSlide( autoSlideWasPaused );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// G\n\t\t\telse if( keyCode === 71 ) {\n\t\t\t\tif( config.jumpToSlide ) {\n\t\t\t\t\tthis.Reveal.toggleJumpToSlide();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// ?\n\t\t\telse if( keyCode === 191 && event.shiftKey ) {\n\t\t\t\tthis.Reveal.toggleHelp();\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttriggered = false;\n\t\t\t}\n\n\t\t}\n\n\t\t// If the input resulted in a triggered action we should prevent\n\t\t// the browsers default behavior\n\t\tif( triggered ) {\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\t\t// ESC or O key\n\t\telse if( keyCode === 27 || keyCode === 79 ) {\n\t\t\tif( this.Reveal.closeOverlay() === false ) {\n\t\t\t\tthis.Reveal.overview.toggle();\n\t\t\t}\n\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\n\t\t// If auto-sliding is enabled we need to cue up\n\t\t// another timeout\n\t\tthis.Reveal.cueAutoSlide();\n\n\t}\n\n}","/**\n * Reads and writes the URL based on reveal.js' current state.\n */\nexport default class Location {\n\n\t// The minimum number of milliseconds that must pass between\n\t// calls to history.replaceState\n\tMAX_REPLACE_STATE_FREQUENCY = 1000\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Delays updates to the URL due to a Chrome thumbnailer bug\n\t\tthis.writeURLTimeout = 0;\n\n\t\tthis.replaceStateTimestamp = 0;\n\n\t\tthis.onWindowHashChange = this.onWindowHashChange.bind( this );\n\n\t}\n\n\tbind() {\n\n\t\twindow.addEventListener( 'hashchange', this.onWindowHashChange, false );\n\n\t}\n\n\tunbind() {\n\n\t\twindow.removeEventListener( 'hashchange', this.onWindowHashChange, false );\n\n\t}\n\n\t/**\n\t * Returns the slide indices for the given hash link.\n\t *\n\t * @param {string} [hash] the hash string that we want to\n\t * find the indices for\n\t *\n\t * @returns slide indices or null\n\t */\n\tgetIndicesFromHash( hash=window.location.hash, options={} ) {\n\n\t\t// Attempt to parse the hash as either an index or name\n\t\tlet name = hash.replace( /^#\\/?/, '' );\n\t\tlet bits = name.split( '/' );\n\n\t\t// If the first bit is not fully numeric and there is a name we\n\t\t// can assume that this is a named link\n\t\tif( !/^[0-9]*$/.test( bits[0] ) && name.length ) {\n\t\t\tlet slide;\n\n\t\t\tlet f;\n\n\t\t\t// Parse named links with fragments (#/named-link/2)\n\t\t\tif( /\\/[-\\d]+$/g.test( name ) ) {\n\t\t\t\tf = parseInt( name.split( '/' ).pop(), 10 );\n\t\t\t\tf = isNaN(f) ? undefined : f;\n\t\t\t\tname = name.split( '/' ).shift();\n\t\t\t}\n\n\t\t\t// Ensure the named link is a valid HTML ID attribute\n\t\t\ttry {\n\t\t\t\tslide = document\n\t\t\t\t\t.getElementById( decodeURIComponent( name ) )\n\t\t\t\t\t.closest('.slides section');\n\t\t\t}\n\t\t\tcatch ( error ) { }\n\n\t\t\tif( slide ) {\n\t\t\t\treturn { ...this.Reveal.getIndices( slide ), f };\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconst config = this.Reveal.getConfig();\n\t\t\tlet hashIndexBase = config.hashOneBasedIndex || options.oneBasedIndex ? 1 : 0;\n\n\t\t\t// Read the index components of the hash\n\t\t\tlet h = ( parseInt( bits[0], 10 ) - hashIndexBase ) || 0,\n\t\t\t\tv = ( parseInt( bits[1], 10 ) - hashIndexBase ) || 0,\n\t\t\t\tf;\n\n\t\t\tif( config.fragmentInURL ) {\n\t\t\t\tf = parseInt( bits[2], 10 );\n\t\t\t\tif( isNaN( f ) ) {\n\t\t\t\t\tf = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { h, v, f };\n\t\t}\n\n\t\t// The hash couldn't be parsed or no matching named link was found\n\t\treturn null\n\n\t}\n\n\t/**\n\t * Reads the current URL (hash) and navigates accordingly.\n\t */\n\treadURL() {\n\n\t\tconst currentIndices = this.Reveal.getIndices();\n\t\tconst newIndices = this.getIndicesFromHash();\n\n\t\tif( newIndices ) {\n\t\t\tif( ( newIndices.h !== currentIndices.h || newIndices.v !== currentIndices.v || newIndices.f !== undefined ) ) {\n\t\t\t\t\tthis.Reveal.slide( newIndices.h, newIndices.v, newIndices.f );\n\t\t\t}\n\t\t}\n\t\t// If no new indices are available, we're trying to navigate to\n\t\t// a slide hash that does not exist\n\t\telse {\n\t\t\tthis.Reveal.slide( currentIndices.h || 0, currentIndices.v || 0 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the page URL (hash) to reflect the current\n\t * state.\n\t *\n\t * @param {number} delay The time in ms to wait before\n\t * writing the hash\n\t */\n\twriteURL( delay ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\n\t\t// Make sure there's never more than one timeout running\n\t\tclearTimeout( this.writeURLTimeout );\n\n\t\t// If a delay is specified, timeout this call\n\t\tif( typeof delay === 'number' ) {\n\t\t\tthis.writeURLTimeout = setTimeout( this.writeURL, delay );\n\t\t}\n\t\telse if( currentSlide ) {\n\n\t\t\tlet hash = this.getHash();\n\n\t\t\t// If we're configured to push to history OR the history\n\t\t\t// API is not available.\n\t\t\tif( config.history ) {\n\t\t\t\twindow.location.hash = hash;\n\t\t\t}\n\t\t\t// If we're configured to reflect the current slide in the\n\t\t\t// URL without pushing to history.\n\t\t\telse if( config.hash ) {\n\t\t\t\t// If the hash is empty, don't add it to the URL\n\t\t\t\tif( hash === '/' ) {\n\t\t\t\t\tthis.debouncedReplaceState( window.location.pathname + window.location.search );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.debouncedReplaceState( '#' + hash );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// UPDATE: The below nuking of all hash changes breaks\n\t\t\t// anchors on pages where reveal.js is running. Removed\n\t\t\t// in 4.0. Why was it here in the first place? ¯\\_(ツ)_/¯\n\t\t\t//\n\t\t\t// If history and hash are both disabled, a hash may still\n\t\t\t// be added to the URL by clicking on a href with a hash\n\t\t\t// target. Counter this by always removing the hash.\n\t\t\t// else {\n\t\t\t// \twindow.history.replaceState( null, null, window.location.pathname + window.location.search );\n\t\t\t// }\n\n\t\t}\n\n\t}\n\n\treplaceState( url ) {\n\n\t\twindow.history.replaceState( null, null, url );\n\t\tthis.replaceStateTimestamp = Date.now();\n\n\t}\n\n\tdebouncedReplaceState( url ) {\n\n\t\tclearTimeout( this.replaceStateTimeout );\n\n\t\tif( Date.now() - this.replaceStateTimestamp > this.MAX_REPLACE_STATE_FREQUENCY ) {\n\t\t\tthis.replaceState( url );\n\t\t}\n\t\telse {\n\t\t\tthis.replaceStateTimeout = setTimeout( () => this.replaceState( url ), this.MAX_REPLACE_STATE_FREQUENCY );\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a hash URL that will resolve to the given slide location.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide to link to\n\t */\n\tgetHash( slide ) {\n\n\t\tlet url = '/';\n\n\t\t// Attempt to create a named link based on the slide's ID\n\t\tlet s = slide || this.Reveal.getCurrentSlide();\n\t\tlet id = s ? s.getAttribute( 'id' ) : null;\n\t\tif( id ) {\n\t\t\tid = encodeURIComponent( id );\n\t\t}\n\n\t\tlet index = this.Reveal.getIndices( slide );\n\t\tif( !this.Reveal.getConfig().fragmentInURL ) {\n\t\t\tindex.f = undefined;\n\t\t}\n\n\t\t// If the current slide has an ID, use that as a named link,\n\t\t// but we don't support named links with a fragment index\n\t\tif( typeof id === 'string' && id.length ) {\n\t\t\turl = '/' + id;\n\n\t\t\t// If there is also a fragment, append that at the end\n\t\t\t// of the named link, like: #/named-link/2\n\t\t\tif( index.f >= 0 ) url += '/' + index.f;\n\t\t}\n\t\t// Otherwise use the /h/v index\n\t\telse {\n\t\t\tlet hashIndexBase = this.Reveal.getConfig().hashOneBasedIndex ? 1 : 0;\n\t\t\tif( index.h > 0 || index.v > 0 || index.f >= 0 ) url += index.h + hashIndexBase;\n\t\t\tif( index.v > 0 || index.f >= 0 ) url += '/' + (index.v + hashIndexBase );\n\t\t\tif( index.f >= 0 ) url += '/' + index.f;\n\t\t}\n\n\t\treturn url;\n\n\t}\n\n\t/**\n\t * Handler for the window level 'hashchange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tonWindowHashChange( event ) {\n\n\t\tthis.readURL();\n\n\t}\n\n}","/**\n * Handles the showing of speaker notes\n */\nexport default class Notes {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'speaker-notes';\n\t\tthis.element.setAttribute( 'data-prevent-swipe', '' );\n\t\tthis.element.setAttribute( 'tabindex', '0' );\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.showNotes ) {\n\t\t\tthis.element.setAttribute( 'data-layout', typeof config.showNotes === 'string' ? config.showNotes : 'inline' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Pick up notes from the current slide and display them\n\t * to the viewer.\n\t *\n\t * @see {@link config.showNotes}\n\t */\n\tupdate() {\n\n\t\tif( this.Reveal.getConfig().showNotes &&\n\t\t\tthis.element && this.Reveal.getCurrentSlide() &&\n\t\t\t!this.Reveal.isScrollView() &&\n\t\t\t!this.Reveal.isPrintView()\n\t\t) {\n\t\t\tthis.element.innerHTML = this.getSlideNotes() || '<span class=\"notes-placeholder\">No notes on this slide.</span>';\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the visibility of the speaker notes sidebar that\n\t * is used to share annotated slides. The notes sidebar is\n\t * only visible if showNotes is true and there are notes on\n\t * one or more slides in the deck.\n\t */\n\tupdateVisibility() {\n\n\t\tif( this.Reveal.getConfig().showNotes &&\n\t\t\tthis.hasNotes() &&\n\t\t\t!this.Reveal.isScrollView() &&\n\t\t\t!this.Reveal.isPrintView()\n\t\t) {\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'show-notes' );\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'show-notes' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if there are speaker notes for ANY slide in the\n\t * presentation.\n\t */\n\thasNotes() {\n\n\t\treturn this.Reveal.getSlidesElement().querySelectorAll( '[data-notes], aside.notes' ).length > 0;\n\n\t}\n\n\t/**\n\t * Checks if this presentation is running inside of the\n\t * speaker notes window.\n\t *\n\t * @return {boolean}\n\t */\n\tisSpeakerNotesWindow() {\n\n\t\treturn !!window.location.search.match( /receiver/gi );\n\n\t}\n\n\t/**\n\t * Retrieves the speaker notes from a slide. Notes can be\n\t * defined in two ways:\n\t * 1. As a data-notes attribute on the slide <section>\n\t * 2. With <aside class=\"notes\"> elements inside the slide\n\t *\n\t * @param {HTMLElement} [slide=currentSlide]\n\t * @return {(string|null)}\n\t */\n\tgetSlideNotes( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\t// Notes can be specified via the data-notes attribute...\n\t\tif( slide.hasAttribute( 'data-notes' ) ) {\n\t\t\treturn slide.getAttribute( 'data-notes' );\n\t\t}\n\n\t\t// ... or using <aside class=\"notes\"> elements\n\t\tlet notesElements = slide.querySelectorAll( 'aside.notes' );\n\t\tif( notesElements ) {\n\t\t\treturn Array.from(notesElements).map( notesElement => notesElement.innerHTML ).join( '\\n' );\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","import { SLIDES_SELECTOR } from '../utils/constants.js'\nimport { extend, queryAll, transformElement } from '../utils/util.js'\n\n/**\n * Handles all logic related to the overview mode\n * (birds-eye view of all slides).\n */\nexport default class Overview {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.active = false;\n\n\t\tthis.onSlideClicked = this.onSlideClicked.bind( this );\n\n\t}\n\n\t/**\n\t * Displays the overview of slides (quick nav) by scaling\n\t * down and arranging all slide elements.\n\t */\n\tactivate() {\n\n\t\t// Only proceed if enabled in config\n\t\tif( this.Reveal.getConfig().overview && !this.Reveal.isScrollView() && !this.isActive() ) {\n\n\t\t\tthis.active = true;\n\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'overview' );\n\n\t\t\t// Don't auto-slide while in overview mode\n\t\t\tthis.Reveal.cancelAutoSlide();\n\n\t\t\t// Move the backgrounds element into the slide container to\n\t\t\t// that the same scaling is applied\n\t\t\tthis.Reveal.getSlidesElement().appendChild( this.Reveal.getBackgroundsElement() );\n\n\t\t\t// Clicking on an overview slide navigates to it\n\t\t\tqueryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {\n\t\t\t\tif( !slide.classList.contains( 'stack' ) ) {\n\t\t\t\t\tslide.addEventListener( 'click', this.onSlideClicked, true );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Calculate slide sizes\n\t\t\tconst margin = 70;\n\t\t\tconst slideSize = this.Reveal.getComputedSlideSize();\n\t\t\tthis.overviewSlideWidth = slideSize.width + margin;\n\t\t\tthis.overviewSlideHeight = slideSize.height + margin;\n\n\t\t\t// Reverse in RTL mode\n\t\t\tif( this.Reveal.getConfig().rtl ) {\n\t\t\t\tthis.overviewSlideWidth = -this.overviewSlideWidth;\n\t\t\t}\n\n\t\t\tthis.Reveal.updateSlidesVisibility();\n\n\t\t\tthis.layout();\n\t\t\tthis.update();\n\n\t\t\tthis.Reveal.layout();\n\n\t\t\tconst indices = this.Reveal.getIndices();\n\n\t\t\t// Notify observers of the overview showing\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'overviewshown',\n\t\t\t\tdata: {\n\t\t\t\t\t'indexh': indices.h,\n\t\t\t\t\t'indexv': indices.v,\n\t\t\t\t\t'currentSlide': this.Reveal.getCurrentSlide()\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses CSS transforms to position all slides in a grid for\n\t * display inside of the overview mode.\n\t */\n\tlayout() {\n\n\t\t// Layout slides\n\t\tthis.Reveal.getHorizontalSlides().forEach( ( hslide, h ) => {\n\t\t\thslide.setAttribute( 'data-index-h', h );\n\t\t\ttransformElement( hslide, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );\n\n\t\t\tif( hslide.classList.contains( 'stack' ) ) {\n\n\t\t\t\tqueryAll( hslide, 'section' ).forEach( ( vslide, v ) => {\n\t\t\t\t\tvslide.setAttribute( 'data-index-h', h );\n\t\t\t\t\tvslide.setAttribute( 'data-index-v', v );\n\n\t\t\t\t\ttransformElement( vslide, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );\n\t\t\t\t} );\n\n\t\t\t}\n\t\t} );\n\n\t\t// Layout slide backgrounds\n\t\tArray.from( this.Reveal.getBackgroundsElement().childNodes ).forEach( ( hbackground, h ) => {\n\t\t\ttransformElement( hbackground, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );\n\n\t\t\tqueryAll( hbackground, '.slide-background' ).forEach( ( vbackground, v ) => {\n\t\t\t\ttransformElement( vbackground, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );\n\t\t\t} );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Moves the overview viewport to the current slides.\n\t * Called each time the current slide changes.\n\t */\n\tupdate() {\n\n\t\tconst vmin = Math.min( window.innerWidth, window.innerHeight );\n\t\tconst scale = Math.max( vmin / 5, 150 ) / vmin;\n\t\tconst indices = this.Reveal.getIndices();\n\n\t\tthis.Reveal.transformSlides( {\n\t\t\toverview: [\n\t\t\t\t'scale('+ scale +')',\n\t\t\t\t'translateX('+ ( -indices.h * this.overviewSlideWidth ) +'px)',\n\t\t\t\t'translateY('+ ( -indices.v * this.overviewSlideHeight ) +'px)'\n\t\t\t].join( ' ' )\n\t\t} );\n\n\t}\n\n\t/**\n\t * Exits the slide overview and enters the currently\n\t * active slide.\n\t */\n\tdeactivate() {\n\n\t\t// Only proceed if enabled in config\n\t\tif( this.Reveal.getConfig().overview ) {\n\n\t\t\tthis.active = false;\n\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'overview' );\n\n\t\t\t// Temporarily add a class so that transitions can do different things\n\t\t\t// depending on whether they are exiting/entering overview, or just\n\t\t\t// moving from slide to slide\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'overview-deactivating' );\n\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.Reveal.getRevealElement().classList.remove( 'overview-deactivating' );\n\t\t\t}, 1 );\n\n\t\t\t// Move the background element back out\n\t\t\tthis.Reveal.getRevealElement().appendChild( this.Reveal.getBackgroundsElement() );\n\n\t\t\t// Clean up changes made to slides\n\t\t\tqueryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {\n\t\t\t\ttransformElement( slide, '' );\n\n\t\t\t\tslide.removeEventListener( 'click', this.onSlideClicked, true );\n\t\t\t} );\n\n\t\t\t// Clean up changes made to backgrounds\n\t\t\tqueryAll( this.Reveal.getBackgroundsElement(), '.slide-background' ).forEach( background => {\n\t\t\t\ttransformElement( background, '' );\n\t\t\t} );\n\n\t\t\tthis.Reveal.transformSlides( { overview: '' } );\n\n\t\t\tconst indices = this.Reveal.getIndices();\n\n\t\t\tthis.Reveal.slide( indices.h, indices.v );\n\t\t\tthis.Reveal.layout();\n\t\t\tthis.Reveal.cueAutoSlide();\n\n\t\t\t// Notify observers of the overview hiding\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'overviewhidden',\n\t\t\t\tdata: {\n\t\t\t\t\t'indexh': indices.h,\n\t\t\t\t\t'indexv': indices.v,\n\t\t\t\t\t'currentSlide': this.Reveal.getCurrentSlide()\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\t}\n\n\t/**\n\t * Toggles the slide overview mode on and off.\n\t *\n\t * @param {Boolean} [override] Flag which overrides the\n\t * toggle logic and forcibly sets the desired state. True means\n\t * overview is open, false means it's closed.\n\t */\n\ttoggle( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? this.activate() : this.deactivate();\n\t\t}\n\t\telse {\n\t\t\tthis.isActive() ? this.deactivate() : this.activate();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the overview is currently active.\n\t *\n\t * @return {Boolean} true if the overview is active,\n\t * false otherwise\n\t */\n\tisActive() {\n\n\t\treturn this.active;\n\n\t}\n\n\t/**\n\t * Invoked when a slide is and we're in the overview.\n\t *\n\t * @param {object} event\n\t */\n\tonSlideClicked( event ) {\n\n\t\tif( this.isActive() ) {\n\t\t\tevent.preventDefault();\n\n\t\t\tlet element = event.target;\n\n\t\t\twhile( element && !element.nodeName.match( /section/gi ) ) {\n\t\t\t\telement = element.parentNode;\n\t\t\t}\n\n\t\t\tif( element && !element.classList.contains( 'disabled' ) ) {\n\n\t\t\t\tthis.deactivate();\n\n\t\t\t\tif( element.nodeName.match( /section/gi ) ) {\n\t\t\t\t\tlet h = parseInt( element.getAttribute( 'data-index-h' ), 10 ),\n\t\t\t\t\t\tv = parseInt( element.getAttribute( 'data-index-v' ), 10 );\n\n\t\t\t\t\tthis.Reveal.slide( h, v );\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}\n\n}","/**\n * Loads a JavaScript file from the given URL and executes it.\n *\n * @param {string} url Address of the .js file to load\n * @param {function} callback Method to invoke when the script\n * has loaded and executed\n */\nexport const loadScript = ( url, callback ) => {\n\n\tconst script = document.createElement( 'script' );\n\tscript.type = 'text/javascript';\n\tscript.async = false;\n\tscript.defer = false;\n\tscript.src = url;\n\n\tif( typeof callback === 'function' ) {\n\n\t\t// Success callback\n\t\tscript.onload = script.onreadystatechange = event => {\n\t\t\tif( event.type === 'load' || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t// Kill event listeners\n\t\t\t\tscript.onload = script.onreadystatechange = script.onerror = null;\n\n\t\t\t\tcallback();\n\n\t\t\t}\n\t\t};\n\n\t\t// Error callback\n\t\tscript.onerror = err => {\n\n\t\t\t// Kill event listeners\n\t\t\tscript.onload = script.onreadystatechange = script.onerror = null;\n\n\t\t\tcallback( new Error( 'Failed loading script: ' + script.src + '\\n' + err ) );\n\n\t\t};\n\n\t}\n\n\t// Append the script at the end of <head>\n\tconst head = document.querySelector( 'head' );\n\thead.insertBefore( script, head.lastChild );\n\n}","import { loadScript } from '../utils/loader.js'\n\n/**\n * Manages loading and registering of reveal.js plugins.\n */\nexport default class Plugins {\n\n\tconstructor( reveal ) {\n\n\t\tthis.Reveal = reveal;\n\n\t\t// Flags our current state (idle -> loading -> loaded)\n\t\tthis.state = 'idle';\n\n\t\t// An id:instance map of currently registered plugins\n\t\tthis.registeredPlugins = {};\n\n\t\tthis.asyncDependencies = [];\n\n\t}\n\n\t/**\n\t * Loads reveal.js dependencies, registers and\n\t * initializes plugins.\n\t *\n\t * Plugins are direct references to a reveal.js plugin\n\t * object that we register and initialize after any\n\t * synchronous dependencies have loaded.\n\t *\n\t * Dependencies are defined via the 'dependencies' config\n\t * option and will be loaded prior to starting reveal.js.\n\t * Some dependencies may have an 'async' flag, if so they\n\t * will load after reveal.js has been started up.\n\t */\n\tload( plugins, dependencies ) {\n\n\t\tthis.state = 'loading';\n\n\t\tplugins.forEach( this.registerPlugin.bind( this ) );\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tlet scripts = [],\n\t\t\t\tscriptsToLoad = 0;\n\n\t\t\tdependencies.forEach( s => {\n\t\t\t\t// Load if there's no condition or the condition is truthy\n\t\t\t\tif( !s.condition || s.condition() ) {\n\t\t\t\t\tif( s.async ) {\n\t\t\t\t\t\tthis.asyncDependencies.push( s );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tscripts.push( s );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif( scripts.length ) {\n\t\t\t\tscriptsToLoad = scripts.length;\n\n\t\t\t\tconst scriptLoadedCallback = (s) => {\n\t\t\t\t\tif( s && typeof s.callback === 'function' ) s.callback();\n\n\t\t\t\t\tif( --scriptsToLoad === 0 ) {\n\t\t\t\t\t\tthis.initPlugins().then( resolve );\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Load synchronous scripts\n\t\t\t\tscripts.forEach( s => {\n\t\t\t\t\tif( typeof s.id === 'string' ) {\n\t\t\t\t\t\tthis.registerPlugin( s );\n\t\t\t\t\t\tscriptLoadedCallback( s );\n\t\t\t\t\t}\n\t\t\t\t\telse if( typeof s.src === 'string' ) {\n\t\t\t\t\t\tloadScript( s.src, () => scriptLoadedCallback(s) );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.warn( 'Unrecognized plugin format', s );\n\t\t\t\t\t\tscriptLoadedCallback();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.initPlugins().then( resolve );\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Initializes our plugins and waits for them to be ready\n\t * before proceeding.\n\t */\n\tinitPlugins() {\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tlet pluginValues = Object.values( this.registeredPlugins );\n\t\t\tlet pluginsToInitialize = pluginValues.length;\n\n\t\t\t// If there are no plugins, skip this step\n\t\t\tif( pluginsToInitialize === 0 ) {\n\t\t\t\tthis.loadAsync().then( resolve );\n\t\t\t}\n\t\t\t// ... otherwise initialize plugins\n\t\t\telse {\n\n\t\t\t\tlet initNextPlugin;\n\n\t\t\t\tlet afterPlugInitialized = () => {\n\t\t\t\t\tif( --pluginsToInitialize === 0 ) {\n\t\t\t\t\t\tthis.loadAsync().then( resolve );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tinitNextPlugin();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tlet i = 0;\n\n\t\t\t\t// Initialize plugins serially\n\t\t\t\tinitNextPlugin = () => {\n\n\t\t\t\t\tlet plugin = pluginValues[i++];\n\n\t\t\t\t\t// If the plugin has an 'init' method, invoke it\n\t\t\t\t\tif( typeof plugin.init === 'function' ) {\n\t\t\t\t\t\tlet promise = plugin.init( this.Reveal );\n\n\t\t\t\t\t\t// If the plugin returned a Promise, wait for it\n\t\t\t\t\t\tif( promise && typeof promise.then === 'function' ) {\n\t\t\t\t\t\t\tpromise.then( afterPlugInitialized );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tafterPlugInitialized();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tafterPlugInitialized();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tinitNextPlugin();\n\n\t\t\t}\n\n\t\t} )\n\n\t}\n\n\t/**\n\t * Loads all async reveal.js dependencies.\n\t */\n\tloadAsync() {\n\n\t\tthis.state = 'loaded';\n\n\t\tif( this.asyncDependencies.length ) {\n\t\t\tthis.asyncDependencies.forEach( s => {\n\t\t\t\tloadScript( s.src, s.callback );\n\t\t\t} );\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n\t/**\n\t * Registers a new plugin with this reveal.js instance.\n\t *\n\t * reveal.js waits for all registered plugins to initialize\n\t * before considering itself ready, as long as the plugin\n\t * is registered before calling `Reveal.initialize()`.\n\t */\n\tregisterPlugin( plugin ) {\n\n\t\t// Backwards compatibility to make reveal.js ~3.9.0\n\t\t// plugins work with reveal.js 4.0.0\n\t\tif( arguments.length === 2 && typeof arguments[0] === 'string' ) {\n\t\t\tplugin = arguments[1];\n\t\t\tplugin.id = arguments[0];\n\t\t}\n\t\t// Plugin can optionally be a function which we call\n\t\t// to create an instance of the plugin\n\t\telse if( typeof plugin === 'function' ) {\n\t\t\tplugin = plugin();\n\t\t}\n\n\t\tlet id = plugin.id;\n\n\t\tif( typeof id !== 'string' ) {\n\t\t\tconsole.warn( 'Unrecognized plugin format; can\\'t find plugin.id', plugin );\n\t\t}\n\t\telse if( this.registeredPlugins[id] === undefined ) {\n\t\t\tthis.registeredPlugins[id] = plugin;\n\n\t\t\t// If a plugin is registered after reveal.js is loaded,\n\t\t\t// initialize it right away\n\t\t\tif( this.state === 'loaded' && typeof plugin.init === 'function' ) {\n\t\t\t\tplugin.init( this.Reveal );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.warn( 'reveal.js: \"'+ id +'\" plugin has already been registered' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if a specific plugin has been registered.\n\t *\n\t * @param {String} id Unique plugin identifier\n\t */\n\thasPlugin( id ) {\n\n\t\treturn !!this.registeredPlugins[id];\n\n\t}\n\n\t/**\n\t * Returns the specific plugin instance, if a plugin\n\t * with the given ID has been registered.\n\t *\n\t * @param {String} id Unique plugin identifier\n\t */\n\tgetPlugin( id ) {\n\n\t\treturn this.registeredPlugins[id];\n\n\t}\n\n\tgetRegisteredPlugins() {\n\n\t\treturn this.registeredPlugins;\n\n\t}\n\n\tdestroy() {\n\n\t\tObject.values( this.registeredPlugins ).forEach( plugin => {\n\t\t\tif( typeof plugin.destroy === 'function' ) {\n\t\t\t\tplugin.destroy();\n\t\t\t}\n\t\t} );\n\n\t\tthis.registeredPlugins = {};\n\t\tthis.asyncDependencies = [];\n\n\t}\n\n}\n","/**\n * Handles hiding of the pointer/cursor when inactive.\n */\nexport default class Pointer {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Throttles mouse wheel navigation\n\t\tthis.lastMouseWheelStep = 0;\n\n\t\t// Is the mouse pointer currently hidden from view\n\t\tthis.cursorHidden = false;\n\n\t\t// Timeout used to determine when the cursor is inactive\n\t\tthis.cursorInactiveTimeout = 0;\n\n\t\tthis.onDocumentCursorActive = this.onDocumentCursorActive.bind( this );\n\t\tthis.onDocumentMouseScroll = this.onDocumentMouseScroll.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.mouseWheel ) {\n\t\t\tdocument.addEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\t}\n\t\telse {\n\t\t\tdocument.removeEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\t}\n\n\t\t// Auto-hide the mouse pointer when its inactive\n\t\tif( config.hideInactiveCursor ) {\n\t\t\tdocument.addEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\t\tdocument.addEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\t\t}\n\t\telse {\n\t\t\tthis.showCursor();\n\n\t\t\tdocument.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\t\tdocument.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Shows the mouse pointer after it has been hidden with\n\t * #hideCursor.\n\t */\n\tshowCursor() {\n\n\t\tif( this.cursorHidden ) {\n\t\t\tthis.cursorHidden = false;\n\t\t\tthis.Reveal.getRevealElement().style.cursor = '';\n\t\t}\n\n\t}\n\n\t/**\n\t * Hides the mouse pointer when it's on top of the .reveal\n\t * container.\n\t */\n\thideCursor() {\n\n\t\tif( this.cursorHidden === false ) {\n\t\t\tthis.cursorHidden = true;\n\t\t\tthis.Reveal.getRevealElement().style.cursor = 'none';\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.showCursor();\n\n\t\tdocument.removeEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\tdocument.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\tdocument.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\n\t}\n\n\t/**\n\t * Called whenever there is mouse input at the document level\n\t * to determine if the cursor is active or not.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentCursorActive( event ) {\n\n\t\tthis.showCursor();\n\n\t\tclearTimeout( this.cursorInactiveTimeout );\n\n\t\tthis.cursorInactiveTimeout = setTimeout( this.hideCursor.bind( this ), this.Reveal.getConfig().hideCursorTime );\n\n\t}\n\n\t/**\n\t * Handles mouse wheel scrolling, throttled to avoid skipping\n\t * multiple slides.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentMouseScroll( event ) {\n\n\t\tif( Date.now() - this.lastMouseWheelStep > 1000 ) {\n\n\t\t\tthis.lastMouseWheelStep = Date.now();\n\n\t\t\tlet delta = event.detail || -event.wheelDelta;\n\t\t\tif( delta > 0 ) {\n\t\t\t\tthis.Reveal.next();\n\t\t\t}\n\t\t\telse if( delta < 0 ) {\n\t\t\t\tthis.Reveal.prev();\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n","import { SLIDES_SELECTOR } from '../utils/constants.js'\nimport { queryAll, createStyleSheet } from '../utils/util.js'\n\n/**\n * Setups up our presentation for printing/exporting to PDF.\n */\nexport default class PrintView {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Configures the presentation for printing to a static\n\t * PDF.\n\t */\n\tasync activate() {\n\n\t\tconst config = this.Reveal.getConfig();\n\t\tconst slides = queryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR )\n\n\t\t// Compute slide numbers now, before we start duplicating slides\n\t\tconst injectPageNumbers = config.slideNumber && /all|print/i.test( config.showSlideNumber );\n\n\t\tconst slideSize = this.Reveal.getComputedSlideSize( window.innerWidth, window.innerHeight );\n\n\t\t// Dimensions of the PDF pages\n\t\tconst pageWidth = Math.floor( slideSize.width * ( 1 + config.margin ) ),\n\t\t\tpageHeight = Math.floor( slideSize.height * ( 1 + config.margin ) );\n\n\t\t// Dimensions of slides within the pages\n\t\tconst slideWidth = slideSize.width,\n\t\t\tslideHeight = slideSize.height;\n\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\t// Let the browser know what page size we want to print\n\t\tcreateStyleSheet( '@page{size:'+ pageWidth +'px '+ pageHeight +'px; margin: 0px;}' );\n\n\t\t// Limit the size of certain elements to the dimensions of the slide\n\t\tcreateStyleSheet( '.reveal section>img, .reveal section>video, .reveal section>iframe{max-width: '+ slideWidth +'px; max-height:'+ slideHeight +'px}' );\n\n\t\tdocument.documentElement.classList.add( 'reveal-print', 'print-pdf' );\n\t\tdocument.body.style.width = pageWidth + 'px';\n\t\tdocument.body.style.height = pageHeight + 'px';\n\n\t\tconst viewportElement = this.Reveal.getViewportElement();\n\t\tlet presentationBackground;\n\t\tif( viewportElement ) {\n\t\t\tconst viewportStyles = window.getComputedStyle( viewportElement );\n\t\t\tif( viewportStyles && viewportStyles.background ) {\n\t\t\t\tpresentationBackground = viewportStyles.background;\n\t\t\t}\n\t\t}\n\n\t\t// Make sure stretch elements fit on slide\n\t\tawait new Promise( requestAnimationFrame );\n\t\tthis.Reveal.layoutSlideContents( slideWidth, slideHeight );\n\n\t\t// Batch scrollHeight access to prevent layout thrashing\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\tconst slideScrollHeights = slides.map( slide => slide.scrollHeight );\n\n\t\tconst pages = [];\n\t\tconst pageContainer = slides[0].parentNode;\n\t\tlet slideNumber = 1;\n\n\t\t// Slide and slide background layout\n\t\tslides.forEach( function( slide, index ) {\n\n\t\t\t// Vertical stacks are not centred since their section\n\t\t\t// children will be\n\t\t\tif( slide.classList.contains( 'stack' ) === false ) {\n\t\t\t\t// Center the slide inside of the page, giving the slide some margin\n\t\t\t\tlet left = ( pageWidth - slideWidth ) / 2;\n\t\t\t\tlet top = ( pageHeight - slideHeight ) / 2;\n\n\t\t\t\tconst contentHeight = slideScrollHeights[ index ];\n\t\t\t\tlet numberOfPages = Math.max( Math.ceil( contentHeight / pageHeight ), 1 );\n\n\t\t\t\t// Adhere to configured pages per slide limit\n\t\t\t\tnumberOfPages = Math.min( numberOfPages, config.pdfMaxPagesPerSlide );\n\n\t\t\t\t// Center slides vertically\n\t\t\t\tif( numberOfPages === 1 && config.center || slide.classList.contains( 'center' ) ) {\n\t\t\t\t\ttop = Math.max( ( pageHeight - contentHeight ) / 2, 0 );\n\t\t\t\t}\n\n\t\t\t\t// Wrap the slide in a page element and hide its overflow\n\t\t\t\t// so that no page ever flows onto another\n\t\t\t\tconst page = document.createElement( 'div' );\n\t\t\t\tpages.push( page );\n\n\t\t\t\tpage.className = 'pdf-page';\n\t\t\t\tpage.style.height = ( ( pageHeight + config.pdfPageHeightOffset ) * numberOfPages ) + 'px';\n\n\t\t\t\t// Copy the presentation-wide background to each individual\n\t\t\t\t// page when printing\n\t\t\t\tif( presentationBackground ) {\n\t\t\t\t\tpage.style.background = presentationBackground;\n\t\t\t\t}\n\n\t\t\t\tpage.appendChild( slide );\n\n\t\t\t\t// Position the slide inside of the page\n\t\t\t\tslide.style.left = left + 'px';\n\t\t\t\tslide.style.top = top + 'px';\n\t\t\t\tslide.style.width = slideWidth + 'px';\n\n\t\t\t\tthis.Reveal.slideContent.layout( slide );\n\n\t\t\t\tif( slide.slideBackgroundElement ) {\n\t\t\t\t\tpage.insertBefore( slide.slideBackgroundElement, slide );\n\t\t\t\t}\n\n\t\t\t\t// Inject notes if `showNotes` is enabled\n\t\t\t\tif( config.showNotes ) {\n\n\t\t\t\t\t// Are there notes for this slide?\n\t\t\t\t\tconst notes = this.Reveal.getSlideNotes( slide );\n\t\t\t\t\tif( notes ) {\n\n\t\t\t\t\t\tconst notesSpacing = 8;\n\t\t\t\t\t\tconst notesLayout = typeof config.showNotes === 'string' ? config.showNotes : 'inline';\n\t\t\t\t\t\tconst notesElement = document.createElement( 'div' );\n\t\t\t\t\t\tnotesElement.classList.add( 'speaker-notes' );\n\t\t\t\t\t\tnotesElement.classList.add( 'speaker-notes-pdf' );\n\t\t\t\t\t\tnotesElement.setAttribute( 'data-layout', notesLayout );\n\t\t\t\t\t\tnotesElement.innerHTML = notes;\n\n\t\t\t\t\t\tif( notesLayout === 'separate-page' ) {\n\t\t\t\t\t\t\tpages.push( notesElement );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tnotesElement.style.left = notesSpacing + 'px';\n\t\t\t\t\t\t\tnotesElement.style.bottom = notesSpacing + 'px';\n\t\t\t\t\t\t\tnotesElement.style.width = ( pageWidth - notesSpacing*2 ) + 'px';\n\t\t\t\t\t\t\tpage.appendChild( notesElement );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Inject page numbers if `slideNumbers` are enabled\n\t\t\t\tif( injectPageNumbers ) {\n\t\t\t\t\tconst numberElement = document.createElement( 'div' );\n\t\t\t\t\tnumberElement.classList.add( 'slide-number' );\n\t\t\t\t\tnumberElement.classList.add( 'slide-number-pdf' );\n\t\t\t\t\tnumberElement.innerHTML = slideNumber++;\n\t\t\t\t\tpage.appendChild( numberElement );\n\t\t\t\t}\n\n\t\t\t\t// Copy page and show fragments one after another\n\t\t\t\tif( config.pdfSeparateFragments ) {\n\n\t\t\t\t\t// Each fragment 'group' is an array containing one or more\n\t\t\t\t\t// fragments. Multiple fragments that appear at the same time\n\t\t\t\t\t// are part of the same group.\n\t\t\t\t\tconst fragmentGroups = this.Reveal.fragments.sort( page.querySelectorAll( '.fragment' ), true );\n\n\t\t\t\t\tlet previousFragmentStep;\n\n\t\t\t\t\tfragmentGroups.forEach( function( fragments, index ) {\n\n\t\t\t\t\t\t// Remove 'current-fragment' from the previous group\n\t\t\t\t\t\tif( previousFragmentStep ) {\n\t\t\t\t\t\t\tpreviousFragmentStep.forEach( function( fragment ) {\n\t\t\t\t\t\t\t\tfragment.classList.remove( 'current-fragment' );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Show the fragments for the current index\n\t\t\t\t\t\tfragments.forEach( function( fragment ) {\n\t\t\t\t\t\t\tfragment.classList.add( 'visible', 'current-fragment' );\n\t\t\t\t\t\t}, this );\n\n\t\t\t\t\t\t// Create a separate page for the current fragment state\n\t\t\t\t\t\tconst clonedPage = page.cloneNode( true );\n\n\t\t\t\t\t\t// Inject unique page numbers for fragments\n\t\t\t\t\t\tif( injectPageNumbers ) {\n\t\t\t\t\t\t\tconst numberElement = clonedPage.querySelector( '.slide-number-pdf' );\n\t\t\t\t\t\t\tconst fragmentNumber = index + 1;\n\t\t\t\t\t\t\tnumberElement.innerHTML += '.' + fragmentNumber;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpages.push( clonedPage );\n\n\t\t\t\t\t\tpreviousFragmentStep = fragments;\n\n\t\t\t\t\t}, this );\n\n\t\t\t\t\t// Reset the first/original page so that all fragments are hidden\n\t\t\t\t\tfragmentGroups.forEach( function( fragments ) {\n\t\t\t\t\t\tfragments.forEach( function( fragment ) {\n\t\t\t\t\t\t\tfragment.classList.remove( 'visible', 'current-fragment' );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\t\t\t\t// Show all fragments\n\t\t\t\telse {\n\t\t\t\t\tqueryAll( page, '.fragment:not(.fade-out)' ).forEach( function( fragment ) {\n\t\t\t\t\t\tfragment.classList.add( 'visible' );\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}, this );\n\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\tpages.forEach( page => pageContainer.appendChild( page ) );\n\n\t\t// Re-run JS-based content layout after the slide is added to page DOM\n\t\tthis.Reveal.slideContent.layout( this.Reveal.getSlidesElement() );\n\n\t\t// Notify subscribers that the PDF layout is good to go\n\t\tthis.Reveal.dispatchEvent({ type: 'pdf-ready' });\n\n\t\tviewportElement.classList.remove( 'loading-scroll-mode' );\n\n\t}\n\n\t/**\n\t * Checks if the print mode is/should be activated.\n\t */\n\tisActive() {\n\n\t\treturn this.Reveal.getConfig().view === 'print';\n\n\t}\n\n}","/**\n * Creates a visual progress bar for the presentation.\n */\nexport default class Progress {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onProgressClicked = this.onProgressClicked.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'progress';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t\tthis.bar = document.createElement( 'span' );\n\t\tthis.element.appendChild( this.bar );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tthis.element.style.display = config.progress ? 'block' : 'none';\n\n\t}\n\n\tbind() {\n\n\t\tif( this.Reveal.getConfig().progress && this.element ) {\n\t\t\tthis.element.addEventListener( 'click', this.onProgressClicked, false );\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tif ( this.Reveal.getConfig().progress && this.element ) {\n\t\t\tthis.element.removeEventListener( 'click', this.onProgressClicked, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the progress bar to reflect the current slide.\n\t */\n\tupdate() {\n\n\t\t// Update progress if enabled\n\t\tif( this.Reveal.getConfig().progress && this.bar ) {\n\n\t\t\tlet scale = this.Reveal.getProgress();\n\n\t\t\t// Don't fill the progress bar if there's only one slide\n\t\t\tif( this.Reveal.getTotalSlides() < 2 ) {\n\t\t\t\tscale = 0;\n\t\t\t}\n\n\t\t\tthis.bar.style.transform = 'scaleX('+ scale +')';\n\n\t\t}\n\n\t}\n\n\tgetMaxWidth() {\n\n\t\treturn this.Reveal.getRevealElement().offsetWidth;\n\n\t}\n\n\t/**\n\t * Clicking on the progress bar results in a navigation to the\n\t * closest approximate horizontal slide using this equation:\n\t *\n\t * ( clickX / presentationWidth ) * numberOfSlides\n\t *\n\t * @param {object} event\n\t */\n\tonProgressClicked( event ) {\n\n\t\tthis.Reveal.onUserInput( event );\n\n\t\tevent.preventDefault();\n\n\t\tlet slides = this.Reveal.getSlides();\n\t\tlet slidesTotal = slides.length;\n\t\tlet slideIndex = Math.floor( ( event.clientX / this.getMaxWidth() ) * slidesTotal );\n\n\t\tif( this.Reveal.getConfig().rtl ) {\n\t\t\tslideIndex = slidesTotal - slideIndex;\n\t\t}\n\n\t\tlet targetIndices = this.Reveal.getIndices(slides[slideIndex]);\n\t\tthis.Reveal.slide( targetIndices.h, targetIndices.v );\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","import { HORIZONTAL_SLIDES_SELECTOR } from '../utils/constants.js'\nimport { queryAll } from '../utils/util.js'\n\nconst HIDE_SCROLLBAR_TIMEOUT = 500;\nconst MAX_PROGRESS_SPACING = 4;\nconst MIN_PROGRESS_SEGMENT_HEIGHT = 6;\nconst MIN_PLAYHEAD_HEIGHT = 8;\n\n/**\n * The scroll view lets you read a reveal.js presentation\n * as a linear scrollable page.\n */\nexport default class ScrollView {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.active = false;\n\t\tthis.activatedCallbacks = [];\n\n\t\tthis.onScroll = this.onScroll.bind( this );\n\n\t}\n\n\t/**\n\t * Activates the scroll view. This rearranges the presentation DOM\n\t * by—among other things—wrapping each slide in a page element.\n\t */\n\tactivate() {\n\n\t\tif( this.active ) return;\n\n\t\tconst stateBeforeActivation = this.Reveal.getState();\n\n\t\tthis.active = true;\n\n\t\t// Store the full presentation HTML so that we can restore it\n\t\t// when/if the scroll view is deactivated\n\t\tthis.slideHTMLBeforeActivation = this.Reveal.getSlidesElement().innerHTML;\n\n\t\tconst horizontalSlides = queryAll( this.Reveal.getRevealElement(), HORIZONTAL_SLIDES_SELECTOR );\n\n\t\tthis.viewportElement.classList.add( 'loading-scroll-mode', 'reveal-scroll' );\n\n\t\tlet presentationBackground;\n\n\t\tconst viewportStyles = window.getComputedStyle( this.viewportElement );\n\t\tif( viewportStyles && viewportStyles.background ) {\n\t\t\tpresentationBackground = viewportStyles.background;\n\t\t}\n\n\t\tconst pageElements = [];\n\t\tconst pageContainer = horizontalSlides[0].parentNode;\n\n\t\tlet previousSlide;\n\n\t\t// Creates a new page element and appends the given slide/bg\n\t\t// to it.\n\t\tconst createPageElement = ( slide, h, v ) => {\n\n\t\t\tlet contentContainer;\n\n\t\t\t// If this slide is part of an auto-animation sequence, we\n\t\t\t// group it under the same page element as the previous slide\n\t\t\tif( previousSlide && this.Reveal.shouldAutoAnimateBetween( previousSlide, slide ) ) {\n\t\t\t\tcontentContainer = document.createElement( 'div' );\n\t\t\t\tcontentContainer.className = 'scroll-page-content scroll-auto-animate-page';\n\t\t\t\tcontentContainer.style.display = 'none';\n\t\t\t\tpreviousSlide.closest( '.scroll-page-content' ).parentNode.appendChild( contentContainer );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Wrap the slide in a page element and hide its overflow\n\t\t\t\t// so that no page ever flows onto another\n\t\t\t\tconst page = document.createElement( 'div' );\n\t\t\t\tpage.className = 'scroll-page';\n\t\t\t\tpageElements.push( page );\n\n\t\t\t\t// Copy the presentation-wide background to each page\n\t\t\t\tif( presentationBackground ) {\n\t\t\t\t\tpage.style.background = presentationBackground;\n\t\t\t\t}\n\n\t\t\t\tconst stickyContainer = document.createElement( 'div' );\n\t\t\t\tstickyContainer.className = 'scroll-page-sticky';\n\t\t\t\tpage.appendChild( stickyContainer );\n\n\t\t\t\tcontentContainer = document.createElement( 'div' );\n\t\t\t\tcontentContainer.className = 'scroll-page-content';\n\t\t\t\tstickyContainer.appendChild( contentContainer );\n\t\t\t}\n\n\t\t\tcontentContainer.appendChild( slide );\n\n\t\t\tslide.classList.remove( 'past', 'future' );\n\t\t\tslide.setAttribute( 'data-index-h', h );\n\t\t\tslide.setAttribute( 'data-index-v', v );\n\n\t\t\tif( slide.slideBackgroundElement ) {\n\t\t\t\tslide.slideBackgroundElement.remove( 'past', 'future' );\n\t\t\t\tcontentContainer.insertBefore( slide.slideBackgroundElement, slide );\n\t\t\t}\n\n\t\t\tpreviousSlide = slide;\n\n\t\t}\n\n\t\t// Slide and slide background layout\n\t\thorizontalSlides.forEach( ( horizontalSlide, h ) => {\n\n\t\t\tif( this.Reveal.isVerticalStack( horizontalSlide ) ) {\n\t\t\t\thorizontalSlide.querySelectorAll( 'section' ).forEach( ( verticalSlide, v ) => {\n\t\t\t\t\tcreatePageElement( verticalSlide, h, v );\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcreatePageElement( horizontalSlide, h, 0 );\n\t\t\t}\n\n\t\t}, this );\n\n\t\tthis.createProgressBar();\n\n\t\t// Remove leftover stacks\n\t\tqueryAll( this.Reveal.getRevealElement(), '.stack' ).forEach( stack => stack.remove() );\n\n\t\t// Add our newly created pages to the DOM\n\t\tpageElements.forEach( page => pageContainer.appendChild( page ) );\n\n\t\t// Re-run JS-based content layout after the slide is added to page DOM\n\t\tthis.Reveal.slideContent.layout( this.Reveal.getSlidesElement() );\n\n\t\tthis.Reveal.layout();\n\t\tthis.Reveal.setState( stateBeforeActivation );\n\n\t\tthis.activatedCallbacks.forEach( callback => callback() );\n\t\tthis.activatedCallbacks = [];\n\n\t\tthis.restoreScrollPosition();\n\n\t\tthis.viewportElement.classList.remove( 'loading-scroll-mode' );\n\t\tthis.viewportElement.addEventListener( 'scroll', this.onScroll, { passive: true } );\n\n\t}\n\n\t/**\n\t * Deactivates the scroll view and restores the standard slide-based\n\t * presentation.\n\t */\n\tdeactivate() {\n\n\t\tif( !this.active ) return;\n\n\t\tconst stateBeforeDeactivation = this.Reveal.getState();\n\n\t\tthis.active = false;\n\n\t\tthis.viewportElement.removeEventListener( 'scroll', this.onScroll );\n\t\tthis.viewportElement.classList.remove( 'reveal-scroll' );\n\n\t\tthis.removeProgressBar();\n\n\t\tthis.Reveal.getSlidesElement().innerHTML = this.slideHTMLBeforeActivation;\n\t\tthis.Reveal.sync();\n\t\tthis.Reveal.setState( stateBeforeDeactivation );\n\n\t\tthis.slideHTMLBeforeActivation = null;\n\n\t}\n\n\ttoggle( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? this.activate() : this.deactivate();\n\t\t}\n\t\telse {\n\t\t\tthis.isActive() ? this.deactivate() : this.activate();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the scroll view is currently active.\n\t */\n\tisActive() {\n\n\t\treturn this.active;\n\n\t}\n\n\t/**\n\t * Renders the progress bar component.\n\t */\n\tcreateProgressBar() {\n\n\t\tthis.progressBar = document.createElement( 'div' );\n\t\tthis.progressBar.className = 'scrollbar';\n\n\t\tthis.progressBarInner = document.createElement( 'div' );\n\t\tthis.progressBarInner.className = 'scrollbar-inner';\n\t\tthis.progressBar.appendChild( this.progressBarInner );\n\n\t\tthis.progressBarPlayhead = document.createElement( 'div' );\n\t\tthis.progressBarPlayhead.className = 'scrollbar-playhead';\n\t\tthis.progressBarInner.appendChild( this.progressBarPlayhead );\n\n\t\tthis.viewportElement.insertBefore( this.progressBar, this.viewportElement.firstChild );\n\n\t\tconst handleDocumentMouseMove\t= ( event ) => {\n\n\t\t\tlet progress = ( event.clientY - this.progressBarInner.getBoundingClientRect().top ) / this.progressBarHeight;\n\t\t\tprogress = Math.max( Math.min( progress, 1 ), 0 );\n\n\t\t\tthis.viewportElement.scrollTop = progress * ( this.viewportElement.scrollHeight - this.viewportElement.offsetHeight );\n\n\t\t};\n\n\t\tconst handleDocumentMouseUp = ( event ) => {\n\n\t\t\tthis.draggingProgressBar = false;\n\t\t\tthis.showProgressBar();\n\n\t\t\tdocument.removeEventListener( 'mousemove', handleDocumentMouseMove );\n\t\t\tdocument.removeEventListener( 'mouseup', handleDocumentMouseUp );\n\n\t\t};\n\n\t\tconst handleMouseDown = ( event ) => {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.draggingProgressBar = true;\n\n\t\t\tdocument.addEventListener( 'mousemove', handleDocumentMouseMove );\n\t\t\tdocument.addEventListener( 'mouseup', handleDocumentMouseUp );\n\n\t\t\thandleDocumentMouseMove( event );\n\n\t\t};\n\n\t\tthis.progressBarInner.addEventListener( 'mousedown', handleMouseDown );\n\n\t}\n\n\tremoveProgressBar() {\n\n\t\tif( this.progressBar ) {\n\t\t\tthis.progressBar.remove();\n\t\t\tthis.progressBar = null;\n\t\t}\n\n\t}\n\n\tlayout() {\n\n\t\tif( this.isActive() ) {\n\t\t\tthis.syncPages();\n\t\t\tthis.syncScrollPosition();\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates our pages to match the latest configuration and\n\t * presentation size.\n\t */\n\tsyncPages() {\n\n\t\tconst config = this.Reveal.getConfig();\n\n\t\tconst slideSize = this.Reveal.getComputedSlideSize( window.innerWidth, window.innerHeight );\n\t\tconst scale = this.Reveal.getScale();\n\t\tconst useCompactLayout = config.scrollLayout === 'compact';\n\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst compactHeight = slideSize.height * scale;\n\t\tconst pageHeight = useCompactLayout ? compactHeight : viewportHeight;\n\n\t\t// The height that needs to be scrolled between scroll triggers\n\t\tconst scrollTriggerHeight = useCompactLayout ? compactHeight : viewportHeight;\n\n\t\tthis.viewportElement.style.setProperty( '--page-height', pageHeight + 'px' );\n\t\tthis.viewportElement.style.scrollSnapType = typeof config.scrollSnap === 'string' ? `y ${config.scrollSnap}` : '';\n\n\t\t// This will hold all scroll triggers used to show/hide slides\n\t\tthis.slideTriggers = [];\n\n\t\tconst pageElements = Array.from( this.Reveal.getRevealElement().querySelectorAll( '.scroll-page' ) );\n\n\t\tthis.pages = pageElements.map( pageElement => {\n\t\t\tconst page = this.createPage({\n\t\t\t\tpageElement,\n\t\t\t\tslideElement: pageElement.querySelector( 'section' ),\n\t\t\t\tstickyElement: pageElement.querySelector( '.scroll-page-sticky' ),\n\t\t\t\tcontentElement: pageElement.querySelector( '.scroll-page-content' ),\n\t\t\t\tbackgroundElement: pageElement.querySelector( '.slide-background' ),\n\t\t\t\tautoAnimateElements: pageElement.querySelectorAll( '.scroll-auto-animate-page' ),\n\t\t\t\tautoAnimatePages: []\n\t\t\t});\n\n\t\t\tpage.pageElement.style.setProperty( '--slide-height', config.center === true ? 'auto' : slideSize.height + 'px' );\n\n\t\t\tthis.slideTriggers.push({\n\t\t\t\tpage: page,\n\t\t\t\tactivate: () => this.activatePage( page ),\n\t\t\t\tdeactivate: () => this.deactivatePage( page )\n\t\t\t});\n\n\t\t\t// Create scroll triggers that show/hide fragments\n\t\t\tthis.createFragmentTriggersForPage( page );\n\n\t\t\t// Create scroll triggers for triggering auto-animate steps\n\t\t\tif( page.autoAnimateElements.length > 0 ) {\n\t\t\t\tthis.createAutoAnimateTriggersForPage( page );\n\t\t\t}\n\n\t\t\tlet totalScrollTriggerCount = Math.max( page.scrollTriggers.length - 1, 0 );\n\n\t\t\t// Each auto-animate step may include its own scroll triggers\n\t\t\t// for fragments, ensure we count those as well\n\t\t\ttotalScrollTriggerCount += page.autoAnimatePages.reduce( ( total, page ) => {\n\t\t\t\treturn total + Math.max( page.scrollTriggers.length - 1, 0 );\n\t\t\t}, page.autoAnimatePages.length );\n\n\t\t\t// Clean up from previous renders\n\t\t\tpage.pageElement.querySelectorAll( '.scroll-snap-point' ).forEach( el => el.remove() );\n\n\t\t\t// Create snap points for all scroll triggers\n\t\t\t// - Can't be absolute in FF\n\t\t\t// - Can't be 0-height in Safari\n\t\t\t// - Can't use snap-align on parent in Safari because then\n\t\t\t// inner triggers won't work\n\t\t\tfor( let i = 0; i < totalScrollTriggerCount + 1; i++ ) {\n\t\t\t\tconst triggerStick = document.createElement( 'div' );\n\t\t\t\ttriggerStick.className = 'scroll-snap-point';\n\t\t\t\ttriggerStick.style.height = scrollTriggerHeight + 'px';\n\t\t\t\ttriggerStick.style.scrollSnapAlign = useCompactLayout ? 'center' : 'start';\n\t\t\t\tpage.pageElement.appendChild( triggerStick );\n\n\t\t\t\tif( i === 0 ) {\n\t\t\t\t\ttriggerStick.style.marginTop = -scrollTriggerHeight + 'px';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// In the compact layout, only slides with scroll triggers cover the\n\t\t\t// full viewport height. This helps avoid empty gaps before or after\n\t\t\t// a sticky slide.\n\t\t\tif( useCompactLayout && page.scrollTriggers.length > 0 ) {\n\t\t\t\tpage.pageHeight = viewportHeight;\n\t\t\t\tpage.pageElement.style.setProperty( '--page-height', viewportHeight + 'px' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpage.pageHeight = pageHeight;\n\t\t\t\tpage.pageElement.style.removeProperty( '--page-height' );\n\t\t\t}\n\n\t\t\t// Add scroll padding based on how many scroll triggers we have\n\t\t\tpage.scrollPadding = scrollTriggerHeight * totalScrollTriggerCount;\n\n\t\t\t// The total height including scrollable space\n\t\t\tpage.totalHeight = page.pageHeight + page.scrollPadding;\n\n\t\t\t// This is used to pad the height of our page in CSS\n\t\t\tpage.pageElement.style.setProperty( '--page-scroll-padding', page.scrollPadding + 'px' );\n\n\t\t\t// If this is a sticky page, stick it to the vertical center\n\t\t\tif( totalScrollTriggerCount > 0 ) {\n\t\t\t\tpage.stickyElement.style.position = 'sticky';\n\t\t\t\tpage.stickyElement.style.top = Math.max( ( viewportHeight - page.pageHeight ) / 2, 0 ) + 'px';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpage.stickyElement.style.position = 'relative';\n\t\t\t\tpage.pageElement.style.scrollSnapAlign = page.pageHeight < viewportHeight ? 'center' : 'start';\n\t\t\t}\n\n\t\t\treturn page;\n\t\t} );\n\n\t\tthis.setTriggerRanges();\n\n\t\t/*\n\t\tconsole.log(this.slideTriggers.map( t => {\n\t\t\treturn {\n\t\t\t\trange: `${t.range[0].toFixed(2)}-${t.range[1].toFixed(2)}`,\n\t\t\t\ttriggers: t.page.scrollTriggers.map( t => {\n\t\t\t\t\treturn `${t.range[0].toFixed(2)}-${t.range[1].toFixed(2)}`\n\t\t\t\t}).join( ', ' ),\n\t\t\t}\n\t\t}))\n\t\t*/\n\n\t\tthis.viewportElement.setAttribute( 'data-scrollbar', config.scrollProgress );\n\n\t\tif( config.scrollProgress && this.totalScrollTriggerCount > 1 ) {\n\t\t\t// Create the progress bar if it doesn't already exist\n\t\t\tif( !this.progressBar ) this.createProgressBar();\n\n\t\t\tthis.syncProgressBar();\n\t\t}\n\t\telse {\n\t\t\tthis.removeProgressBar();\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and sets the scroll range for all of our scroll\n\t * triggers.\n\t */\n\tsetTriggerRanges() {\n\n\t\t// Calculate the total number of scroll triggers\n\t\tthis.totalScrollTriggerCount = this.slideTriggers.reduce( ( total, trigger ) => {\n\t\t\treturn total + Math.max( trigger.page.scrollTriggers.length, 1 );\n\t\t}, 0 );\n\n\t\tlet rangeStart = 0;\n\n\t\t// Calculate the scroll range of each scroll trigger on a scale\n\t\t// of 0-1\n\t\tthis.slideTriggers.forEach( ( trigger, i ) => {\n\t\t\ttrigger.range = [\n\t\t\t\trangeStart,\n\t\t\t\trangeStart + Math.max( trigger.page.scrollTriggers.length, 1 ) / this.totalScrollTriggerCount\n\t\t\t];\n\n\t\t\tconst scrollTriggerSegmentSize = ( trigger.range[1] - trigger.range[0] ) / trigger.page.scrollTriggers.length;\n\t\t\t// Set the range for each inner scroll trigger\n\t\t\ttrigger.page.scrollTriggers.forEach( ( scrollTrigger, i ) => {\n\t\t\t\tscrollTrigger.range = [\n\t\t\t\t\trangeStart + i * scrollTriggerSegmentSize,\n\t\t\t\t\trangeStart + ( i + 1 ) * scrollTriggerSegmentSize\n\t\t\t\t];\n\t\t\t} );\n\n\t\t\trangeStart = trigger.range[1];\n\t\t} );\n\n\t}\n\n\t/**\n\t * Creates one scroll trigger for each fragments in the given page.\n\t *\n\t * @param {*} page\n\t */\n\tcreateFragmentTriggersForPage( page, slideElement ) {\n\n\t\tslideElement = slideElement || page.slideElement;\n\n\t\t// Each fragment 'group' is an array containing one or more\n\t\t// fragments. Multiple fragments that appear at the same time\n\t\t// are part of the same group.\n\t\tconst fragmentGroups = this.Reveal.fragments.sort( slideElement.querySelectorAll( '.fragment' ), true );\n\n\t\t// Create scroll triggers that show/hide fragments\n\t\tif( fragmentGroups.length ) {\n\t\t\tpage.fragments = this.Reveal.fragments.sort( slideElement.querySelectorAll( '.fragment:not(.disabled)' ) );\n\t\t\tpage.scrollTriggers.push(\n\t\t\t\t// Trigger for the initial state with no fragments visible\n\t\t\t\t{\n\t\t\t\t\tactivate: () => {\n\t\t\t\t\t\tthis.Reveal.fragments.update( -1, page.fragments, slideElement );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// Triggers for each fragment group\n\t\t\tfragmentGroups.forEach( ( fragments, i ) => {\n\t\t\t\tpage.scrollTriggers.push({\n\t\t\t\t\tactivate: () => {\n\t\t\t\t\t\tthis.Reveal.fragments.update( i, page.fragments, slideElement );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} );\n\t\t}\n\n\n\t\treturn page.scrollTriggers.length;\n\n\t}\n\n\t/**\n\t * Creates scroll triggers for the auto-animate steps in the\n\t * given page.\n\t *\n\t * @param {*} page\n\t */\n\tcreateAutoAnimateTriggersForPage( page ) {\n\n\t\tif( page.autoAnimateElements.length > 0 ) {\n\n\t\t\t// Triggers for each subsequent auto-animate slide\n\t\t\tthis.slideTriggers.push( ...Array.from( page.autoAnimateElements ).map( ( autoAnimateElement, i ) => {\n\t\t\t\tlet autoAnimatePage = this.createPage({\n\t\t\t\t\tslideElement: autoAnimateElement.querySelector( 'section' ),\n\t\t\t\t\tcontentElement: autoAnimateElement,\n\t\t\t\t\tbackgroundElement: autoAnimateElement.querySelector( '.slide-background' )\n\t\t\t\t});\n\n\t\t\t\t// Create fragment scroll triggers for the auto-animate slide\n\t\t\t\tthis.createFragmentTriggersForPage( autoAnimatePage, autoAnimatePage.slideElement );\n\n\t\t\t\tpage.autoAnimatePages.push( autoAnimatePage );\n\n\t\t\t\t// Return our slide trigger\n\t\t\t\treturn {\n\t\t\t\t\tpage: autoAnimatePage,\n\t\t\t\t\tactivate: () => this.activatePage( autoAnimatePage ),\n\t\t\t\t\tdeactivate: () => this.deactivatePage( autoAnimatePage )\n\t\t\t\t};\n\t\t\t}));\n\t\t}\n\n\t}\n\n\t/**\n\t * Helper method for creating a page definition and adding\n\t * required fields. A \"page\" is a slide or auto-animate step.\n\t */\n\tcreatePage( page ) {\n\n\t\tpage.scrollTriggers = [];\n\t\tpage.indexh = parseInt( page.slideElement.getAttribute( 'data-index-h' ), 10 );\n\t\tpage.indexv = parseInt( page.slideElement.getAttribute( 'data-index-v' ), 10 );\n\n\t\treturn page;\n\n\t}\n\n\t/**\n\t * Rerenders progress bar segments so that they match the current\n\t * reveal.js config and size.\n\t */\n\tsyncProgressBar() {\n\n\t\tthis.progressBarInner.querySelectorAll( '.scrollbar-slide' ).forEach( slide => slide.remove() );\n\n\t\tconst scrollHeight = this.viewportElement.scrollHeight;\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst viewportHeightFactor = viewportHeight / scrollHeight;\n\n\t\tthis.progressBarHeight = this.progressBarInner.offsetHeight;\n\t\tthis.playheadHeight = Math.max( viewportHeightFactor * this.progressBarHeight, MIN_PLAYHEAD_HEIGHT );\n\t\tthis.progressBarScrollableHeight = this.progressBarHeight - this.playheadHeight;\n\n\t\tconst progressSegmentHeight = viewportHeight / scrollHeight * this.progressBarHeight;\n\t\tconst spacing = Math.min( progressSegmentHeight / 8, MAX_PROGRESS_SPACING );\n\n\t\tthis.progressBarPlayhead.style.height = this.playheadHeight - spacing + 'px';\n\n\t\t// Don't show individual segments if they're too small\n\t\tif( progressSegmentHeight > MIN_PROGRESS_SEGMENT_HEIGHT ) {\n\n\t\t\tthis.slideTriggers.forEach( slideTrigger => {\n\n\t\t\t\tconst { page } = slideTrigger;\n\n\t\t\t\t// Visual representation of a slide\n\t\t\t\tpage.progressBarSlide = document.createElement( 'div' );\n\t\t\t\tpage.progressBarSlide.className = 'scrollbar-slide';\n\t\t\t\tpage.progressBarSlide.style.top = slideTrigger.range[0] * this.progressBarHeight + 'px';\n\t\t\t\tpage.progressBarSlide.style.height = ( slideTrigger.range[1] - slideTrigger.range[0] ) * this.progressBarHeight - spacing + 'px';\n\t\t\t\tpage.progressBarSlide.classList.toggle( 'has-triggers', page.scrollTriggers.length > 0 );\n\t\t\t\tthis.progressBarInner.appendChild( page.progressBarSlide );\n\n\t\t\t\t// Visual representations of each scroll trigger\n\t\t\t\tpage.scrollTriggerElements = page.scrollTriggers.map( ( trigger, i ) => {\n\n\t\t\t\t\tconst triggerElement = document.createElement( 'div' );\n\t\t\t\t\ttriggerElement.className = 'scrollbar-trigger';\n\t\t\t\t\ttriggerElement.style.top = ( trigger.range[0] - slideTrigger.range[0] ) * this.progressBarHeight + 'px';\n\t\t\t\t\ttriggerElement.style.height = ( trigger.range[1] - trigger.range[0] ) * this.progressBarHeight - spacing + 'px';\n\t\t\t\t\tpage.progressBarSlide.appendChild( triggerElement );\n\n\t\t\t\t\tif( i === 0 ) triggerElement.style.display = 'none';\n\n\t\t\t\t\treturn triggerElement;\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\t\telse {\n\n\t\t\tthis.pages.forEach( page => page.progressBarSlide = null );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Reads the current scroll position and updates our active\n\t * trigger states accordingly.\n\t */\n\tsyncScrollPosition() {\n\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst viewportHeightFactor = viewportHeight / this.viewportElement.scrollHeight;\n\n\t\tconst scrollTop = this.viewportElement.scrollTop;\n\t\tconst scrollHeight = this.viewportElement.scrollHeight - viewportHeight\n\t\tconst scrollProgress = Math.max( Math.min( scrollTop / scrollHeight, 1 ), 0 );\n\t\tconst scrollProgressMid = Math.max( Math.min( ( scrollTop + viewportHeight / 2 ) / this.viewportElement.scrollHeight, 1 ), 0 );\n\n\t\tlet activePage;\n\n\t\tthis.slideTriggers.forEach( ( trigger ) => {\n\t\t\tconst { page } = trigger;\n\n\t\t\tconst shouldPreload = scrollProgress >= trigger.range[0] - viewportHeightFactor*2 &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscrollProgress <= trigger.range[1] + viewportHeightFactor*2;\n\n\t\t\t// Load slides that are within the preload range\n\t\t\tif( shouldPreload && !page.loaded ) {\n\t\t\t\tpage.loaded = true;\n\t\t\t\tthis.Reveal.slideContent.load( page.slideElement );\n\t\t\t}\n\t\t\telse if( page.loaded ) {\n\t\t\t\tpage.loaded = false;\n\t\t\t\tthis.Reveal.slideContent.unload( page.slideElement );\n\t\t\t}\n\n\t\t\t// If we're within this trigger range, activate it\n\t\t\tif( scrollProgress >= trigger.range[0] && scrollProgress <= trigger.range[1] ) {\n\t\t\t\tthis.activateTrigger( trigger );\n\t\t\t\tactivePage = trigger.page;\n\t\t\t}\n\t\t\t// .. otherwise deactivate\n\t\t\telse if( trigger.active ) {\n\t\t\t\tthis.deactivateTrigger( trigger );\n\t\t\t}\n\t\t} );\n\n\t\t// Each page can have its own scroll triggers, check if any of those\n\t\t// need to be activated/deactivated\n\t\tif( activePage ) {\n\t\t\tactivePage.scrollTriggers.forEach( ( trigger ) => {\n\t\t\t\tif( scrollProgressMid >= trigger.range[0] && scrollProgressMid <= trigger.range[1] ) {\n\t\t\t\t\tthis.activateTrigger( trigger );\n\t\t\t\t}\n\t\t\t\telse if( trigger.active ) {\n\t\t\t\t\tthis.deactivateTrigger( trigger );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Update our visual progress indication\n\t\tthis.setProgressBarValue( scrollTop / ( this.viewportElement.scrollHeight - viewportHeight ) );\n\n\t}\n\n\t/**\n\t * Moves the progress bar playhead to the specified position.\n\t *\n\t * @param {number} progress 0-1\n\t */\n\tsetProgressBarValue( progress ) {\n\n\t\tif( this.progressBar ) {\n\n\t\t\tthis.progressBarPlayhead.style.transform = `translateY(${progress * this.progressBarScrollableHeight}px)`;\n\n\t\t\tthis.getAllPages()\n\t\t\t\t.filter( page => page.progressBarSlide )\n\t\t\t\t.forEach( ( page ) => {\n\t\t\t\t\tpage.progressBarSlide.classList.toggle( 'active', page.active === true );\n\n\t\t\t\t\tpage.scrollTriggers.forEach( ( trigger, i ) => {\n\t\t\t\t\t\tpage.scrollTriggerElements[i].classList.toggle( 'active', page.active === true && trigger.active === true );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\n\t\t\tthis.showProgressBar();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Show the progress bar and, if configured, automatically hide\n\t * it after a delay.\n\t */\n\tshowProgressBar() {\n\n\t\tthis.progressBar.classList.add( 'visible' );\n\n\t\tclearTimeout( this.hideProgressBarTimeout );\n\n\t\tif( this.Reveal.getConfig().scrollProgress === 'auto' && !this.draggingProgressBar ) {\n\n\t\t\tthis.hideProgressBarTimeout = setTimeout( () => {\n\t\t\t\tif( this.progressBar ) {\n\t\t\t\t\tthis.progressBar.classList.remove( 'visible' );\n\t\t\t\t}\n\t\t\t}, HIDE_SCROLLBAR_TIMEOUT );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Scrolls the given slide element into view.\n\t *\n\t * @param {HTMLElement} slideElement\n\t */\n\tscrollToSlide( slideElement ) {\n\n\t\t// If the scroll view isn't active yet, queue this action\n\t\tif( !this.active ) {\n\t\t\tthis.activatedCallbacks.push( () => this.scrollToSlide( slideElement ) );\n\t\t}\n\t\telse {\n\t\t\t// Find the trigger for this slide\n\t\t\tconst trigger = this.getScrollTriggerBySlide( slideElement );\n\n\t\t\tif( trigger ) {\n\t\t\t\t// Use the trigger's range to calculate the scroll position\n\t\t\t\tthis.viewportElement.scrollTop = trigger.range[0] * ( this.viewportElement.scrollHeight - this.viewportElement.offsetHeight );\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Persists the current scroll position to session storage\n\t * so that it can be restored.\n\t */\n\tstoreScrollPosition() {\n\n\t\tclearTimeout( this.storeScrollPositionTimeout );\n\n\t\tthis.storeScrollPositionTimeout = setTimeout( () => {\n\t\t\tsessionStorage.setItem( 'reveal-scroll-top', this.viewportElement.scrollTop );\n\t\t\tsessionStorage.setItem( 'reveal-scroll-origin', location.origin + location.pathname );\n\n\t\t\tthis.storeScrollPositionTimeout = null;\n\t\t}, 50 );\n\n\t}\n\n\t/**\n\t * Restores the scroll position when a deck is reloader.\n\t */\n\trestoreScrollPosition() {\n\n\t\tconst scrollPosition = sessionStorage.getItem( 'reveal-scroll-top' );\n\t\tconst scrollOrigin = sessionStorage.getItem( 'reveal-scroll-origin' );\n\n\t\tif( scrollPosition && scrollOrigin === location.origin + location.pathname ) {\n\t\t\tthis.viewportElement.scrollTop = parseInt( scrollPosition, 10 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Activates the given page and starts its embedded content\n\t * if there is any.\n\t *\n\t * @param {object} page\n\t */\n\tactivatePage( page ) {\n\n\t\tif( !page.active ) {\n\n\t\t\tpage.active = true;\n\n\t\t\tconst { slideElement, backgroundElement, contentElement, indexh, indexv } = page;\n\n\t\t\tcontentElement.style.display = 'block';\n\n\t\t\tslideElement.classList.add( 'present' );\n\n\t\t\tif( backgroundElement ) {\n\t\t\t\tbackgroundElement.classList.add( 'present' );\n\t\t\t}\n\n\t\t\tthis.Reveal.setCurrentScrollPage( slideElement, indexh, indexv );\n\t\t\tthis.Reveal.backgrounds.bubbleSlideContrastClassToElement( slideElement, this.viewportElement );\n\n\t\t\t// If this page is part of an auto-animation there will be one\n\t\t\t// content element per auto-animated page. We need to show the\n\t\t\t// current page and hide all others.\n\t\t\tArray.from( contentElement.parentNode.querySelectorAll( '.scroll-page-content' ) ).forEach( sibling => {\n\t\t\t\tif( sibling !== contentElement ) {\n\t\t\t\t\tsibling.style.display = 'none';\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deactivates the page after it has been visible.\n\t *\n\t * @param {object} page\n\t */\n\tdeactivatePage( page ) {\n\n\t\tif( page.active ) {\n\n\t\t\tpage.active = false;\n\t\t\tif( page.slideElement ) page.slideElement.classList.remove( 'present' );\n\t\t\tif( page.backgroundElement ) page.backgroundElement.classList.remove( 'present' );\n\n\t\t}\n\n\t}\n\n\tactivateTrigger( trigger ) {\n\n\t\tif( !trigger.active ) {\n\t\t\ttrigger.active = true;\n\t\t\ttrigger.activate();\n\t\t}\n\n\t}\n\n\tdeactivateTrigger( trigger ) {\n\n\t\tif( trigger.active ) {\n\t\t\ttrigger.active = false;\n\n\t\t\tif( trigger.deactivate ) {\n\t\t\t\ttrigger.deactivate();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Retrieve a slide by its original h/v index (i.e. the indices the\n\t * slide had before being linearized).\n\t *\n\t * @param {number} h\n\t * @param {number} v\n\t * @returns {HTMLElement}\n\t */\n\tgetSlideByIndices( h, v ) {\n\n\t\tconst page = this.getAllPages().find( page => {\n\t\t\treturn page.indexh === h && page.indexv === v;\n\t\t} );\n\n\t\treturn page ? page.slideElement : null;\n\n\t}\n\n\t/**\n\t * Retrieve a list of all scroll triggers for the given slide\n\t * DOM element.\n\t *\n\t * @param {HTMLElement} slide\n\t * @returns {Array}\n\t */\n\tgetScrollTriggerBySlide( slide ) {\n\n\t\treturn this.slideTriggers.find( trigger => trigger.page.slideElement === slide );\n\n\t}\n\n\t/**\n\t * Get a list of all pages in the scroll view. This includes\n\t * both top-level slides and auto-animate steps.\n\t *\n\t * @returns {Array}\n\t */\n\tgetAllPages() {\n\n\t\treturn this.pages.flatMap( page => [page, ...(page.autoAnimatePages || [])] );\n\n\t}\n\n\tonScroll() {\n\n\t\tthis.syncScrollPosition();\n\t\tthis.storeScrollPosition();\n\n\t}\n\n\tget viewportElement() {\n\n\t\treturn this.Reveal.getViewportElement();\n\n\t}\n\n}\n","/**\n * fitty v2.3.7 - Snugly resizes text to fit its parent container\n * Copyright (c) 2023 Rik Schennink <[email protected]> (https://pqina.nl/)\n */\n\nvar e=function(e){if(e){var t=function(e){return[].slice.call(e)},n=0,i=1,r=2,o=3,a=[],l=null,u=\"requestAnimationFrame\"in e?function(){e.cancelAnimationFrame(l),l=e.requestAnimationFrame((function(){return s(a.filter((function(e){return e.dirty&&e.active})))}))}:function(){},c=function(e){return function(){a.forEach((function(t){return t.dirty=e})),u()}},s=function(e){e.filter((function(e){return!e.styleComputed})).forEach((function(e){e.styleComputed=m(e)})),e.filter(y).forEach(v);var t=e.filter(p);t.forEach(d),t.forEach((function(e){v(e),f(e)})),t.forEach(S)},f=function(e){return e.dirty=n},d=function(e){e.availableWidth=e.element.parentNode.clientWidth,e.currentWidth=e.element.scrollWidth,e.previousFontSize=e.currentFontSize,e.currentFontSize=Math.min(Math.max(e.minSize,e.availableWidth/e.currentWidth*e.previousFontSize),e.maxSize),e.whiteSpace=e.multiLine&&e.currentFontSize===e.minSize?\"normal\":\"nowrap\"},p=function(e){return e.dirty!==r||e.dirty===r&&e.element.parentNode.clientWidth!==e.availableWidth},m=function(t){var n=e.getComputedStyle(t.element,null);return t.currentFontSize=parseFloat(n.getPropertyValue(\"font-size\")),t.display=n.getPropertyValue(\"display\"),t.whiteSpace=n.getPropertyValue(\"white-space\"),!0},y=function(e){var t=!1;return!e.preStyleTestCompleted&&(/inline-/.test(e.display)||(t=!0,e.display=\"inline-block\"),\"nowrap\"!==e.whiteSpace&&(t=!0,e.whiteSpace=\"nowrap\"),e.preStyleTestCompleted=!0,t)},v=function(e){e.element.style.whiteSpace=e.whiteSpace,e.element.style.display=e.display,e.element.style.fontSize=e.currentFontSize+\"px\"},S=function(e){e.element.dispatchEvent(new CustomEvent(\"fit\",{detail:{oldValue:e.previousFontSize,newValue:e.currentFontSize,scaleFactor:e.currentFontSize/e.previousFontSize}}))},h=function(e,t){return function(){e.dirty=t,e.active&&u()}},w=function(e){return function(){a=a.filter((function(t){return t.element!==e.element})),e.observeMutations&&e.observer.disconnect(),e.element.style.whiteSpace=e.originalStyle.whiteSpace,e.element.style.display=e.originalStyle.display,e.element.style.fontSize=e.originalStyle.fontSize}},b=function(e){return function(){e.active||(e.active=!0,u())}},z=function(e){return function(){return e.active=!1}},F=function(e){e.observeMutations&&(e.observer=new MutationObserver(h(e,i)),e.observer.observe(e.element,e.observeMutations))},g={minSize:16,maxSize:512,multiLine:!0,observeMutations:\"MutationObserver\"in e&&{subtree:!0,childList:!0,characterData:!0}},W=null,E=function(){e.clearTimeout(W),W=e.setTimeout(c(r),x.observeWindowDelay)},M=[\"resize\",\"orientationchange\"];return Object.defineProperty(x,\"observeWindow\",{set:function(t){var n=\"\".concat(t?\"add\":\"remove\",\"EventListener\");M.forEach((function(t){e[n](t,E)}))}}),x.observeWindow=!0,x.observeWindowDelay=100,x.fitAll=c(o),x}function C(e,t){var n=Object.assign({},g,t),i=e.map((function(e){var t=Object.assign({},n,{element:e,active:!0});return function(e){e.originalStyle={whiteSpace:e.element.style.whiteSpace,display:e.element.style.display,fontSize:e.element.style.fontSize},F(e),e.newbie=!0,e.dirty=!0,a.push(e)}(t),{element:e,fit:h(t,o),unfreeze:b(t),freeze:z(t),unsubscribe:w(t)}}));return u(),i}function x(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return\"string\"==typeof e?C(t(document.querySelectorAll(e)),n):C([e],n)[0]}}(\"undefined\"==typeof window?null:window);export default e;\n","import { extend, queryAll, closest, getMimeTypeFromFile, encodeRFC3986URI } from '../utils/util.js'\nimport { isMobile } from '../utils/device.js'\n\nimport fitty from 'fitty';\n\n/**\n * Handles loading, unloading and playback of slide\n * content such as images, videos and iframes.\n */\nexport default class SlideContent {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.startEmbeddedIframe = this.startEmbeddedIframe.bind( this );\n\n\t}\n\n\t/**\n\t * Should the given element be preloaded?\n\t * Decides based on local element attributes and global config.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tshouldPreload( element ) {\n\n\t\tif( this.Reveal.isScrollView() ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Prefer an explicit global preload setting\n\t\tlet preload = this.Reveal.getConfig().preloadIframes;\n\n\t\t// If no global setting is available, fall back on the element's\n\t\t// own preload setting\n\t\tif( typeof preload !== 'boolean' ) {\n\t\t\tpreload = element.hasAttribute( 'data-preload' );\n\t\t}\n\n\t\treturn preload;\n\t}\n\n\t/**\n\t * Called when the given slide is within the configured view\n\t * distance. Shows the slide element and loads any content\n\t * that is set to load lazily (data-src).\n\t *\n\t * @param {HTMLElement} slide Slide to show\n\t */\n\tload( slide, options = {} ) {\n\n\t\t// Show the slide element\n\t\tslide.style.display = this.Reveal.getConfig().display;\n\n\t\t// Media elements with data-src attributes\n\t\tqueryAll( slide, 'img[data-src], video[data-src], audio[data-src], iframe[data-src]' ).forEach( element => {\n\t\t\tif( element.tagName !== 'IFRAME' || this.shouldPreload( element ) ) {\n\t\t\t\telement.setAttribute( 'src', element.getAttribute( 'data-src' ) );\n\t\t\t\telement.setAttribute( 'data-lazy-loaded', '' );\n\t\t\t\telement.removeAttribute( 'data-src' );\n\t\t\t}\n\t\t} );\n\n\t\t// Media elements with <source> children\n\t\tqueryAll( slide, 'video, audio' ).forEach( media => {\n\t\t\tlet sources = 0;\n\n\t\t\tqueryAll( media, 'source[data-src]' ).forEach( source => {\n\t\t\t\tsource.setAttribute( 'src', source.getAttribute( 'data-src' ) );\n\t\t\t\tsource.removeAttribute( 'data-src' );\n\t\t\t\tsource.setAttribute( 'data-lazy-loaded', '' );\n\t\t\t\tsources += 1;\n\t\t\t} );\n\n\t\t\t// Enable inline video playback in mobile Safari\n\t\t\tif( isMobile && media.tagName === 'VIDEO' ) {\n\t\t\t\tmedia.setAttribute( 'playsinline', '' );\n\t\t\t}\n\n\t\t\t// If we rewrote sources for this video/audio element, we need\n\t\t\t// to manually tell it to load from its new origin\n\t\t\tif( sources > 0 ) {\n\t\t\t\tmedia.load();\n\t\t\t}\n\t\t} );\n\n\n\t\t// Show the corresponding background element\n\t\tlet background = slide.slideBackgroundElement;\n\t\tif( background ) {\n\t\t\tbackground.style.display = 'block';\n\n\t\t\tlet backgroundContent = slide.slideBackgroundContentElement;\n\t\t\tlet backgroundIframe = slide.getAttribute( 'data-background-iframe' );\n\n\t\t\t// If the background contains media, load it\n\t\t\tif( background.hasAttribute( 'data-loaded' ) === false ) {\n\t\t\t\tbackground.setAttribute( 'data-loaded', 'true' );\n\n\t\t\t\tlet backgroundImage = slide.getAttribute( 'data-background-image' ),\n\t\t\t\t\tbackgroundVideo = slide.getAttribute( 'data-background-video' ),\n\t\t\t\t\tbackgroundVideoLoop = slide.hasAttribute( 'data-background-video-loop' ),\n\t\t\t\t\tbackgroundVideoMuted = slide.hasAttribute( 'data-background-video-muted' );\n\n\t\t\t\t// Images\n\t\t\t\tif( backgroundImage ) {\n\t\t\t\t\t// base64\n\t\t\t\t\tif( /^data:/.test( backgroundImage.trim() ) ) {\n\t\t\t\t\t\tbackgroundContent.style.backgroundImage = `url(${backgroundImage.trim()})`;\n\t\t\t\t\t}\n\t\t\t\t\t// URL(s)\n\t\t\t\t\telse {\n\t\t\t\t\t\tbackgroundContent.style.backgroundImage = backgroundImage.split( ',' ).map( background => {\n\t\t\t\t\t\t\t// Decode URL(s) that are already encoded first\n\t\t\t\t\t\t\tlet decoded = decodeURI(background.trim());\n\t\t\t\t\t\t\treturn `url(${encodeRFC3986URI(decoded)})`;\n\t\t\t\t\t\t}).join( ',' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Videos\n\t\t\t\telse if ( backgroundVideo && !this.Reveal.isSpeakerNotes() ) {\n\t\t\t\t\tlet video = document.createElement( 'video' );\n\n\t\t\t\t\tif( backgroundVideoLoop ) {\n\t\t\t\t\t\tvideo.setAttribute( 'loop', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\tif( backgroundVideoMuted ) {\n\t\t\t\t\t\tvideo.muted = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Enable inline playback in mobile Safari\n\t\t\t\t\t//\n\t\t\t\t\t// Mute is required for video to play when using\n\t\t\t\t\t// swipe gestures to navigate since they don't\n\t\t\t\t\t// count as direct user actions :'(\n\t\t\t\t\tif( isMobile ) {\n\t\t\t\t\t\tvideo.muted = true;\n\t\t\t\t\t\tvideo.setAttribute( 'playsinline', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support comma separated lists of video sources\n\t\t\t\t\tbackgroundVideo.split( ',' ).forEach( source => {\n\t\t\t\t\t\tlet type = getMimeTypeFromFile( source );\n\t\t\t\t\t\tif( type ) {\n\t\t\t\t\t\t\tvideo.innerHTML += `<source src=\"${source}\" type=\"${type}\">`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tvideo.innerHTML += `<source src=\"${source}\">`;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tbackgroundContent.appendChild( video );\n\t\t\t\t}\n\t\t\t\t// Iframes\n\t\t\t\telse if( backgroundIframe && options.excludeIframes !== true ) {\n\t\t\t\t\tlet iframe = document.createElement( 'iframe' );\n\t\t\t\t\tiframe.setAttribute( 'allowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'mozallowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'webkitallowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'allow', 'autoplay' );\n\n\t\t\t\t\tiframe.setAttribute( 'data-src', backgroundIframe );\n\n\t\t\t\t\tiframe.style.width = '100%';\n\t\t\t\t\tiframe.style.height = '100%';\n\t\t\t\t\tiframe.style.maxHeight = '100%';\n\t\t\t\t\tiframe.style.maxWidth = '100%';\n\n\t\t\t\t\tbackgroundContent.appendChild( iframe );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start loading preloadable iframes\n\t\t\tlet backgroundIframeElement = backgroundContent.querySelector( 'iframe[data-src]' );\n\t\t\tif( backgroundIframeElement ) {\n\n\t\t\t\t// Check if this iframe is eligible to be preloaded\n\t\t\t\tif( this.shouldPreload( background ) && !/autoplay=(1|true|yes)/gi.test( backgroundIframe ) ) {\n\t\t\t\t\tif( backgroundIframeElement.getAttribute( 'src' ) !== backgroundIframe ) {\n\t\t\t\t\t\tbackgroundIframeElement.setAttribute( 'src', backgroundIframe );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.layout( slide );\n\n\t}\n\n\t/**\n\t * Applies JS-dependent layout helpers for the scope.\n\t */\n\tlayout( scopeElement ) {\n\n\t\t// Autosize text with the r-fit-text class based on the\n\t\t// size of its container. This needs to happen after the\n\t\t// slide is visible in order to measure the text.\n\t\tArray.from( scopeElement.querySelectorAll( '.r-fit-text' ) ).forEach( element => {\n\t\t\tfitty( element, {\n\t\t\t\tminSize: 24,\n\t\t\t\tmaxSize: this.Reveal.getConfig().height * 0.8,\n\t\t\t\tobserveMutations: false,\n\t\t\t\tobserveWindow: false\n\t\t\t} );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Unloads and hides the given slide. This is called when the\n\t * slide is moved outside of the configured view distance.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tunload( slide ) {\n\n\t\t// Hide the slide element\n\t\tslide.style.display = 'none';\n\n\t\t// Hide the corresponding background element\n\t\tlet background = this.Reveal.getSlideBackground( slide );\n\t\tif( background ) {\n\t\t\tbackground.style.display = 'none';\n\n\t\t\t// Unload any background iframes\n\t\t\tqueryAll( background, 'iframe[src]' ).forEach( element => {\n\t\t\t\telement.removeAttribute( 'src' );\n\t\t\t} );\n\t\t}\n\n\t\t// Reset lazy-loaded media elements with src attributes\n\t\tqueryAll( slide, 'video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]' ).forEach( element => {\n\t\t\telement.setAttribute( 'data-src', element.getAttribute( 'src' ) );\n\t\t\telement.removeAttribute( 'src' );\n\t\t} );\n\n\t\t// Reset lazy-loaded media elements with <source> children\n\t\tqueryAll( slide, 'video[data-lazy-loaded] source[src], audio source[src]' ).forEach( source => {\n\t\t\tsource.setAttribute( 'data-src', source.getAttribute( 'src' ) );\n\t\t\tsource.removeAttribute( 'src' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Enforces origin-specific format rules for embedded media.\n\t */\n\tformatEmbeddedContent() {\n\n\t\tlet _appendParamToIframeSource = ( sourceAttribute, sourceURL, param ) => {\n\t\t\tqueryAll( this.Reveal.getSlidesElement(), 'iframe['+ sourceAttribute +'*=\"'+ sourceURL +'\"]' ).forEach( el => {\n\t\t\t\tlet src = el.getAttribute( sourceAttribute );\n\t\t\t\tif( src && src.indexOf( param ) === -1 ) {\n\t\t\t\t\tel.setAttribute( sourceAttribute, src + ( !/\\?/.test( src ) ? '?' : '&' ) + param );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\t// YouTube frames must include \"?enablejsapi=1\"\n\t\t_appendParamToIframeSource( 'src', 'youtube.com/embed/', 'enablejsapi=1' );\n\t\t_appendParamToIframeSource( 'data-src', 'youtube.com/embed/', 'enablejsapi=1' );\n\n\t\t// Vimeo frames must include \"?api=1\"\n\t\t_appendParamToIframeSource( 'src', 'player.vimeo.com/', 'api=1' );\n\t\t_appendParamToIframeSource( 'data-src', 'player.vimeo.com/', 'api=1' );\n\n\t}\n\n\t/**\n\t * Start playback of any embedded content inside of\n\t * the given element.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tstartEmbeddedContent( element ) {\n\n\t\tif( element && !this.Reveal.isSpeakerNotes() ) {\n\n\t\t\t// Restart GIFs\n\t\t\tqueryAll( element, 'img[src$=\".gif\"]' ).forEach( el => {\n\t\t\t\t// Setting the same unchanged source like this was confirmed\n\t\t\t\t// to work in Chrome, FF & Safari\n\t\t\t\tel.setAttribute( 'src', el.getAttribute( 'src' ) );\n\t\t\t} );\n\n\t\t\t// HTML5 media elements\n\t\t\tqueryAll( element, 'video, audio' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Prefer an explicit global autoplay setting\n\t\t\t\tlet autoplay = this.Reveal.getConfig().autoPlayMedia;\n\n\t\t\t\t// If no global setting is available, fall back on the element's\n\t\t\t\t// own autoplay setting\n\t\t\t\tif( typeof autoplay !== 'boolean' ) {\n\t\t\t\t\tautoplay = el.hasAttribute( 'data-autoplay' ) || !!closest( el, '.slide-background' );\n\t\t\t\t}\n\n\t\t\t\tif( autoplay && typeof el.play === 'function' ) {\n\n\t\t\t\t\t// If the media is ready, start playback\n\t\t\t\t\tif( el.readyState > 1 ) {\n\t\t\t\t\t\tthis.startEmbeddedMedia( { target: el } );\n\t\t\t\t\t}\n\t\t\t\t\t// Mobile devices never fire a loaded event so instead\n\t\t\t\t\t// of waiting, we initiate playback\n\t\t\t\t\telse if( isMobile ) {\n\t\t\t\t\t\tlet promise = el.play();\n\n\t\t\t\t\t\t// If autoplay does not work, ensure that the controls are visible so\n\t\t\t\t\t\t// that the viewer can start the media on their own\n\t\t\t\t\t\tif( promise && typeof promise.catch === 'function' && el.controls === false ) {\n\t\t\t\t\t\t\tpromise.catch( () => {\n\t\t\t\t\t\t\t\tel.controls = true;\n\n\t\t\t\t\t\t\t\t// Once the video does start playing, hide the controls again\n\t\t\t\t\t\t\t\tel.addEventListener( 'play', () => {\n\t\t\t\t\t\t\t\t\tel.controls = false;\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// If the media isn't loaded, wait before playing\n\t\t\t\t\telse {\n\t\t\t\t\t\tel.removeEventListener( 'loadeddata', this.startEmbeddedMedia ); // remove first to avoid dupes\n\t\t\t\t\t\tel.addEventListener( 'loadeddata', this.startEmbeddedMedia );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Normal iframes\n\t\t\tqueryAll( element, 'iframe[src]' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.startEmbeddedIframe( { target: el } );\n\t\t\t} );\n\n\t\t\t// Lazy loading iframes\n\t\t\tqueryAll( element, 'iframe[data-src]' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif( el.getAttribute( 'src' ) !== el.getAttribute( 'data-src' ) ) {\n\t\t\t\t\tel.removeEventListener( 'load', this.startEmbeddedIframe ); // remove first to avoid dupes\n\t\t\t\t\tel.addEventListener( 'load', this.startEmbeddedIframe );\n\t\t\t\t\tel.setAttribute( 'src', el.getAttribute( 'data-src' ) );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Starts playing an embedded video/audio element after\n\t * it has finished loading.\n\t *\n\t * @param {object} event\n\t */\n\tstartEmbeddedMedia( event ) {\n\n\t\tlet isAttachedToDOM = !!closest( event.target, 'html' ),\n\t\t\tisVisible \t\t= !!closest( event.target, '.present' );\n\n\t\tif( isAttachedToDOM && isVisible ) {\n\t\t\tevent.target.currentTime = 0;\n\t\t\tevent.target.play();\n\t\t}\n\n\t\tevent.target.removeEventListener( 'loadeddata', this.startEmbeddedMedia );\n\n\t}\n\n\t/**\n\t * \"Starts\" the content of an embedded iframe using the\n\t * postMessage API.\n\t *\n\t * @param {object} event\n\t */\n\tstartEmbeddedIframe( event ) {\n\n\t\tlet iframe = event.target;\n\n\t\tif( iframe && iframe.contentWindow ) {\n\n\t\t\tlet isAttachedToDOM = !!closest( event.target, 'html' ),\n\t\t\t\tisVisible \t\t= !!closest( event.target, '.present' );\n\n\t\t\tif( isAttachedToDOM && isVisible ) {\n\n\t\t\t\t// Prefer an explicit global autoplay setting\n\t\t\t\tlet autoplay = this.Reveal.getConfig().autoPlayMedia;\n\n\t\t\t\t// If no global setting is available, fall back on the element's\n\t\t\t\t// own autoplay setting\n\t\t\t\tif( typeof autoplay !== 'boolean' ) {\n\t\t\t\t\tautoplay = iframe.hasAttribute( 'data-autoplay' ) || !!closest( iframe, '.slide-background' );\n\t\t\t\t}\n\n\t\t\t\t// YouTube postMessage API\n\t\t\t\tif( /youtube\\.com\\/embed\\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {\n\t\t\t\t\tiframe.contentWindow.postMessage( '{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*' );\n\t\t\t\t}\n\t\t\t\t// Vimeo postMessage API\n\t\t\t\telse if( /player\\.vimeo\\.com\\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {\n\t\t\t\t\tiframe.contentWindow.postMessage( '{\"method\":\"play\"}', '*' );\n\t\t\t\t}\n\t\t\t\t// Generic postMessage API\n\t\t\t\telse {\n\t\t\t\t\tiframe.contentWindow.postMessage( 'slide:start', '*' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Stop playback of any embedded content inside of\n\t * the targeted slide.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tstopEmbeddedContent( element, options = {} ) {\n\n\t\toptions = extend( {\n\t\t\t// Defaults\n\t\t\tunloadIframes: true\n\t\t}, options );\n\n\t\tif( element && element.parentNode ) {\n\t\t\t// HTML5 media elements\n\t\t\tqueryAll( element, 'video, audio' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && typeof el.pause === 'function' ) {\n\t\t\t\t\tel.setAttribute('data-paused-by-reveal', '');\n\t\t\t\t\tel.pause();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Generic postMessage API for non-lazy loaded iframes\n\t\t\tqueryAll( element, 'iframe' ).forEach( el => {\n\t\t\t\tif( el.contentWindow ) el.contentWindow.postMessage( 'slide:stop', '*' );\n\t\t\t\tel.removeEventListener( 'load', this.startEmbeddedIframe );\n\t\t\t});\n\n\t\t\t// YouTube postMessage API\n\t\t\tqueryAll( element, 'iframe[src*=\"youtube.com/embed/\"]' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {\n\t\t\t\t\tel.contentWindow.postMessage( '{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Vimeo postMessage API\n\t\t\tqueryAll( element, 'iframe[src*=\"player.vimeo.com/\"]' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {\n\t\t\t\t\tel.contentWindow.postMessage( '{\"method\":\"pause\"}', '*' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif( options.unloadIframes === true ) {\n\t\t\t\t// Unload lazy-loaded iframes\n\t\t\t\tqueryAll( element, 'iframe[data-src]' ).forEach( el => {\n\t\t\t\t\t// Only removing the src doesn't actually unload the frame\n\t\t\t\t\t// in all browsers (Firefox) so we set it to blank first\n\t\t\t\t\tel.setAttribute( 'src', 'about:blank' );\n\t\t\t\t\tel.removeAttribute( 'src' );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t}\n\n}\n","import {\n\tSLIDE_NUMBER_FORMAT_CURRENT,\n\tSLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL,\n\tSLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL,\n\tSLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL\n} from \"../utils/constants\";\n\n/**\n * Handles the display of reveal.js' optional slide number.\n */\nexport default class SlideNumber {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'slide-number';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tlet slideNumberDisplay = 'none';\n\t\tif( config.slideNumber && !this.Reveal.isPrintView() ) {\n\t\t\tif( config.showSlideNumber === 'all' ) {\n\t\t\t\tslideNumberDisplay = 'block';\n\t\t\t}\n\t\t\telse if( config.showSlideNumber === 'speaker' && this.Reveal.isSpeakerNotes() ) {\n\t\t\t\tslideNumberDisplay = 'block';\n\t\t\t}\n\t\t}\n\n\t\tthis.element.style.display = slideNumberDisplay;\n\n\t}\n\n\t/**\n\t * Updates the slide number to match the current slide.\n\t */\n\tupdate() {\n\n\t\t// Update slide number if enabled\n\t\tif( this.Reveal.getConfig().slideNumber && this.element ) {\n\t\t\tthis.element.innerHTML = this.getSlideNumber();\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the HTML string corresponding to the current slide\n\t * number, including formatting.\n\t */\n\tgetSlideNumber( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet value;\n\t\tlet format = SLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL;\n\n\t\tif ( typeof config.slideNumber === 'function' ) {\n\t\t\tvalue = config.slideNumber( slide );\n\t\t} else {\n\t\t\t// Check if a custom number format is available\n\t\t\tif( typeof config.slideNumber === 'string' ) {\n\t\t\t\tformat = config.slideNumber;\n\t\t\t}\n\n\t\t\t// If there are ONLY vertical slides in this deck, always use\n\t\t\t// a flattened slide number\n\t\t\tif( !/c/.test( format ) && this.Reveal.getHorizontalSlides().length === 1 ) {\n\t\t\t\tformat = SLIDE_NUMBER_FORMAT_CURRENT;\n\t\t\t}\n\n\t\t\t// Offset the current slide number by 1 to make it 1-indexed\n\t\t\tlet horizontalOffset = slide && slide.dataset.visibility === 'uncounted' ? 0 : 1;\n\n\t\t\tvalue = [];\n\t\t\tswitch( format ) {\n\t\t\t\tcase SLIDE_NUMBER_FORMAT_CURRENT:\n\t\t\t\t\tvalue.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset );\n\t\t\t\t\tbreak;\n\t\t\t\tcase SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL:\n\t\t\t\t\tvalue.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset, '/', this.Reveal.getTotalSlides() );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet indices = this.Reveal.getIndices( slide );\n\t\t\t\t\tvalue.push( indices.h + horizontalOffset );\n\t\t\t\t\tlet sep = format === SLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL ? '/' : '.';\n\t\t\t\t\tif( this.Reveal.isVerticalSlide( slide ) ) value.push( sep, indices.v + 1 );\n\t\t\t}\n\t\t}\n\n\t\tlet url = '#' + this.Reveal.location.getHash( slide );\n\t\treturn this.formatNumber( value[0], value[1], value[2], url );\n\n\t}\n\n\t/**\n\t * Applies HTML formatting to a slide number before it's\n\t * written to the DOM.\n\t *\n\t * @param {number} a Current slide\n\t * @param {string} delimiter Character to separate slide numbers\n\t * @param {(number|*)} b Total slides\n\t * @param {HTMLElement} [url='#'+locationHash()] The url to link to\n\t * @return {string} HTML string fragment\n\t */\n\tformatNumber( a, delimiter, b, url = '#' + this.Reveal.location.getHash() ) {\n\n\t\tif( typeof b === 'number' && !isNaN( b ) ) {\n\t\t\treturn `<a href=\"${url}\">\n\t\t\t\t\t<span class=\"slide-number-a\">${a}</span>\n\t\t\t\t\t<span class=\"slide-number-delimiter\">${delimiter}</span>\n\t\t\t\t\t<span class=\"slide-number-b\">${b}</span>\n\t\t\t\t\t</a>`;\n\t\t}\n\t\telse {\n\t\t\treturn `<a href=\"${url}\">\n\t\t\t\t\t<span class=\"slide-number-a\">${a}</span>\n\t\t\t\t\t</a>`;\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","import { isAndroid } from '../utils/device.js'\nimport { matches } from '../utils/util.js'\n\nconst SWIPE_THRESHOLD = 40;\n\n/**\n * Controls all touch interactions and navigations for\n * a presentation.\n */\nexport default class Touch {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Holds information about the currently ongoing touch interaction\n\t\tthis.touchStartX = 0;\n\t\tthis.touchStartY = 0;\n\t\tthis.touchStartCount = 0;\n\t\tthis.touchCaptured = false;\n\n\t\tthis.onPointerDown = this.onPointerDown.bind( this );\n\t\tthis.onPointerMove = this.onPointerMove.bind( this );\n\t\tthis.onPointerUp = this.onPointerUp.bind( this );\n\t\tthis.onTouchStart = this.onTouchStart.bind( this );\n\t\tthis.onTouchMove = this.onTouchMove.bind( this );\n\t\tthis.onTouchEnd = this.onTouchEnd.bind( this );\n\n\t}\n\n\t/**\n\t *\n\t */\n\tbind() {\n\n\t\tlet revealElement = this.Reveal.getRevealElement();\n\n\t\tif( 'onpointerdown' in window ) {\n\t\t\t// Use W3C pointer events\n\t\t\trevealElement.addEventListener( 'pointerdown', this.onPointerDown, false );\n\t\t\trevealElement.addEventListener( 'pointermove', this.onPointerMove, false );\n\t\t\trevealElement.addEventListener( 'pointerup', this.onPointerUp, false );\n\t\t}\n\t\telse if( window.navigator.msPointerEnabled ) {\n\t\t\t// IE 10 uses prefixed version of pointer events\n\t\t\trevealElement.addEventListener( 'MSPointerDown', this.onPointerDown, false );\n\t\t\trevealElement.addEventListener( 'MSPointerMove', this.onPointerMove, false );\n\t\t\trevealElement.addEventListener( 'MSPointerUp', this.onPointerUp, false );\n\t\t}\n\t\telse {\n\t\t\t// Fall back to touch events\n\t\t\trevealElement.addEventListener( 'touchstart', this.onTouchStart, false );\n\t\t\trevealElement.addEventListener( 'touchmove', this.onTouchMove, false );\n\t\t\trevealElement.addEventListener( 'touchend', this.onTouchEnd, false );\n\t\t}\n\n\t}\n\n\t/**\n\t *\n\t */\n\tunbind() {\n\n\t\tlet revealElement = this.Reveal.getRevealElement();\n\n\t\trevealElement.removeEventListener( 'pointerdown', this.onPointerDown, false );\n\t\trevealElement.removeEventListener( 'pointermove', this.onPointerMove, false );\n\t\trevealElement.removeEventListener( 'pointerup', this.onPointerUp, false );\n\n\t\trevealElement.removeEventListener( 'MSPointerDown', this.onPointerDown, false );\n\t\trevealElement.removeEventListener( 'MSPointerMove', this.onPointerMove, false );\n\t\trevealElement.removeEventListener( 'MSPointerUp', this.onPointerUp, false );\n\n\t\trevealElement.removeEventListener( 'touchstart', this.onTouchStart, false );\n\t\trevealElement.removeEventListener( 'touchmove', this.onTouchMove, false );\n\t\trevealElement.removeEventListener( 'touchend', this.onTouchEnd, false );\n\n\t}\n\n\t/**\n\t * Checks if the target element prevents the triggering of\n\t * swipe navigation.\n\t */\n\tisSwipePrevented( target ) {\n\n\t\t// Prevent accidental swipes when scrubbing timelines\n\t\tif( matches( target, 'video, audio' ) ) return true;\n\n\t\twhile( target && typeof target.hasAttribute === 'function' ) {\n\t\t\tif( target.hasAttribute( 'data-prevent-swipe' ) ) return true;\n\t\t\ttarget = target.parentNode;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Handler for the 'touchstart' event, enables support for\n\t * swipe and pinch gestures.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchStart( event ) {\n\n\t\tif( this.isSwipePrevented( event.target ) ) return true;\n\n\t\tthis.touchStartX = event.touches[0].clientX;\n\t\tthis.touchStartY = event.touches[0].clientY;\n\t\tthis.touchStartCount = event.touches.length;\n\n\t}\n\n\t/**\n\t * Handler for the 'touchmove' event.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchMove( event ) {\n\n\t\tif( this.isSwipePrevented( event.target ) ) return true;\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\t// Each touch should only trigger one action\n\t\tif( !this.touchCaptured ) {\n\t\t\tthis.Reveal.onUserInput( event );\n\n\t\t\tlet currentX = event.touches[0].clientX;\n\t\t\tlet currentY = event.touches[0].clientY;\n\n\t\t\t// There was only one touch point, look for a swipe\n\t\t\tif( event.touches.length === 1 && this.touchStartCount !== 2 ) {\n\n\t\t\t\tlet availableRoutes = this.Reveal.availableRoutes({ includeFragments: true });\n\n\t\t\t\tlet deltaX = currentX - this.touchStartX,\n\t\t\t\t\tdeltaY = currentY - this.touchStartY;\n\n\t\t\t\tif( deltaX > SWIPE_THRESHOLD && Math.abs( deltaX ) > Math.abs( deltaY ) ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.left();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaX < -SWIPE_THRESHOLD && Math.abs( deltaX ) > Math.abs( deltaY ) ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.right();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaY > SWIPE_THRESHOLD && availableRoutes.up ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.up();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaY < -SWIPE_THRESHOLD && availableRoutes.down ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.down();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If we're embedded, only block touch events if they have\n\t\t\t\t// triggered an action\n\t\t\t\tif( config.embedded ) {\n\t\t\t\t\tif( this.touchCaptured || this.Reveal.isVerticalSlide() ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Not embedded? Block them all to avoid needless tossing\n\t\t\t\t// around of the viewport in iOS\n\t\t\t\telse {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\t// There's a bug with swiping on some Android devices unless\n\t\t// the default action is always prevented\n\t\telse if( isAndroid ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the 'touchend' event.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchEnd( event ) {\n\n\t\tthis.touchCaptured = false;\n\n\t}\n\n\t/**\n\t * Convert pointer down to touch start.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerDown( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchStart( event );\n\t\t}\n\n\t}\n\n\t/**\n\t * Convert pointer move to touch move.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerMove( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchMove( event );\n\t\t}\n\n\t}\n\n\t/**\n\t * Convert pointer up to touch end.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerUp( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchEnd( event );\n\t\t}\n\n\t}\n\n}","import Playback from './components/playback.js'\nimport defaultConfig from './config.js'\nimport AutoAnimate from './controllers/autoanimate.js'\nimport Backgrounds from './controllers/backgrounds.js'\nimport Controls from './controllers/controls.js'\nimport Focus from './controllers/focus.js'\nimport Fragments from './controllers/fragments.js'\nimport JumpToSlide from './controllers/jumptoslide.js'\nimport Keyboard from './controllers/keyboard.js'\nimport Location from './controllers/location.js'\nimport Notes from './controllers/notes.js'\nimport Overview from './controllers/overview.js'\nimport Plugins from './controllers/plugins.js'\nimport Pointer from './controllers/pointer.js'\nimport PrintView from './controllers/printview.js'\nimport Progress from './controllers/progress.js'\nimport ScrollView from './controllers/scrollview.js'\nimport SlideContent from './controllers/slidecontent.js'\nimport SlideNumber from './controllers/slidenumber.js'\nimport Touch from './controllers/touch.js'\nimport {\n\tHORIZONTAL_SLIDES_SELECTOR,\n\tPOST_MESSAGE_METHOD_BLACKLIST,\n\tSLIDES_SELECTOR,\n\tVERTICAL_SLIDES_SELECTOR\n} from './utils/constants.js'\nimport * as Device from './utils/device.js'\nimport * as Util from './utils/util.js'\n\n// The reveal.js version\nexport const VERSION = '5.0.1';\n\n/**\n * reveal.js\n * https://revealjs.com\n * MIT licensed\n *\n * Copyright (C) 2011-2022 Hakim El Hattab, https://hakim.se\n */\nexport default function( revealElement, options ) {\n\n\t// Support initialization with no args, one arg\n\t// [options] or two args [revealElement, options]\n\tif( arguments.length < 2 ) {\n\t\toptions = arguments[0];\n\t\trevealElement = document.querySelector( '.reveal' );\n\t}\n\n\tconst Reveal = {};\n\n\t// Configuration defaults, can be overridden at initialization time\n\tlet config = {},\n\n\t\t// Flags if reveal.js is loaded (has dispatched the 'ready' event)\n\t\tready = false,\n\n\t\t// The horizontal and vertical index of the currently active slide\n\t\tindexh,\n\t\tindexv,\n\n\t\t// The previous and current slide HTML elements\n\t\tpreviousSlide,\n\t\tcurrentSlide,\n\n\t\t// Remember which directions that the user has navigated towards\n\t\tnavigationHistory = {\n\t\t\thasNavigatedHorizontally: false,\n\t\t\thasNavigatedVertically: false\n\t\t},\n\n\t\t// Slides may have a data-state attribute which we pick up and apply\n\t\t// as a class to the body. This list contains the combined state of\n\t\t// all current slides.\n\t\tstate = [],\n\n\t\t// The current scale of the presentation (see width/height config)\n\t\tscale = 1,\n\n\t\t// CSS transform that is currently applied to the slides container,\n\t\t// split into two groups\n\t\tslidesTransform = { layout: '', overview: '' },\n\n\t\t// Cached references to DOM elements\n\t\tdom = {},\n\n\t\t// Flags if the interaction event listeners are bound\n\t\teventsAreBound = false,\n\n\t\t// The current slide transition state; idle or running\n\t\ttransition = 'idle',\n\n\t\t// The current auto-slide duration\n\t\tautoSlide = 0,\n\n\t\t// Auto slide properties\n\t\tautoSlidePlayer,\n\t\tautoSlideTimeout = 0,\n\t\tautoSlideStartTime = -1,\n\t\tautoSlidePaused = false,\n\n\t\t// Controllers for different aspects of our presentation. They're\n\t\t// all given direct references to this Reveal instance since there\n\t\t// may be multiple presentations running in parallel.\n\t\tslideContent = new SlideContent( Reveal ),\n\t\tslideNumber = new SlideNumber( Reveal ),\n\t\tjumpToSlide = new JumpToSlide( Reveal ),\n\t\tautoAnimate = new AutoAnimate( Reveal ),\n\t\tbackgrounds = new Backgrounds( Reveal ),\n\t\tscrollView = new ScrollView( Reveal ),\n\t\tprintView = new PrintView( Reveal ),\n\t\tfragments = new Fragments( Reveal ),\n\t\toverview = new Overview( Reveal ),\n\t\tkeyboard = new Keyboard( Reveal ),\n\t\tlocation = new Location( Reveal ),\n\t\tcontrols = new Controls( Reveal ),\n\t\tprogress = new Progress( Reveal ),\n\t\tpointer = new Pointer( Reveal ),\n\t\tplugins = new Plugins( Reveal ),\n\t\tfocus = new Focus( Reveal ),\n\t\ttouch = new Touch( Reveal ),\n\t\tnotes = new Notes( Reveal );\n\n\t/**\n\t * Starts up the presentation.\n\t */\n\tfunction initialize( initOptions ) {\n\n\t\tif( !revealElement ) throw 'Unable to find presentation root (<div class=\"reveal\">).';\n\n\t\t// Cache references to key DOM elements\n\t\tdom.wrapper = revealElement;\n\t\tdom.slides = revealElement.querySelector( '.slides' );\n\n\t\tif( !dom.slides ) throw 'Unable to find slides container (<div class=\"slides\">).';\n\n\t\t// Compose our config object in order of increasing precedence:\n\t\t// 1. Default reveal.js options\n\t\t// 2. Options provided via Reveal.configure() prior to\n\t\t// initialization\n\t\t// 3. Options passed to the Reveal constructor\n\t\t// 4. Options passed to Reveal.initialize\n\t\t// 5. Query params\n\t\tconfig = { ...defaultConfig, ...config, ...options, ...initOptions, ...Util.getQueryHash() };\n\n\t\t// Legacy support for the ?print-pdf query\n\t\tif( /print-pdf/gi.test( window.location.search ) ) {\n\t\t\tconfig.view = 'print';\n\t\t}\n\n\t\tsetViewport();\n\n\t\t// Force a layout when the whole page, incl fonts, has loaded\n\t\twindow.addEventListener( 'load', layout, false );\n\n\t\t// Register plugins and load dependencies, then move on to #start()\n\t\tplugins.load( config.plugins, config.dependencies ).then( start );\n\n\t\treturn new Promise( resolve => Reveal.on( 'ready', resolve ) );\n\n\t}\n\n\t/**\n\t * Encase the presentation in a reveal.js viewport. The\n\t * extent of the viewport differs based on configuration.\n\t */\n\tfunction setViewport() {\n\n\t\t// Embedded decks use the reveal element as their viewport\n\t\tif( config.embedded === true ) {\n\t\t\tdom.viewport = Util.closest( revealElement, '.reveal-viewport' ) || revealElement;\n\t\t}\n\t\t// Full-page decks use the body as their viewport\n\t\telse {\n\t\t\tdom.viewport = document.body;\n\t\t\tdocument.documentElement.classList.add( 'reveal-full-page' );\n\t\t}\n\n\t\tdom.viewport.classList.add( 'reveal-viewport' );\n\n\t}\n\n\t/**\n\t * Starts up reveal.js by binding input events and navigating\n\t * to the current URL deeplink if there is one.\n\t */\n\tfunction start() {\n\n\t\tready = true;\n\n\t\t// Remove slides hidden with data-visibility\n\t\tremoveHiddenSlides();\n\n\t\t// Make sure we've got all the DOM elements we need\n\t\tsetupDOM();\n\n\t\t// Listen to messages posted to this window\n\t\tsetupPostMessage();\n\n\t\t// Prevent the slides from being scrolled out of view\n\t\tsetupScrollPrevention();\n\n\t\t// Adds bindings for fullscreen mode\n\t\tsetupFullscreen();\n\n\t\t// Resets all vertical slides so that only the first is visible\n\t\tresetVerticalSlides();\n\n\t\t// Updates the presentation to match the current configuration values\n\t\tconfigure();\n\n\t\t// Create slide backgrounds\n\t\tbackgrounds.update( true );\n\n\t\t// Activate the print/scroll view if configured\n\t\tactivateInitialView();\n\n\t\t// Read the initial hash\n\t\tlocation.readURL();\n\n\t\t// Notify listeners that the presentation is ready but use a 1ms\n\t\t// timeout to ensure it's not fired synchronously after #initialize()\n\t\tsetTimeout( () => {\n\t\t\t// Enable transitions now that we're loaded\n\t\t\tdom.slides.classList.remove( 'no-transition' );\n\n\t\t\tdom.wrapper.classList.add( 'ready' );\n\n\t\t\tdispatchEvent({\n\t\t\t\ttype: 'ready',\n\t\t\t\tdata: {\n\t\t\t\t\tindexh,\n\t\t\t\t\tindexv,\n\t\t\t\t\tcurrentSlide\n\t\t\t\t}\n\t\t\t});\n\t\t}, 1 );\n\n\t}\n\n\t/**\n\t * Activates the correct reveal.js view based on our config.\n\t * This is only invoked once during initialization.\n\t */\n\tfunction activateInitialView() {\n\n\t\tconst activatePrintView = config.view === 'print';\n\t\tconst activateScrollView = config.view === 'scroll' || config.view === 'reader';\n\n\t\tif( activatePrintView || activateScrollView ) {\n\n\t\t\tif( activatePrintView ) {\n\t\t\t\tremoveEventListeners();\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttouch.unbind();\n\t\t\t}\n\n\t\t\t// Avoid content flickering during layout\n\t\t\tdom.viewport.classList.add( 'loading-scroll-mode' );\n\n\t\t\tif( activatePrintView ) {\n\t\t\t\t// The document needs to have loaded for the PDF layout\n\t\t\t\t// measurements to be accurate\n\t\t\t\tif( document.readyState === 'complete' ) {\n\t\t\t\t\tprintView.activate();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twindow.addEventListener( 'load', () => printView.activate() );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tscrollView.activate();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Removes all slides with data-visibility=\"hidden\". This\n\t * is done right before the rest of the presentation is\n\t * initialized.\n\t *\n\t * If you want to show all hidden slides, initialize\n\t * reveal.js with showHiddenSlides set to true.\n\t */\n\tfunction removeHiddenSlides() {\n\n\t\tif( !config.showHiddenSlides ) {\n\t\t\tUtil.queryAll( dom.wrapper, 'section[data-visibility=\"hidden\"]' ).forEach( slide => {\n\t\t\t\tconst parent = slide.parentNode;\n\n\t\t\t\t// If this slide is part of a stack and that stack will be\n\t\t\t\t// empty after removing the hidden slide, remove the entire\n\t\t\t\t// stack\n\t\t\t\tif( parent.childElementCount === 1 && /section/i.test( parent.nodeName ) ) {\n\t\t\t\t\tparent.remove();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tslide.remove();\n\t\t\t\t}\n\n\t\t\t} );\n\t\t}\n\n\t}\n\n\t/**\n\t * Finds and stores references to DOM elements which are\n\t * required by the presentation. If a required element is\n\t * not found, it is created.\n\t */\n\tfunction setupDOM() {\n\n\t\t// Prevent transitions while we're loading\n\t\tdom.slides.classList.add( 'no-transition' );\n\n\t\tif( Device.isMobile ) {\n\t\t\tdom.wrapper.classList.add( 'no-hover' );\n\t\t}\n\t\telse {\n\t\t\tdom.wrapper.classList.remove( 'no-hover' );\n\t\t}\n\n\t\tbackgrounds.render();\n\t\tslideNumber.render();\n\t\tjumpToSlide.render();\n\t\tcontrols.render();\n\t\tprogress.render();\n\t\tnotes.render();\n\n\t\t// Overlay graphic which is displayed during the paused mode\n\t\tdom.pauseOverlay = Util.createSingletonNode( dom.wrapper, 'div', 'pause-overlay', config.controls ? '<button class=\"resume-button\">Resume presentation</button>' : null );\n\n\t\tdom.statusElement = createStatusElement();\n\n\t\tdom.wrapper.setAttribute( 'role', 'application' );\n\t}\n\n\t/**\n\t * Creates a hidden div with role aria-live to announce the\n\t * current slide content. Hide the div off-screen to make it\n\t * available only to Assistive Technologies.\n\t *\n\t * @return {HTMLElement}\n\t */\n\tfunction createStatusElement() {\n\n\t\tlet statusElement = dom.wrapper.querySelector( '.aria-status' );\n\t\tif( !statusElement ) {\n\t\t\tstatusElement = document.createElement( 'div' );\n\t\t\tstatusElement.style.position = 'absolute';\n\t\t\tstatusElement.style.height = '1px';\n\t\t\tstatusElement.style.width = '1px';\n\t\t\tstatusElement.style.overflow = 'hidden';\n\t\t\tstatusElement.style.clip = 'rect( 1px, 1px, 1px, 1px )';\n\t\t\tstatusElement.classList.add( 'aria-status' );\n\t\t\tstatusElement.setAttribute( 'aria-live', 'polite' );\n\t\t\tstatusElement.setAttribute( 'aria-atomic','true' );\n\t\t\tdom.wrapper.appendChild( statusElement );\n\t\t}\n\t\treturn statusElement;\n\n\t}\n\n\t/**\n\t * Announces the given text to screen readers.\n\t */\n\tfunction announceStatus( value ) {\n\n\t\tdom.statusElement.textContent = value;\n\n\t}\n\n\t/**\n\t * Converts the given HTML element into a string of text\n\t * that can be announced to a screen reader. Hidden\n\t * elements are excluded.\n\t */\n\tfunction getStatusText( node ) {\n\n\t\tlet text = '';\n\n\t\t// Text node\n\t\tif( node.nodeType === 3 ) {\n\t\t\ttext += node.textContent;\n\t\t}\n\t\t// Element node\n\t\telse if( node.nodeType === 1 ) {\n\n\t\t\tlet isAriaHidden = node.getAttribute( 'aria-hidden' );\n\t\t\tlet isDisplayHidden = window.getComputedStyle( node )['display'] === 'none';\n\t\t\tif( isAriaHidden !== 'true' && !isDisplayHidden ) {\n\n\t\t\t\tArray.from( node.childNodes ).forEach( child => {\n\t\t\t\t\ttext += getStatusText( child );\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t\ttext = text.trim();\n\n\t\treturn text === '' ? '' : text + ' ';\n\n\t}\n\n\t/**\n\t * This is an unfortunate necessity. Some actions – such as\n\t * an input field being focused in an iframe or using the\n\t * keyboard to expand text selection beyond the bounds of\n\t * a slide – can trigger our content to be pushed out of view.\n\t * This scrolling can not be prevented by hiding overflow in\n\t * CSS (we already do) so we have to resort to repeatedly\n\t * checking if the slides have been offset :(\n\t */\n\tfunction setupScrollPrevention() {\n\n\t\tsetInterval( () => {\n\t\t\tif( !scrollView.isActive() && dom.wrapper.scrollTop !== 0 || dom.wrapper.scrollLeft !== 0 ) {\n\t\t\t\tdom.wrapper.scrollTop = 0;\n\t\t\t\tdom.wrapper.scrollLeft = 0;\n\t\t\t}\n\t\t}, 1000 );\n\n\t}\n\n\t/**\n\t * After entering fullscreen we need to force a layout to\n\t * get our presentations to scale correctly. This behavior\n\t * is inconsistent across browsers but a force layout seems\n\t * to normalize it.\n\t */\n\tfunction setupFullscreen() {\n\n\t\tdocument.addEventListener( 'fullscreenchange', onFullscreenChange );\n\t\tdocument.addEventListener( 'webkitfullscreenchange', onFullscreenChange );\n\n\t}\n\n\t/**\n\t * Registers a listener to postMessage events, this makes it\n\t * possible to call all reveal.js API methods from another\n\t * window. For example:\n\t *\n\t * revealWindow.postMessage( JSON.stringify({\n\t * method: 'slide',\n\t * args: [ 2 ]\n\t * }), '*' );\n\t */\n\tfunction setupPostMessage() {\n\n\t\tif( config.postMessage ) {\n\t\t\twindow.addEventListener( 'message', onPostMessage, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the configuration settings from the config\n\t * object. May be called multiple times.\n\t *\n\t * @param {object} options\n\t */\n\tfunction configure( options ) {\n\n\t\tconst oldConfig = { ...config }\n\n\t\t// New config options may be passed when this method\n\t\t// is invoked through the API after initialization\n\t\tif( typeof options === 'object' ) Util.extend( config, options );\n\n\t\t// Abort if reveal.js hasn't finished loading, config\n\t\t// changes will be applied automatically once ready\n\t\tif( Reveal.isReady() === false ) return;\n\n\t\tconst numberOfSlides = dom.wrapper.querySelectorAll( SLIDES_SELECTOR ).length;\n\n\t\t// The transition is added as a class on the .reveal element\n\t\tdom.wrapper.classList.remove( oldConfig.transition );\n\t\tdom.wrapper.classList.add( config.transition );\n\n\t\tdom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed );\n\t\tdom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition );\n\n\t\t// Expose our configured slide dimensions as custom props\n\t\tdom.viewport.style.setProperty( '--slide-width', typeof config.width === 'string' ? config.width : config.width + 'px' );\n\t\tdom.viewport.style.setProperty( '--slide-height', typeof config.height === 'string' ? config.height : config.height + 'px' );\n\n\t\tif( config.shuffle ) {\n\t\t\tshuffle();\n\t\t}\n\n\t\tUtil.toggleClass( dom.wrapper, 'embedded', config.embedded );\n\t\tUtil.toggleClass( dom.wrapper, 'rtl', config.rtl );\n\t\tUtil.toggleClass( dom.wrapper, 'center', config.center );\n\n\t\t// Exit the paused mode if it was configured off\n\t\tif( config.pause === false ) {\n\t\t\tresume();\n\t\t}\n\n\t\t// Iframe link previews\n\t\tif( config.previewLinks ) {\n\t\t\tenablePreviewLinks();\n\t\t\tdisablePreviewLinks( '[data-preview-link=false]' );\n\t\t}\n\t\telse {\n\t\t\tdisablePreviewLinks();\n\t\t\tenablePreviewLinks( '[data-preview-link]:not([data-preview-link=false])' );\n\t\t}\n\n\t\t// Reset all changes made by auto-animations\n\t\tautoAnimate.reset();\n\n\t\t// Remove existing auto-slide controls\n\t\tif( autoSlidePlayer ) {\n\t\t\tautoSlidePlayer.destroy();\n\t\t\tautoSlidePlayer = null;\n\t\t}\n\n\t\t// Generate auto-slide controls if needed\n\t\tif( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable ) {\n\t\t\tautoSlidePlayer = new Playback( dom.wrapper, () => {\n\t\t\t\treturn Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 );\n\t\t\t} );\n\n\t\t\tautoSlidePlayer.on( 'click', onAutoSlidePlayerClick );\n\t\t\tautoSlidePaused = false;\n\t\t}\n\n\t\t// Add the navigation mode to the DOM so we can adjust styling\n\t\tif( config.navigationMode !== 'default' ) {\n\t\t\tdom.wrapper.setAttribute( 'data-navigation-mode', config.navigationMode );\n\t\t}\n\t\telse {\n\t\t\tdom.wrapper.removeAttribute( 'data-navigation-mode' );\n\t\t}\n\n\t\tnotes.configure( config, oldConfig );\n\t\tfocus.configure( config, oldConfig );\n\t\tpointer.configure( config, oldConfig );\n\t\tcontrols.configure( config, oldConfig );\n\t\tprogress.configure( config, oldConfig );\n\t\tkeyboard.configure( config, oldConfig );\n\t\tfragments.configure( config, oldConfig );\n\t\tslideNumber.configure( config, oldConfig );\n\n\t\tsync();\n\n\t}\n\n\t/**\n\t * Binds all event listeners.\n\t */\n\tfunction addEventListeners() {\n\n\t\teventsAreBound = true;\n\n\t\twindow.addEventListener( 'resize', onWindowResize, false );\n\n\t\tif( config.touch ) touch.bind();\n\t\tif( config.keyboard ) keyboard.bind();\n\t\tif( config.progress ) progress.bind();\n\t\tif( config.respondToHashChanges ) location.bind();\n\t\tcontrols.bind();\n\t\tfocus.bind();\n\n\t\tdom.slides.addEventListener( 'click', onSlidesClicked, false );\n\t\tdom.slides.addEventListener( 'transitionend', onTransitionEnd, false );\n\t\tdom.pauseOverlay.addEventListener( 'click', resume, false );\n\n\t\tif( config.focusBodyOnPageVisibilityChange ) {\n\t\t\tdocument.addEventListener( 'visibilitychange', onPageVisibilityChange, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Unbinds all event listeners.\n\t */\n\tfunction removeEventListeners() {\n\n\t\teventsAreBound = false;\n\n\t\ttouch.unbind();\n\t\tfocus.unbind();\n\t\tkeyboard.unbind();\n\t\tcontrols.unbind();\n\t\tprogress.unbind();\n\t\tlocation.unbind();\n\n\t\twindow.removeEventListener( 'resize', onWindowResize, false );\n\n\t\tdom.slides.removeEventListener( 'click', onSlidesClicked, false );\n\t\tdom.slides.removeEventListener( 'transitionend', onTransitionEnd, false );\n\t\tdom.pauseOverlay.removeEventListener( 'click', resume, false );\n\n\t}\n\n\t/**\n\t * Uninitializes reveal.js by undoing changes made to the\n\t * DOM and removing all event listeners.\n\t */\n\tfunction destroy() {\n\n\t\tremoveEventListeners();\n\t\tcancelAutoSlide();\n\t\tdisablePreviewLinks();\n\n\t\t// Destroy controllers\n\t\tnotes.destroy();\n\t\tfocus.destroy();\n\t\tplugins.destroy();\n\t\tpointer.destroy();\n\t\tcontrols.destroy();\n\t\tprogress.destroy();\n\t\tbackgrounds.destroy();\n\t\tslideNumber.destroy();\n\t\tjumpToSlide.destroy();\n\n\t\t// Remove event listeners\n\t\tdocument.removeEventListener( 'fullscreenchange', onFullscreenChange );\n\t\tdocument.removeEventListener( 'webkitfullscreenchange', onFullscreenChange );\n\t\tdocument.removeEventListener( 'visibilitychange', onPageVisibilityChange, false );\n\t\twindow.removeEventListener( 'message', onPostMessage, false );\n\t\twindow.removeEventListener( 'load', layout, false );\n\n\t\t// Undo DOM changes\n\t\tif( dom.pauseOverlay ) dom.pauseOverlay.remove();\n\t\tif( dom.statusElement ) dom.statusElement.remove();\n\n\t\tdocument.documentElement.classList.remove( 'reveal-full-page' );\n\n\t\tdom.wrapper.classList.remove( 'ready', 'center', 'has-horizontal-slides', 'has-vertical-slides' );\n\t\tdom.wrapper.removeAttribute( 'data-transition-speed' );\n\t\tdom.wrapper.removeAttribute( 'data-background-transition' );\n\n\t\tdom.viewport.classList.remove( 'reveal-viewport' );\n\t\tdom.viewport.style.removeProperty( '--slide-width' );\n\t\tdom.viewport.style.removeProperty( '--slide-height' );\n\n\t\tdom.slides.style.removeProperty( 'width' );\n\t\tdom.slides.style.removeProperty( 'height' );\n\t\tdom.slides.style.removeProperty( 'zoom' );\n\t\tdom.slides.style.removeProperty( 'left' );\n\t\tdom.slides.style.removeProperty( 'top' );\n\t\tdom.slides.style.removeProperty( 'bottom' );\n\t\tdom.slides.style.removeProperty( 'right' );\n\t\tdom.slides.style.removeProperty( 'transform' );\n\n\t\tArray.from( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( slide => {\n\t\t\tslide.style.removeProperty( 'display' );\n\t\t\tslide.style.removeProperty( 'top' );\n\t\t\tslide.removeAttribute( 'hidden' );\n\t\t\tslide.removeAttribute( 'aria-hidden' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Adds a listener to one of our custom reveal.js events,\n\t * like slidechanged.\n\t */\n\tfunction on( type, listener, useCapture ) {\n\n\t\trevealElement.addEventListener( type, listener, useCapture );\n\n\t}\n\n\t/**\n\t * Unsubscribes from a reveal.js event.\n\t */\n\tfunction off( type, listener, useCapture ) {\n\n\t\trevealElement.removeEventListener( type, listener, useCapture );\n\n\t}\n\n\t/**\n\t * Applies CSS transforms to the slides container. The container\n\t * is transformed from two separate sources: layout and the overview\n\t * mode.\n\t *\n\t * @param {object} transforms\n\t */\n\tfunction transformSlides( transforms ) {\n\n\t\t// Pick up new transforms from arguments\n\t\tif( typeof transforms.layout === 'string' ) slidesTransform.layout = transforms.layout;\n\t\tif( typeof transforms.overview === 'string' ) slidesTransform.overview = transforms.overview;\n\n\t\t// Apply the transforms to the slides container\n\t\tif( slidesTransform.layout ) {\n\t\t\tUtil.transformElement( dom.slides, slidesTransform.layout + ' ' + slidesTransform.overview );\n\t\t}\n\t\telse {\n\t\t\tUtil.transformElement( dom.slides, slidesTransform.overview );\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event of the specified type from the\n\t * reveal DOM element.\n\t */\n\tfunction dispatchEvent({ target=dom.wrapper, type, data, bubbles=true }) {\n\n\t\tlet event = document.createEvent( 'HTMLEvents', 1, 2 );\n\t\tevent.initEvent( type, bubbles, true );\n\t\tUtil.extend( event, data );\n\t\ttarget.dispatchEvent( event );\n\n\t\tif( target === dom.wrapper ) {\n\t\t\t// If we're in an iframe, post each reveal.js event to the\n\t\t\t// parent window. Used by the notes plugin\n\t\t\tdispatchPostMessage( type );\n\t\t}\n\n\t\treturn event;\n\n\t}\n\n\t/**\n\t * Dispatches a slidechanged event.\n\t *\n\t * @param {string} origin Used to identify multiplex clients\n\t */\n\tfunction dispatchSlideChanged( origin ) {\n\n\t\tdispatchEvent({\n\t\t\ttype: 'slidechanged',\n\t\t\tdata: {\n\t\t\t\tindexh,\n\t\t\t\tindexv,\n\t\t\t\tpreviousSlide,\n\t\t\t\tcurrentSlide,\n\t\t\t\torigin\n\t\t\t}\n\t\t});\n\n\t}\n\n\t/**\n\t * Dispatched a postMessage of the given type from our window.\n\t */\n\tfunction dispatchPostMessage( type, data ) {\n\n\t\tif( config.postMessageEvents && window.parent !== window.self ) {\n\t\t\tlet message = {\n\t\t\t\tnamespace: 'reveal',\n\t\t\t\teventName: type,\n\t\t\t\tstate: getState()\n\t\t\t};\n\n\t\t\tUtil.extend( message, data );\n\n\t\t\twindow.parent.postMessage( JSON.stringify( message ), '*' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Bind preview frame links.\n\t *\n\t * @param {string} [selector=a] - selector for anchors\n\t */\n\tfunction enablePreviewLinks( selector = 'a' ) {\n\n\t\tArray.from( dom.wrapper.querySelectorAll( selector ) ).forEach( element => {\n\t\t\tif( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) {\n\t\t\t\telement.addEventListener( 'click', onPreviewLinkClicked, false );\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Unbind preview frame links.\n\t */\n\tfunction disablePreviewLinks( selector = 'a' ) {\n\n\t\tArray.from( dom.wrapper.querySelectorAll( selector ) ).forEach( element => {\n\t\t\tif( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) {\n\t\t\t\telement.removeEventListener( 'click', onPreviewLinkClicked, false );\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Opens a preview window for the target URL.\n\t *\n\t * @param {string} url - url for preview iframe src\n\t */\n\tfunction showPreview( url ) {\n\n\t\tcloseOverlay();\n\n\t\tdom.overlay = document.createElement( 'div' );\n\t\tdom.overlay.classList.add( 'overlay' );\n\t\tdom.overlay.classList.add( 'overlay-preview' );\n\t\tdom.wrapper.appendChild( dom.overlay );\n\n\t\tdom.overlay.innerHTML =\n\t\t\t`<header>\n\t\t\t\t<a class=\"close\" href=\"#\"><span class=\"icon\"></span></a>\n\t\t\t\t<a class=\"external\" href=\"${url}\" target=\"_blank\"><span class=\"icon\"></span></a>\n\t\t\t</header>\n\t\t\t<div class=\"spinner\"></div>\n\t\t\t<div class=\"viewport\">\n\t\t\t\t<iframe src=\"${url}\"></iframe>\n\t\t\t\t<small class=\"viewport-inner\">\n\t\t\t\t\t<span class=\"x-frame-error\">Unable to load iframe. This is likely due to the site's policy (x-frame-options).</span>\n\t\t\t\t</small>\n\t\t\t</div>`;\n\n\t\tdom.overlay.querySelector( 'iframe' ).addEventListener( 'load', event => {\n\t\t\tdom.overlay.classList.add( 'loaded' );\n\t\t}, false );\n\n\t\tdom.overlay.querySelector( '.close' ).addEventListener( 'click', event => {\n\t\t\tcloseOverlay();\n\t\t\tevent.preventDefault();\n\t\t}, false );\n\n\t\tdom.overlay.querySelector( '.external' ).addEventListener( 'click', event => {\n\t\t\tcloseOverlay();\n\t\t}, false );\n\n\t}\n\n\t/**\n\t * Open or close help overlay window.\n\t *\n\t * @param {Boolean} [override] Flag which overrides the\n\t * toggle logic and forcibly sets the desired state. True means\n\t * help is open, false means it's closed.\n\t */\n\tfunction toggleHelp( override ){\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? showHelp() : closeOverlay();\n\t\t}\n\t\telse {\n\t\t\tif( dom.overlay ) {\n\t\t\t\tcloseOverlay();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tshowHelp();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Opens an overlay window with help material.\n\t */\n\tfunction showHelp() {\n\n\t\tif( config.help ) {\n\n\t\t\tcloseOverlay();\n\n\t\t\tdom.overlay = document.createElement( 'div' );\n\t\t\tdom.overlay.classList.add( 'overlay' );\n\t\t\tdom.overlay.classList.add( 'overlay-help' );\n\t\t\tdom.wrapper.appendChild( dom.overlay );\n\n\t\t\tlet html = '<p class=\"title\">Keyboard Shortcuts</p><br/>';\n\n\t\t\tlet shortcuts = keyboard.getShortcuts(),\n\t\t\t\tbindings = keyboard.getBindings();\n\n\t\t\thtml += '<table><th>KEY</th><th>ACTION</th>';\n\t\t\tfor( let key in shortcuts ) {\n\t\t\t\thtml += `<tr><td>${key}</td><td>${shortcuts[ key ]}</td></tr>`;\n\t\t\t}\n\n\t\t\t// Add custom key bindings that have associated descriptions\n\t\t\tfor( let binding in bindings ) {\n\t\t\t\tif( bindings[binding].key && bindings[binding].description ) {\n\t\t\t\t\thtml += `<tr><td>${bindings[binding].key}</td><td>${bindings[binding].description}</td></tr>`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thtml += '</table>';\n\n\t\t\tdom.overlay.innerHTML = `\n\t\t\t\t<header>\n\t\t\t\t\t<a class=\"close\" href=\"#\"><span class=\"icon\"></span></a>\n\t\t\t\t</header>\n\t\t\t\t<div class=\"viewport\">\n\t\t\t\t\t<div class=\"viewport-inner\">${html}</div>\n\t\t\t\t</div>\n\t\t\t`;\n\n\t\t\tdom.overlay.querySelector( '.close' ).addEventListener( 'click', event => {\n\t\t\t\tcloseOverlay();\n\t\t\t\tevent.preventDefault();\n\t\t\t}, false );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Closes any currently open overlay.\n\t */\n\tfunction closeOverlay() {\n\n\t\tif( dom.overlay ) {\n\t\t\tdom.overlay.parentNode.removeChild( dom.overlay );\n\t\t\tdom.overlay = null;\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Applies JavaScript-controlled layout rules to the\n\t * presentation.\n\t */\n\tfunction layout() {\n\n\t\tif( dom.wrapper && !printView.isActive() ) {\n\n\t\t\tconst viewportWidth = dom.viewport.offsetWidth;\n\t\t\tconst viewportHeight = dom.viewport.offsetHeight;\n\n\t\t\tif( !config.disableLayout ) {\n\n\t\t\t\t// On some mobile devices '100vh' is taller than the visible\n\t\t\t\t// viewport which leads to part of the presentation being\n\t\t\t\t// cut off. To work around this we define our own '--vh' custom\n\t\t\t\t// property where 100x adds up to the correct height.\n\t\t\t\t//\n\t\t\t\t// https://css-tricks.com/the-trick-to-viewport-units-on-mobile/\n\t\t\t\tif( Device.isMobile && !config.embedded ) {\n\t\t\t\t\tdocument.documentElement.style.setProperty( '--vh', ( window.innerHeight * 0.01 ) + 'px' );\n\t\t\t\t}\n\n\t\t\t\tconst size = scrollView.isActive() ?\n\t\t\t\t\t\t\t getComputedSlideSize( viewportWidth, viewportHeight ) :\n\t\t\t\t\t\t\t getComputedSlideSize();\n\n\t\t\t\tconst oldScale = scale;\n\n\t\t\t\t// Layout the contents of the slides\n\t\t\t\tlayoutSlideContents( config.width, config.height );\n\n\t\t\t\tdom.slides.style.width = size.width + 'px';\n\t\t\t\tdom.slides.style.height = size.height + 'px';\n\n\t\t\t\t// Determine scale of content to fit within available space\n\t\t\t\tscale = Math.min( size.presentationWidth / size.width, size.presentationHeight / size.height );\n\n\t\t\t\t// Respect max/min scale settings\n\t\t\t\tscale = Math.max( scale, config.minScale );\n\t\t\t\tscale = Math.min( scale, config.maxScale );\n\n\t\t\t\t// Don't apply any scaling styles if scale is 1 or we're\n\t\t\t\t// in the scroll view\n\t\t\t\tif( scale === 1 || scrollView.isActive() ) {\n\t\t\t\t\tdom.slides.style.zoom = '';\n\t\t\t\t\tdom.slides.style.left = '';\n\t\t\t\t\tdom.slides.style.top = '';\n\t\t\t\t\tdom.slides.style.bottom = '';\n\t\t\t\t\tdom.slides.style.right = '';\n\t\t\t\t\ttransformSlides( { layout: '' } );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdom.slides.style.zoom = '';\n\t\t\t\t\tdom.slides.style.left = '50%';\n\t\t\t\t\tdom.slides.style.top = '50%';\n\t\t\t\t\tdom.slides.style.bottom = 'auto';\n\t\t\t\t\tdom.slides.style.right = 'auto';\n\t\t\t\t\ttransformSlides( { layout: 'translate(-50%, -50%) scale('+ scale +')' } );\n\t\t\t\t}\n\n\t\t\t\t// Select all slides, vertical and horizontal\n\t\t\t\tconst slides = Array.from( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) );\n\n\t\t\t\tfor( let i = 0, len = slides.length; i < len; i++ ) {\n\t\t\t\t\tconst slide = slides[ i ];\n\n\t\t\t\t\t// Don't bother updating invisible slides\n\t\t\t\t\tif( slide.style.display === 'none' ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif( ( config.center || slide.classList.contains( 'center' ) ) ) {\n\t\t\t\t\t\t// Vertical stacks are not centred since their section\n\t\t\t\t\t\t// children will be\n\t\t\t\t\t\tif( slide.classList.contains( 'stack' ) ) {\n\t\t\t\t\t\t\tslide.style.top = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tslide.style.top = Math.max( ( size.height - slide.scrollHeight ) / 2, 0 ) + 'px';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tslide.style.top = '';\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif( oldScale !== scale ) {\n\t\t\t\t\tdispatchEvent({\n\t\t\t\t\t\ttype: 'resize',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\toldScale,\n\t\t\t\t\t\t\tscale,\n\t\t\t\t\t\t\tsize\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Responsively turn on the scroll mode if there is an activation\n\t\t\t\t// width configured. Ignore if we're configured to always be in\n\t\t\t\t// scroll mode.\n\t\t\t\tif( typeof config.scrollActivationWidth === 'number' && config.view !== 'scroll' ) {\n\t\t\t\t\tif( size.presentationWidth > 0 && size.presentationWidth <= config.scrollActivationWidth ) {\n\t\t\t\t\t\tif( !scrollView.isActive() ) scrollView.activate();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif( scrollView.isActive() ) scrollView.deactivate();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdom.viewport.style.setProperty( '--slide-scale', scale );\n\t\t\tdom.viewport.style.setProperty( '--viewport-width', viewportWidth + 'px' );\n\t\t\tdom.viewport.style.setProperty( '--viewport-height', viewportHeight + 'px' );\n\n\t\t\tscrollView.layout();\n\n\t\t\tprogress.update();\n\t\t\tbackgrounds.updateParallax();\n\n\t\t\tif( overview.isActive() ) {\n\t\t\t\toverview.update();\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies layout logic to the contents of all slides in\n\t * the presentation.\n\t *\n\t * @param {string|number} width\n\t * @param {string|number} height\n\t */\n\tfunction layoutSlideContents( width, height ) {\n\t\t// Handle sizing of elements with the 'r-stretch' class\n\t\tUtil.queryAll( dom.slides, 'section > .stretch, section > .r-stretch' ).forEach( element => {\n\n\t\t\t// Determine how much vertical space we can use\n\t\t\tlet remainingHeight = Util.getRemainingHeight( element, height );\n\n\t\t\t// Consider the aspect ratio of media elements\n\t\t\tif( /(img|video)/gi.test( element.nodeName ) ) {\n\t\t\t\tconst nw = element.naturalWidth || element.videoWidth,\n\t\t\t\t\t nh = element.naturalHeight || element.videoHeight;\n\n\t\t\t\tconst es = Math.min( width / nw, remainingHeight / nh );\n\n\t\t\t\telement.style.width = ( nw * es ) + 'px';\n\t\t\t\telement.style.height = ( nh * es ) + 'px';\n\n\t\t\t}\n\t\t\telse {\n\t\t\t\telement.style.width = width + 'px';\n\t\t\t\telement.style.height = remainingHeight + 'px';\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Calculates the computed pixel size of our slides. These\n\t * values are based on the width and height configuration\n\t * options.\n\t *\n\t * @param {number} [presentationWidth=dom.wrapper.offsetWidth]\n\t * @param {number} [presentationHeight=dom.wrapper.offsetHeight]\n\t */\n\tfunction getComputedSlideSize( presentationWidth, presentationHeight ) {\n\n\t\tlet width = config.width;\n\t\tlet height = config.height;\n\n\t\tif( config.disableLayout ) {\n\t\t\twidth = dom.slides.offsetWidth;\n\t\t\theight = dom.slides.offsetHeight;\n\t\t}\n\n\t\tconst size = {\n\t\t\t// Slide size\n\t\t\twidth: width,\n\t\t\theight: height,\n\n\t\t\t// Presentation size\n\t\t\tpresentationWidth: presentationWidth || dom.wrapper.offsetWidth,\n\t\t\tpresentationHeight: presentationHeight || dom.wrapper.offsetHeight\n\t\t};\n\n\t\t// Reduce available space by margin\n\t\tsize.presentationWidth -= ( size.presentationWidth * config.margin );\n\t\tsize.presentationHeight -= ( size.presentationHeight * config.margin );\n\n\t\t// Slide width may be a percentage of available width\n\t\tif( typeof size.width === 'string' && /%$/.test( size.width ) ) {\n\t\t\tsize.width = parseInt( size.width, 10 ) / 100 * size.presentationWidth;\n\t\t}\n\n\t\t// Slide height may be a percentage of available height\n\t\tif( typeof size.height === 'string' && /%$/.test( size.height ) ) {\n\t\t\tsize.height = parseInt( size.height, 10 ) / 100 * size.presentationHeight;\n\t\t}\n\n\t\treturn size;\n\n\t}\n\n\t/**\n\t * Stores the vertical index of a stack so that the same\n\t * vertical slide can be selected when navigating to and\n\t * from the stack.\n\t *\n\t * @param {HTMLElement} stack The vertical stack element\n\t * @param {string|number} [v=0] Index to memorize\n\t */\n\tfunction setPreviousVerticalIndex( stack, v ) {\n\n\t\tif( typeof stack === 'object' && typeof stack.setAttribute === 'function' ) {\n\t\t\tstack.setAttribute( 'data-previous-indexv', v || 0 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Retrieves the vertical index which was stored using\n\t * #setPreviousVerticalIndex() or 0 if no previous index\n\t * exists.\n\t *\n\t * @param {HTMLElement} stack The vertical stack element\n\t */\n\tfunction getPreviousVerticalIndex( stack ) {\n\n\t\tif( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) {\n\t\t\t// Prefer manually defined start-indexv\n\t\t\tconst attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv';\n\n\t\t\treturn parseInt( stack.getAttribute( attributeName ) || 0, 10 );\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Checks if the current or specified slide is vertical\n\t * (nested within another slide).\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide to check\n\t * orientation of\n\t * @return {Boolean}\n\t */\n\tfunction isVerticalSlide( slide = currentSlide ) {\n\n\t\treturn slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i );\n\n\t}\n\n\t/**\n\t * Checks if the current or specified slide is a stack containing\n\t * vertical slides.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide]\n\t * @return {Boolean}\n\t */\n\tfunction isVerticalStack( slide = currentSlide ) {\n\n\t\treturn slide.classList.contains( '.stack' ) || slide.querySelector( 'section' ) !== null;\n\n\t}\n\n\t/**\n\t * Returns true if we're on the last slide in the current\n\t * vertical stack.\n\t */\n\tfunction isLastVerticalSlide() {\n\n\t\tif( currentSlide && isVerticalSlide( currentSlide ) ) {\n\t\t\t// Does this slide have a next sibling?\n\t\t\tif( currentSlide.nextElementSibling ) return false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns true if we're currently on the first slide in\n\t * the presentation.\n\t */\n\tfunction isFirstSlide() {\n\n\t\treturn indexh === 0 && indexv === 0;\n\n\t}\n\n\t/**\n\t * Returns true if we're currently on the last slide in\n\t * the presenation. If the last slide is a stack, we only\n\t * consider this the last slide if it's at the end of the\n\t * stack.\n\t */\n\tfunction isLastSlide() {\n\n\t\tif( currentSlide ) {\n\t\t\t// Does this slide have a next sibling?\n\t\t\tif( currentSlide.nextElementSibling ) return false;\n\n\t\t\t// If it's vertical, does its parent have a next sibling?\n\t\t\tif( isVerticalSlide( currentSlide ) && currentSlide.parentNode.nextElementSibling ) return false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Enters the paused mode which fades everything on screen to\n\t * black.\n\t */\n\tfunction pause() {\n\n\t\tif( config.pause ) {\n\t\t\tconst wasPaused = dom.wrapper.classList.contains( 'paused' );\n\n\t\t\tcancelAutoSlide();\n\t\t\tdom.wrapper.classList.add( 'paused' );\n\n\t\t\tif( wasPaused === false ) {\n\t\t\t\tdispatchEvent({ type: 'paused' });\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Exits from the paused mode.\n\t */\n\tfunction resume() {\n\n\t\tconst wasPaused = dom.wrapper.classList.contains( 'paused' );\n\t\tdom.wrapper.classList.remove( 'paused' );\n\n\t\tcueAutoSlide();\n\n\t\tif( wasPaused ) {\n\t\t\tdispatchEvent({ type: 'resumed' });\n\t\t}\n\n\t}\n\n\t/**\n\t * Toggles the paused mode on and off.\n\t */\n\tfunction togglePause( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? pause() : resume();\n\t\t}\n\t\telse {\n\t\t\tisPaused() ? resume() : pause();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if we are currently in the paused mode.\n\t *\n\t * @return {Boolean}\n\t */\n\tfunction isPaused() {\n\n\t\treturn dom.wrapper.classList.contains( 'paused' );\n\n\t}\n\n\t/**\n\t * Toggles visibility of the jump-to-slide UI.\n\t */\n\tfunction toggleJumpToSlide( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? jumpToSlide.show() : jumpToSlide.hide();\n\t\t}\n\t\telse {\n\t\t\tjumpToSlide.isVisible() ? jumpToSlide.hide() : jumpToSlide.show();\n\t\t}\n\n\t}\n\n\t/**\n\t * Toggles the auto slide mode on and off.\n\t *\n\t * @param {Boolean} [override] Flag which sets the desired state.\n\t * True means autoplay starts, false means it stops.\n\t */\n\n\tfunction toggleAutoSlide( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? resumeAutoSlide() : pauseAutoSlide();\n\t\t}\n\n\t\telse {\n\t\t\tautoSlidePaused ? resumeAutoSlide() : pauseAutoSlide();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the auto slide mode is currently on.\n\t *\n\t * @return {Boolean}\n\t */\n\tfunction isAutoSliding() {\n\n\t\treturn !!( autoSlide && !autoSlidePaused );\n\n\t}\n\n\t/**\n\t * Steps from the current point in the presentation to the\n\t * slide which matches the specified horizontal and vertical\n\t * indices.\n\t *\n\t * @param {number} [h=indexh] Horizontal index of the target slide\n\t * @param {number} [v=indexv] Vertical index of the target slide\n\t * @param {number} [f] Index of a fragment within the\n\t * target slide to activate\n\t * @param {number} [origin] Origin for use in multimaster environments\n\t */\n\tfunction slide( h, v, f, origin ) {\n\n\t\t// Dispatch an event before the slide\n\t\tconst slidechange = dispatchEvent({\n\t\t\ttype: 'beforeslidechange',\n\t\t\tdata: {\n\t\t\t\tindexh: h === undefined ? indexh : h,\n\t\t\t\tindexv: v === undefined ? indexv : v,\n\t\t\t\torigin\n\t\t\t}\n\t\t});\n\n\t\t// Abort if this slide change was prevented by an event listener\n\t\tif( slidechange.defaultPrevented ) return;\n\n\t\t// Remember where we were at before\n\t\tpreviousSlide = currentSlide;\n\n\t\t// Query all horizontal slides in the deck\n\t\tconst horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR );\n\n\t\t// If we're in scroll mode, we scroll the target slide into view\n\t\t// instead of running our standard slide transition\n\t\tif( scrollView.isActive() ) {\n\t\t\tconst scrollToSlide = scrollView.getSlideByIndices( h, v );\n\t\t\tif( scrollToSlide ) scrollView.scrollToSlide( scrollToSlide );\n\t\t\treturn;\n\t\t}\n\n\t\t// Abort if there are no slides\n\t\tif( horizontalSlides.length === 0 ) return;\n\n\t\t// If no vertical index is specified and the upcoming slide is a\n\t\t// stack, resume at its previous vertical index\n\t\tif( v === undefined && !overview.isActive() ) {\n\t\t\tv = getPreviousVerticalIndex( horizontalSlides[ h ] );\n\t\t}\n\n\t\t// If we were on a vertical stack, remember what vertical index\n\t\t// it was on so we can resume at the same position when returning\n\t\tif( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) {\n\t\t\tsetPreviousVerticalIndex( previousSlide.parentNode, indexv );\n\t\t}\n\n\t\t// Remember the state before this slide\n\t\tconst stateBefore = state.concat();\n\n\t\t// Reset the state array\n\t\tstate.length = 0;\n\n\t\tlet indexhBefore = indexh || 0,\n\t\t\tindexvBefore = indexv || 0;\n\n\t\t// Activate and transition to the new slide\n\t\tindexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h );\n\t\tindexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v );\n\n\t\t// Dispatch an event if the slide changed\n\t\tlet slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore );\n\n\t\t// Ensure that the previous slide is never the same as the current\n\t\tif( !slideChanged ) previousSlide = null;\n\n\t\t// Find the current horizontal slide and any possible vertical slides\n\t\t// within it\n\t\tlet currentHorizontalSlide = horizontalSlides[ indexh ],\n\t\t\tcurrentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' );\n\n\t\t// Store references to the previous and current slides\n\t\tcurrentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide;\n\n\t\tlet autoAnimateTransition = false;\n\n\t\t// Detect if we're moving between two auto-animated slides\n\t\tif( slideChanged && previousSlide && currentSlide && !overview.isActive() ) {\n\t\t\ttransition = 'running';\n\n\t\t\tautoAnimateTransition = shouldAutoAnimateBetween( previousSlide, currentSlide, indexhBefore, indexvBefore );\n\n\t\t\t// If this is an auto-animated transition, we disable the\n\t\t\t// regular slide transition\n\t\t\t//\n\t\t\t// Note 20-03-2020:\n\t\t\t// This needs to happen before we update slide visibility,\n\t\t\t// otherwise transitions will still run in Safari.\n\t\t\tif( autoAnimateTransition ) {\n\t\t\t\tdom.slides.classList.add( 'disable-slide-transitions' )\n\t\t\t}\n\t\t}\n\n\t\t// Update the visibility of slides now that the indices have changed\n\t\tupdateSlidesVisibility();\n\n\t\tlayout();\n\n\t\t// Update the overview if it's currently active\n\t\tif( overview.isActive() ) {\n\t\t\toverview.update();\n\t\t}\n\n\t\t// Show fragment, if specified\n\t\tif( typeof f !== 'undefined' ) {\n\t\t\tfragments.goto( f );\n\t\t}\n\n\t\t// Solves an edge case where the previous slide maintains the\n\t\t// 'present' class when navigating between adjacent vertical\n\t\t// stacks\n\t\tif( previousSlide && previousSlide !== currentSlide ) {\n\t\t\tpreviousSlide.classList.remove( 'present' );\n\t\t\tpreviousSlide.setAttribute( 'aria-hidden', 'true' );\n\n\t\t\t// Reset all slides upon navigate to home\n\t\t\tif( isFirstSlide() ) {\n\t\t\t\t// Launch async task\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tgetVerticalStacks().forEach( slide => {\n\t\t\t\t\t\tsetPreviousVerticalIndex( slide, 0 );\n\t\t\t\t\t} );\n\t\t\t\t}, 0 );\n\t\t\t}\n\t\t}\n\n\t\t// Apply the new state\n\t\tstateLoop: for( let i = 0, len = state.length; i < len; i++ ) {\n\t\t\t// Check if this state existed on the previous slide. If it\n\t\t\t// did, we will avoid adding it repeatedly\n\t\t\tfor( let j = 0; j < stateBefore.length; j++ ) {\n\t\t\t\tif( stateBefore[j] === state[i] ) {\n\t\t\t\t\tstateBefore.splice( j, 1 );\n\t\t\t\t\tcontinue stateLoop;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdom.viewport.classList.add( state[i] );\n\n\t\t\t// Dispatch custom event matching the state's name\n\t\t\tdispatchEvent({ type: state[i] });\n\t\t}\n\n\t\t// Clean up the remains of the previous state\n\t\twhile( stateBefore.length ) {\n\t\t\tdom.viewport.classList.remove( stateBefore.pop() );\n\t\t}\n\n\t\tif( slideChanged ) {\n\t\t\tdispatchSlideChanged( origin );\n\t\t}\n\n\t\t// Handle embedded content\n\t\tif( slideChanged || !previousSlide ) {\n\t\t\tslideContent.stopEmbeddedContent( previousSlide );\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t}\n\n\t\t// Announce the current slide contents to screen readers\n\t\t// Use animation frame to prevent getComputedStyle in getStatusText\n\t\t// from triggering layout mid-frame\n\t\trequestAnimationFrame( () => {\n\t\t\tannounceStatus( getStatusText( currentSlide ) );\n\t\t});\n\n\t\tprogress.update();\n\t\tcontrols.update();\n\t\tnotes.update();\n\t\tbackgrounds.update();\n\t\tbackgrounds.updateParallax();\n\t\tslideNumber.update();\n\t\tfragments.update();\n\n\t\t// Update the URL hash\n\t\tlocation.writeURL();\n\n\t\tcueAutoSlide();\n\n\t\t// Auto-animation\n\t\tif( autoAnimateTransition ) {\n\n\t\t\tsetTimeout( () => {\n\t\t\t\tdom.slides.classList.remove( 'disable-slide-transitions' );\n\t\t\t}, 0 );\n\n\t\t\tif( config.autoAnimate ) {\n\t\t\t\t// Run the auto-animation between our slides\n\t\t\t\tautoAnimate.run( previousSlide, currentSlide );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks whether or not an auto-animation should take place between\n\t * the two given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t * @param {number} indexhBefore\n\t * @param {number} indexvBefore\n\t *\n\t * @returns {boolean}\n\t */\n\tfunction shouldAutoAnimateBetween( fromSlide, toSlide, indexhBefore, indexvBefore ) {\n\n\t\treturn \tfromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' ) &&\n\t\t\t\tfromSlide.getAttribute( 'data-auto-animate-id' ) === toSlide.getAttribute( 'data-auto-animate-id' ) &&\n\t\t\t\t!( ( indexh > indexhBefore || indexv > indexvBefore ) ? toSlide : fromSlide ).hasAttribute( 'data-auto-animate-restart' );\n\n\t}\n\n\t/**\n\t * Called anytime a new slide should be activated while in the scroll\n\t * view. The active slide is the page that occupies the most space in\n\t * the scrollable viewport.\n\t *\n\t * @param {number} pageIndex\n\t * @param {HTMLElement} slideElement\n\t */\n\tfunction setCurrentScrollPage( slideElement, h, v ) {\n\n\t\tlet indexhBefore = indexh || 0;\n\n\t\tindexh = h;\n\t\tindexv = v;\n\n\t\tconst slideChanged = currentSlide !== slideElement;\n\n\t\tpreviousSlide = currentSlide;\n\t\tcurrentSlide = slideElement;\n\n\t\tif( currentSlide && previousSlide ) {\n\t\t\tif( config.autoAnimate && shouldAutoAnimateBetween( previousSlide, currentSlide, indexhBefore, indexv ) ) {\n\t\t\t\t// Run the auto-animation between our slides\n\t\t\t\tautoAnimate.run( previousSlide, currentSlide );\n\t\t\t}\n\t\t}\n\n\t\t// Start or stop embedded content like videos and iframes\n\t\tif( slideChanged ) {\n\t\t\tif( previousSlide ) {\n\t\t\t\tslideContent.stopEmbeddedContent( previousSlide );\n\t\t\t\tslideContent.stopEmbeddedContent( previousSlide.slideBackgroundElement );\n\t\t\t}\n\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t\tslideContent.startEmbeddedContent( currentSlide.slideBackgroundElement );\n\t\t}\n\n\t\trequestAnimationFrame( () => {\n\t\t\tannounceStatus( getStatusText( currentSlide ) );\n\t\t});\n\n\t\tdispatchSlideChanged();\n\n\t}\n\n\t/**\n\t * Syncs the presentation with the current DOM. Useful\n\t * when new slides or control elements are added or when\n\t * the configuration has changed.\n\t */\n\tfunction sync() {\n\n\t\t// Subscribe to input\n\t\tremoveEventListeners();\n\t\taddEventListeners();\n\n\t\t// Force a layout to make sure the current config is accounted for\n\t\tlayout();\n\n\t\t// Reflect the current autoSlide value\n\t\tautoSlide = config.autoSlide;\n\n\t\t// Start auto-sliding if it's enabled\n\t\tcueAutoSlide();\n\n\t\t// Re-create all slide backgrounds\n\t\tbackgrounds.create();\n\n\t\t// Write the current hash to the URL\n\t\tlocation.writeURL();\n\n\t\tif( config.sortFragmentsOnSync === true ) {\n\t\t\tfragments.sortAll();\n\t\t}\n\n\t\tcontrols.update();\n\t\tprogress.update();\n\n\t\tupdateSlidesVisibility();\n\n\t\tnotes.update();\n\t\tnotes.updateVisibility();\n\t\tbackgrounds.update( true );\n\t\tslideNumber.update();\n\t\tslideContent.formatEmbeddedContent();\n\n\t\t// Start or stop embedded content depending on global config\n\t\tif( config.autoPlayMedia === false ) {\n\t\t\tslideContent.stopEmbeddedContent( currentSlide, { unloadIframes: false } );\n\t\t}\n\t\telse {\n\t\t\tslideContent.startEmbeddedContent( currentSlide );\n\t\t}\n\n\t\tif( overview.isActive() ) {\n\t\t\toverview.layout();\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates reveal.js to keep in sync with new slide attributes. For\n\t * example, if you add a new `data-background-image` you can call\n\t * this to have reveal.js render the new background image.\n\t *\n\t * Similar to #sync() but more efficient when you only need to\n\t * refresh a specific slide.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tfunction syncSlide( slide = currentSlide ) {\n\n\t\tbackgrounds.sync( slide );\n\t\tfragments.sync( slide );\n\n\t\tslideContent.load( slide );\n\n\t\tbackgrounds.update();\n\t\tnotes.update();\n\n\t}\n\n\t/**\n\t * Resets all vertical slides so that only the first\n\t * is visible.\n\t */\n\tfunction resetVerticalSlides() {\n\n\t\tgetHorizontalSlides().forEach( horizontalSlide => {\n\n\t\t\tUtil.queryAll( horizontalSlide, 'section' ).forEach( ( verticalSlide, y ) => {\n\n\t\t\t\tif( y > 0 ) {\n\t\t\t\t\tverticalSlide.classList.remove( 'present' );\n\t\t\t\t\tverticalSlide.classList.remove( 'past' );\n\t\t\t\t\tverticalSlide.classList.add( 'future' );\n\t\t\t\t\tverticalSlide.setAttribute( 'aria-hidden', 'true' );\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Randomly shuffles all slides in the deck.\n\t */\n\tfunction shuffle( slides = getHorizontalSlides() ) {\n\n\t\tslides.forEach( ( slide, i ) => {\n\n\t\t\t// Insert the slide next to a randomly picked sibling slide\n\t\t\t// slide. This may cause the slide to insert before itself,\n\t\t\t// but that's not an issue.\n\t\t\tlet beforeSlide = slides[ Math.floor( Math.random() * slides.length ) ];\n\t\t\tif( beforeSlide.parentNode === slide.parentNode ) {\n\t\t\t\tslide.parentNode.insertBefore( slide, beforeSlide );\n\t\t\t}\n\n\t\t\t// Randomize the order of vertical slides (if there are any)\n\t\t\tlet verticalSlides = slide.querySelectorAll( 'section' );\n\t\t\tif( verticalSlides.length ) {\n\t\t\t\tshuffle( verticalSlides );\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates one dimension of slides by showing the slide\n\t * with the specified index.\n\t *\n\t * @param {string} selector A CSS selector that will fetch\n\t * the group of slides we are working with\n\t * @param {number} index The index of the slide that should be\n\t * shown\n\t *\n\t * @return {number} The index of the slide that is now shown,\n\t * might differ from the passed in index if it was out of\n\t * bounds.\n\t */\n\tfunction updateSlides( selector, index ) {\n\n\t\t// Select all slides and convert the NodeList result to\n\t\t// an array\n\t\tlet slides = Util.queryAll( dom.wrapper, selector ),\n\t\t\tslidesLength = slides.length;\n\n\t\tlet printMode = scrollView.isActive() || printView.isActive();\n\t\tlet loopedForwards = false;\n\t\tlet loopedBackwards = false;\n\n\t\tif( slidesLength ) {\n\n\t\t\t// Should the index loop?\n\t\t\tif( config.loop ) {\n\t\t\t\tif( index >= slidesLength ) loopedForwards = true;\n\n\t\t\t\tindex %= slidesLength;\n\n\t\t\t\tif( index < 0 ) {\n\t\t\t\t\tindex = slidesLength + index;\n\t\t\t\t\tloopedBackwards = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Enforce max and minimum index bounds\n\t\t\tindex = Math.max( Math.min( index, slidesLength - 1 ), 0 );\n\n\t\t\tfor( let i = 0; i < slidesLength; i++ ) {\n\t\t\t\tlet element = slides[i];\n\n\t\t\t\tlet reverse = config.rtl && !isVerticalSlide( element );\n\n\t\t\t\t// Avoid .remove() with multiple args for IE11 support\n\t\t\t\telement.classList.remove( 'past' );\n\t\t\t\telement.classList.remove( 'present' );\n\t\t\t\telement.classList.remove( 'future' );\n\n\t\t\t\t// http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute\n\t\t\t\telement.setAttribute( 'hidden', '' );\n\t\t\t\telement.setAttribute( 'aria-hidden', 'true' );\n\n\t\t\t\t// If this element contains vertical slides\n\t\t\t\tif( element.querySelector( 'section' ) ) {\n\t\t\t\t\telement.classList.add( 'stack' );\n\t\t\t\t}\n\n\t\t\t\t// If we're printing static slides, all slides are \"present\"\n\t\t\t\tif( printMode ) {\n\t\t\t\t\telement.classList.add( 'present' );\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif( i < index ) {\n\t\t\t\t\t// Any element previous to index is given the 'past' class\n\t\t\t\t\telement.classList.add( reverse ? 'future' : 'past' );\n\n\t\t\t\t\tif( config.fragments ) {\n\t\t\t\t\t\t// Show all fragments in prior slides\n\t\t\t\t\t\tshowFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( i > index ) {\n\t\t\t\t\t// Any element subsequent to index is given the 'future' class\n\t\t\t\t\telement.classList.add( reverse ? 'past' : 'future' );\n\n\t\t\t\t\tif( config.fragments ) {\n\t\t\t\t\t\t// Hide all fragments in future slides\n\t\t\t\t\t\thideFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Update the visibility of fragments when a presentation loops\n\t\t\t\t// in either direction\n\t\t\t\telse if( i === index && config.fragments ) {\n\t\t\t\t\tif( loopedForwards ) {\n\t\t\t\t\t\thideFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t\telse if( loopedBackwards ) {\n\t\t\t\t\t\tshowFragmentsIn( element );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet slide = slides[index];\n\t\t\tlet wasPresent = slide.classList.contains( 'present' );\n\n\t\t\t// Mark the current slide as present\n\t\t\tslide.classList.add( 'present' );\n\t\t\tslide.removeAttribute( 'hidden' );\n\t\t\tslide.removeAttribute( 'aria-hidden' );\n\n\t\t\tif( !wasPresent ) {\n\t\t\t\t// Dispatch an event indicating the slide is now visible\n\t\t\t\tdispatchEvent({\n\t\t\t\t\ttarget: slide,\n\t\t\t\t\ttype: 'visible',\n\t\t\t\t\tbubbles: false\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// If this slide has a state associated with it, add it\n\t\t\t// onto the current state of the deck\n\t\t\tlet slideState = slide.getAttribute( 'data-state' );\n\t\t\tif( slideState ) {\n\t\t\t\tstate = state.concat( slideState.split( ' ' ) );\n\t\t\t}\n\n\t\t}\n\t\telse {\n\t\t\t// Since there are no slides we can't be anywhere beyond the\n\t\t\t// zeroth index\n\t\t\tindex = 0;\n\t\t}\n\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Shows all fragment elements within the given container.\n\t */\n\tfunction showFragmentsIn( container ) {\n\n\t\tUtil.queryAll( container, '.fragment' ).forEach( fragment => {\n\t\t\tfragment.classList.add( 'visible' );\n\t\t\tfragment.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Hides all fragment elements within the given container.\n\t */\n\tfunction hideFragmentsIn( container ) {\n\n\t\tUtil.queryAll( container, '.fragment.visible' ).forEach( fragment => {\n\t\t\tfragment.classList.remove( 'visible', 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Optimization method; hide all slides that are far away\n\t * from the present slide.\n\t */\n\tfunction updateSlidesVisibility() {\n\n\t\t// Select all slides and convert the NodeList result to\n\t\t// an array\n\t\tlet horizontalSlides = getHorizontalSlides(),\n\t\t\thorizontalSlidesLength = horizontalSlides.length,\n\t\t\tdistanceX,\n\t\t\tdistanceY;\n\n\t\tif( horizontalSlidesLength && typeof indexh !== 'undefined' ) {\n\n\t\t\t// The number of steps away from the present slide that will\n\t\t\t// be visible\n\t\t\tlet viewDistance = overview.isActive() ? 10 : config.viewDistance;\n\n\t\t\t// Shorten the view distance on devices that typically have\n\t\t\t// less resources\n\t\t\tif( Device.isMobile ) {\n\t\t\t\tviewDistance = overview.isActive() ? 6 : config.mobileViewDistance;\n\t\t\t}\n\n\t\t\t// All slides need to be visible when exporting to PDF\n\t\t\tif( printView.isActive() ) {\n\t\t\t\tviewDistance = Number.MAX_VALUE;\n\t\t\t}\n\n\t\t\tfor( let x = 0; x < horizontalSlidesLength; x++ ) {\n\t\t\t\tlet horizontalSlide = horizontalSlides[x];\n\n\t\t\t\tlet verticalSlides = Util.queryAll( horizontalSlide, 'section' ),\n\t\t\t\t\tverticalSlidesLength = verticalSlides.length;\n\n\t\t\t\t// Determine how far away this slide is from the present\n\t\t\t\tdistanceX = Math.abs( ( indexh || 0 ) - x ) || 0;\n\n\t\t\t\t// If the presentation is looped, distance should measure\n\t\t\t\t// 1 between the first and last slides\n\t\t\t\tif( config.loop ) {\n\t\t\t\t\tdistanceX = Math.abs( ( ( indexh || 0 ) - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0;\n\t\t\t\t}\n\n\t\t\t\t// Show the horizontal slide if it's within the view distance\n\t\t\t\tif( distanceX < viewDistance ) {\n\t\t\t\t\tslideContent.load( horizontalSlide );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tslideContent.unload( horizontalSlide );\n\t\t\t\t}\n\n\t\t\t\tif( verticalSlidesLength ) {\n\n\t\t\t\t\tlet oy = getPreviousVerticalIndex( horizontalSlide );\n\n\t\t\t\t\tfor( let y = 0; y < verticalSlidesLength; y++ ) {\n\t\t\t\t\t\tlet verticalSlide = verticalSlides[y];\n\n\t\t\t\t\t\tdistanceY = x === ( indexh || 0 ) ? Math.abs( ( indexv || 0 ) - y ) : Math.abs( y - oy );\n\n\t\t\t\t\t\tif( distanceX + distanceY < viewDistance ) {\n\t\t\t\t\t\t\tslideContent.load( verticalSlide );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tslideContent.unload( verticalSlide );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Flag if there are ANY vertical slides, anywhere in the deck\n\t\t\tif( hasVerticalSlides() ) {\n\t\t\t\tdom.wrapper.classList.add( 'has-vertical-slides' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdom.wrapper.classList.remove( 'has-vertical-slides' );\n\t\t\t}\n\n\t\t\t// Flag if there are ANY horizontal slides, anywhere in the deck\n\t\t\tif( hasHorizontalSlides() ) {\n\t\t\t\tdom.wrapper.classList.add( 'has-horizontal-slides' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdom.wrapper.classList.remove( 'has-horizontal-slides' );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Determine what available routes there are for navigation.\n\t *\n\t * @return {{left: boolean, right: boolean, up: boolean, down: boolean}}\n\t */\n\tfunction availableRoutes({ includeFragments = false } = {}) {\n\n\t\tlet horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ),\n\t\t\tverticalSlides = dom.wrapper.querySelectorAll( VERTICAL_SLIDES_SELECTOR );\n\n\t\tlet routes = {\n\t\t\tleft: indexh > 0,\n\t\t\tright: indexh < horizontalSlides.length - 1,\n\t\t\tup: indexv > 0,\n\t\t\tdown: indexv < verticalSlides.length - 1\n\t\t};\n\n\t\t// Looped presentations can always be navigated as long as\n\t\t// there are slides available\n\t\tif( config.loop ) {\n\t\t\tif( horizontalSlides.length > 1 ) {\n\t\t\t\troutes.left = true;\n\t\t\t\troutes.right = true;\n\t\t\t}\n\n\t\t\tif( verticalSlides.length > 1 ) {\n\t\t\t\troutes.up = true;\n\t\t\t\troutes.down = true;\n\t\t\t}\n\t\t}\n\n\t\tif ( horizontalSlides.length > 1 && config.navigationMode === 'linear' ) {\n\t\t\troutes.right = routes.right || routes.down;\n\t\t\troutes.left = routes.left || routes.up;\n\t\t}\n\n\t\t// If includeFragments is set, a route will be considered\n\t\t// available if either a slid OR fragment is available in\n\t\t// the given direction\n\t\tif( includeFragments === true ) {\n\t\t\tlet fragmentRoutes = fragments.availableRoutes();\n\t\t\troutes.left = routes.left || fragmentRoutes.prev;\n\t\t\troutes.up = routes.up || fragmentRoutes.prev;\n\t\t\troutes.down = routes.down || fragmentRoutes.next;\n\t\t\troutes.right = routes.right || fragmentRoutes.next;\n\t\t}\n\n\t\t// Reverse horizontal controls for rtl\n\t\tif( config.rtl ) {\n\t\t\tlet left = routes.left;\n\t\t\troutes.left = routes.right;\n\t\t\troutes.right = left;\n\t\t}\n\n\t\treturn routes;\n\n\t}\n\n\t/**\n\t * Returns the number of past slides. This can be used as a global\n\t * flattened index for slides.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide we're counting before\n\t *\n\t * @return {number} Past slide count\n\t */\n\tfunction getSlidePastCount( slide = currentSlide ) {\n\n\t\tlet horizontalSlides = getHorizontalSlides();\n\n\t\t// The number of past slides\n\t\tlet pastCount = 0;\n\n\t\t// Step through all slides and count the past ones\n\t\tmainLoop: for( let i = 0; i < horizontalSlides.length; i++ ) {\n\n\t\t\tlet horizontalSlide = horizontalSlides[i];\n\t\t\tlet verticalSlides = horizontalSlide.querySelectorAll( 'section' );\n\n\t\t\tfor( let j = 0; j < verticalSlides.length; j++ ) {\n\n\t\t\t\t// Stop as soon as we arrive at the present\n\t\t\t\tif( verticalSlides[j] === slide ) {\n\t\t\t\t\tbreak mainLoop;\n\t\t\t\t}\n\n\t\t\t\t// Don't count slides with the \"uncounted\" class\n\t\t\t\tif( verticalSlides[j].dataset.visibility !== 'uncounted' ) {\n\t\t\t\t\tpastCount++;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Stop as soon as we arrive at the present\n\t\t\tif( horizontalSlide === slide ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Don't count the wrapping section for vertical slides and\n\t\t\t// slides marked as uncounted\n\t\t\tif( horizontalSlide.classList.contains( 'stack' ) === false && horizontalSlide.dataset.visibility !== 'uncounted' ) {\n\t\t\t\tpastCount++;\n\t\t\t}\n\n\t\t}\n\n\t\treturn pastCount;\n\n\t}\n\n\t/**\n\t * Returns a value ranging from 0-1 that represents\n\t * how far into the presentation we have navigated.\n\t *\n\t * @return {number}\n\t */\n\tfunction getProgress() {\n\n\t\t// The number of past and total slides\n\t\tlet totalCount = getTotalSlides();\n\t\tlet pastCount = getSlidePastCount();\n\n\t\tif( currentSlide ) {\n\n\t\t\tlet allFragments = currentSlide.querySelectorAll( '.fragment' );\n\n\t\t\t// If there are fragments in the current slide those should be\n\t\t\t// accounted for in the progress.\n\t\t\tif( allFragments.length > 0 ) {\n\t\t\t\tlet visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' );\n\n\t\t\t\t// This value represents how big a portion of the slide progress\n\t\t\t\t// that is made up by its fragments (0-1)\n\t\t\t\tlet fragmentWeight = 0.9;\n\n\t\t\t\t// Add fragment progress to the past slide count\n\t\t\t\tpastCount += ( visibleFragments.length / allFragments.length ) * fragmentWeight;\n\t\t\t}\n\n\t\t}\n\n\t\treturn Math.min( pastCount / ( totalCount - 1 ), 1 );\n\n\t}\n\n\t/**\n\t * Retrieves the h/v location and fragment of the current,\n\t * or specified, slide.\n\t *\n\t * @param {HTMLElement} [slide] If specified, the returned\n\t * index will be for this slide rather than the currently\n\t * active one\n\t *\n\t * @return {{h: number, v: number, f: number}}\n\t */\n\tfunction getIndices( slide ) {\n\n\t\t// By default, return the current indices\n\t\tlet h = indexh,\n\t\t\tv = indexv,\n\t\t\tf;\n\n\t\t// If a slide is specified, return the indices of that slide\n\t\tif( slide ) {\n\t\t\t// In scroll mode the original h/x index is stored on the slide\n\t\t\tif( scrollView.isActive() ) {\n\t\t\t\th = parseInt( slide.getAttribute( 'data-index-h' ), 10 );\n\n\t\t\t\tif( slide.getAttribute( 'data-index-v' ) ) {\n\t\t\t\t\tv = parseInt( slide.getAttribute( 'data-index-v' ), 10 );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlet isVertical = isVerticalSlide( slide );\n\t\t\t\tlet slideh = isVertical ? slide.parentNode : slide;\n\n\t\t\t\t// Select all horizontal slides\n\t\t\t\tlet horizontalSlides = getHorizontalSlides();\n\n\t\t\t\t// Now that we know which the horizontal slide is, get its index\n\t\t\t\th = Math.max( horizontalSlides.indexOf( slideh ), 0 );\n\n\t\t\t\t// Assume we're not vertical\n\t\t\t\tv = undefined;\n\n\t\t\t\t// If this is a vertical slide, grab the vertical index\n\t\t\t\tif( isVertical ) {\n\t\t\t\t\tv = Math.max( Util.queryAll( slide.parentNode, 'section' ).indexOf( slide ), 0 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( !slide && currentSlide ) {\n\t\t\tlet hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0;\n\t\t\tif( hasFragments ) {\n\t\t\t\tlet currentFragment = currentSlide.querySelector( '.current-fragment' );\n\t\t\t\tif( currentFragment && currentFragment.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\t\tf = parseInt( currentFragment.getAttribute( 'data-fragment-index' ), 10 );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tf = currentSlide.querySelectorAll( '.fragment.visible' ).length - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { h, v, f };\n\n\t}\n\n\t/**\n\t * Retrieves all slides in this presentation.\n\t */\n\tfunction getSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, SLIDES_SELECTOR + ':not(.stack):not([data-visibility=\"uncounted\"])' );\n\n\t}\n\n\t/**\n\t * Returns a list of all horizontal slides in the deck. Each\n\t * vertical stack is included as one horizontal slide in the\n\t * resulting array.\n\t */\n\tfunction getHorizontalSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR );\n\n\t}\n\n\t/**\n\t * Returns all vertical slides that exist within this deck.\n\t */\n\tfunction getVerticalSlides() {\n\n\t\treturn Util.queryAll( dom.wrapper, '.slides>section>section' );\n\n\t}\n\n\t/**\n\t * Returns all vertical stacks (each stack can contain multiple slides).\n\t */\n\tfunction getVerticalStacks() {\n\n\t\treturn Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.stack');\n\n\t}\n\n\t/**\n\t * Returns true if there are at least two horizontal slides.\n\t */\n\tfunction hasHorizontalSlides() {\n\n\t\treturn getHorizontalSlides().length > 1;\n\t}\n\n\t/**\n\t * Returns true if there are at least two vertical slides.\n\t */\n\tfunction hasVerticalSlides() {\n\n\t\treturn getVerticalSlides().length > 1;\n\n\t}\n\n\t/**\n\t * Returns an array of objects where each object represents the\n\t * attributes on its respective slide.\n\t */\n\tfunction getSlidesAttributes() {\n\n\t\treturn getSlides().map( slide => {\n\n\t\t\tlet attributes = {};\n\t\t\tfor( let i = 0; i < slide.attributes.length; i++ ) {\n\t\t\t\tlet attribute = slide.attributes[ i ];\n\t\t\t\tattributes[ attribute.name ] = attribute.value;\n\t\t\t}\n\t\t\treturn attributes;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Retrieves the total number of slides in this presentation.\n\t *\n\t * @return {number}\n\t */\n\tfunction getTotalSlides() {\n\n\t\treturn getSlides().length;\n\n\t}\n\n\t/**\n\t * Returns the slide element matching the specified index.\n\t *\n\t * @return {HTMLElement}\n\t */\n\tfunction getSlide( x, y ) {\n\n\t\tlet horizontalSlide = getHorizontalSlides()[ x ];\n\t\tlet verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' );\n\n\t\tif( verticalSlides && verticalSlides.length && typeof y === 'number' ) {\n\t\t\treturn verticalSlides ? verticalSlides[ y ] : undefined;\n\t\t}\n\n\t\treturn horizontalSlide;\n\n\t}\n\n\t/**\n\t * Returns the background element for the given slide.\n\t * All slides, even the ones with no background properties\n\t * defined, have a background element so as long as the\n\t * index is valid an element will be returned.\n\t *\n\t * @param {mixed} x Horizontal background index OR a slide\n\t * HTML element\n\t * @param {number} y Vertical background index\n\t * @return {(HTMLElement[]|*)}\n\t */\n\tfunction getSlideBackground( x, y ) {\n\n\t\tlet slide = typeof x === 'number' ? getSlide( x, y ) : x;\n\t\tif( slide ) {\n\t\t\treturn slide.slideBackgroundElement;\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Retrieves the current state of the presentation as\n\t * an object. This state can then be restored at any\n\t * time.\n\t *\n\t * @return {{indexh: number, indexv: number, indexf: number, paused: boolean, overview: boolean}}\n\t */\n\tfunction getState() {\n\n\t\tlet indices = getIndices();\n\n\t\treturn {\n\t\t\tindexh: indices.h,\n\t\t\tindexv: indices.v,\n\t\t\tindexf: indices.f,\n\t\t\tpaused: isPaused(),\n\t\t\toverview: overview.isActive()\n\t\t};\n\n\t}\n\n\t/**\n\t * Restores the presentation to the given state.\n\t *\n\t * @param {object} state As generated by getState()\n\t * @see {@link getState} generates the parameter `state`\n\t */\n\tfunction setState( state ) {\n\n\t\tif( typeof state === 'object' ) {\n\t\t\tslide( Util.deserialize( state.indexh ), Util.deserialize( state.indexv ), Util.deserialize( state.indexf ) );\n\n\t\t\tlet pausedFlag = Util.deserialize( state.paused ),\n\t\t\t\toverviewFlag = Util.deserialize( state.overview );\n\n\t\t\tif( typeof pausedFlag === 'boolean' && pausedFlag !== isPaused() ) {\n\t\t\t\ttogglePause( pausedFlag );\n\t\t\t}\n\n\t\t\tif( typeof overviewFlag === 'boolean' && overviewFlag !== overview.isActive() ) {\n\t\t\t\toverview.toggle( overviewFlag );\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Cues a new automated slide if enabled in the config.\n\t */\n\tfunction cueAutoSlide() {\n\n\t\tcancelAutoSlide();\n\n\t\tif( currentSlide && config.autoSlide !== false ) {\n\n\t\t\tlet fragment = currentSlide.querySelector( '.current-fragment[data-autoslide]' );\n\n\t\t\tlet fragmentAutoSlide = fragment ? fragment.getAttribute( 'data-autoslide' ) : null;\n\t\t\tlet parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null;\n\t\t\tlet slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' );\n\n\t\t\t// Pick value in the following priority order:\n\t\t\t// 1. Current fragment's data-autoslide\n\t\t\t// 2. Current slide's data-autoslide\n\t\t\t// 3. Parent slide's data-autoslide\n\t\t\t// 4. Global autoSlide setting\n\t\t\tif( fragmentAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( fragmentAutoSlide, 10 );\n\t\t\t}\n\t\t\telse if( slideAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( slideAutoSlide, 10 );\n\t\t\t}\n\t\t\telse if( parentAutoSlide ) {\n\t\t\t\tautoSlide = parseInt( parentAutoSlide, 10 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tautoSlide = config.autoSlide;\n\n\t\t\t\t// If there are media elements with data-autoplay,\n\t\t\t\t// automatically set the autoSlide duration to the\n\t\t\t\t// length of that media. Not applicable if the slide\n\t\t\t\t// is divided up into fragments.\n\t\t\t\t// playbackRate is accounted for in the duration.\n\t\t\t\tif( currentSlide.querySelectorAll( '.fragment' ).length === 0 ) {\n\t\t\t\t\tUtil.queryAll( currentSlide, 'video, audio' ).forEach( el => {\n\t\t\t\t\t\tif( el.hasAttribute( 'data-autoplay' ) ) {\n\t\t\t\t\t\t\tif( autoSlide && (el.duration * 1000 / el.playbackRate ) > autoSlide ) {\n\t\t\t\t\t\t\t\tautoSlide = ( el.duration * 1000 / el.playbackRate ) + 1000;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Cue the next auto-slide if:\n\t\t\t// - There is an autoSlide value\n\t\t\t// - Auto-sliding isn't paused by the user\n\t\t\t// - The presentation isn't paused\n\t\t\t// - The overview isn't active\n\t\t\t// - The presentation isn't over\n\t\t\tif( autoSlide && !autoSlidePaused && !isPaused() && !overview.isActive() && ( !isLastSlide() || fragments.availableRoutes().next || config.loop === true ) ) {\n\t\t\t\tautoSlideTimeout = setTimeout( () => {\n\t\t\t\t\tif( typeof config.autoSlideMethod === 'function' ) {\n\t\t\t\t\t\tconfig.autoSlideMethod()\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnavigateNext();\n\t\t\t\t\t}\n\t\t\t\t\tcueAutoSlide();\n\t\t\t\t}, autoSlide );\n\t\t\t\tautoSlideStartTime = Date.now();\n\t\t\t}\n\n\t\t\tif( autoSlidePlayer ) {\n\t\t\t\tautoSlidePlayer.setPlaying( autoSlideTimeout !== -1 );\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Cancels any ongoing request to auto-slide.\n\t */\n\tfunction cancelAutoSlide() {\n\n\t\tclearTimeout( autoSlideTimeout );\n\t\tautoSlideTimeout = -1;\n\n\t}\n\n\tfunction pauseAutoSlide() {\n\n\t\tif( autoSlide && !autoSlidePaused ) {\n\t\t\tautoSlidePaused = true;\n\t\t\tdispatchEvent({ type: 'autoslidepaused' });\n\t\t\tclearTimeout( autoSlideTimeout );\n\n\t\t\tif( autoSlidePlayer ) {\n\t\t\t\tautoSlidePlayer.setPlaying( false );\n\t\t\t}\n\t\t}\n\n\t}\n\n\tfunction resumeAutoSlide() {\n\n\t\tif( autoSlide && autoSlidePaused ) {\n\t\t\tautoSlidePaused = false;\n\t\t\tdispatchEvent({ type: 'autoslideresumed' });\n\t\t\tcueAutoSlide();\n\t\t}\n\n\t}\n\n\tfunction navigateLeft({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\n\t\t// Reverse for RTL\n\t\tif( config.rtl ) {\n\t\t\tif( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().left ) {\n\t\t\t\tslide( indexh + 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t\t}\n\t\t}\n\t\t// Normal navigation\n\t\telse if( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().left ) {\n\t\t\tslide( indexh - 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t}\n\n\t}\n\n\tfunction navigateRight({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\n\t\t// Reverse for RTL\n\t\tif( config.rtl ) {\n\t\t\tif( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().right ) {\n\t\t\t\tslide( indexh - 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t\t}\n\t\t}\n\t\t// Normal navigation\n\t\telse if( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().right ) {\n\t\t\tslide( indexh + 1, config.navigationMode === 'grid' ? indexv : undefined );\n\t\t}\n\n\t}\n\n\tfunction navigateUp({skipFragments=false}={}) {\n\n\t\t// Prioritize hiding fragments\n\t\tif( ( overview.isActive() || skipFragments || fragments.prev() === false ) && availableRoutes().up ) {\n\t\t\tslide( indexh, indexv - 1 );\n\t\t}\n\n\t}\n\n\tfunction navigateDown({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedVertically = true;\n\n\t\t// Prioritize revealing fragments\n\t\tif( ( overview.isActive() || skipFragments || fragments.next() === false ) && availableRoutes().down ) {\n\t\t\tslide( indexh, indexv + 1 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Navigates backwards, prioritized in the following order:\n\t * 1) Previous fragment\n\t * 2) Previous vertical slide\n\t * 3) Previous horizontal slide\n\t */\n\tfunction navigatePrev({skipFragments=false}={}) {\n\n\t\t// Prioritize revealing fragments\n\t\tif( skipFragments || fragments.prev() === false ) {\n\t\t\tif( availableRoutes().up ) {\n\t\t\t\tnavigateUp({skipFragments});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Fetch the previous horizontal slide, if there is one\n\t\t\t\tlet previousSlide;\n\n\t\t\t\tif( config.rtl ) {\n\t\t\t\t\tpreviousSlide = Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.future' ).pop();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tpreviousSlide = Util.queryAll( dom.wrapper, HORIZONTAL_SLIDES_SELECTOR + '.past' ).pop();\n\t\t\t\t}\n\n\t\t\t\t// When going backwards and arriving on a stack we start\n\t\t\t\t// at the bottom of the stack\n\t\t\t\tif( previousSlide && previousSlide.classList.contains( 'stack' ) ) {\n\t\t\t\t\tlet v = ( previousSlide.querySelectorAll( 'section' ).length - 1 ) || undefined;\n\t\t\t\t\tlet h = indexh - 1;\n\t\t\t\t\tslide( h, v );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnavigateLeft({skipFragments});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * The reverse of #navigatePrev().\n\t */\n\tfunction navigateNext({skipFragments=false}={}) {\n\n\t\tnavigationHistory.hasNavigatedHorizontally = true;\n\t\tnavigationHistory.hasNavigatedVertically = true;\n\n\t\t// Prioritize revealing fragments\n\t\tif( skipFragments || fragments.next() === false ) {\n\n\t\t\tlet routes = availableRoutes();\n\n\t\t\t// When looping is enabled `routes.down` is always available\n\t\t\t// so we need a separate check for when we've reached the\n\t\t\t// end of a stack and should move horizontally\n\t\t\tif( routes.down && routes.right && config.loop && isLastVerticalSlide() ) {\n\t\t\t\troutes.down = false;\n\t\t\t}\n\n\t\t\tif( routes.down ) {\n\t\t\t\tnavigateDown({skipFragments});\n\t\t\t}\n\t\t\telse if( config.rtl ) {\n\t\t\t\tnavigateLeft({skipFragments});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnavigateRight({skipFragments});\n\t\t\t}\n\t\t}\n\n\t}\n\n\n\t// --------------------------------------------------------------------//\n\t// ----------------------------- EVENTS -------------------------------//\n\t// --------------------------------------------------------------------//\n\n\t/**\n\t * Called by all event handlers that are based on user\n\t * input.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onUserInput( event ) {\n\n\t\tif( config.autoSlideStoppable ) {\n\t\t\tpauseAutoSlide();\n\t\t}\n\n\t}\n\n\t/**\n\t* Listener for post message events posted to this window.\n\t*/\n\tfunction onPostMessage( event ) {\n\n\t\tlet data = event.data;\n\n\t\t// Make sure we're dealing with JSON\n\t\tif( typeof data === 'string' && data.charAt( 0 ) === '{' && data.charAt( data.length - 1 ) === '}' ) {\n\t\t\tdata = JSON.parse( data );\n\n\t\t\t// Check if the requested method can be found\n\t\t\tif( data.method && typeof Reveal[data.method] === 'function' ) {\n\n\t\t\t\tif( POST_MESSAGE_METHOD_BLACKLIST.test( data.method ) === false ) {\n\n\t\t\t\t\tconst result = Reveal[data.method].apply( Reveal, data.args );\n\n\t\t\t\t\t// Dispatch a postMessage event with the returned value from\n\t\t\t\t\t// our method invocation for getter functions\n\t\t\t\t\tdispatchPostMessage( 'callback', { method: data.method, result: result } );\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconsole.warn( 'reveal.js: \"'+ data.method +'\" is is blacklisted from the postMessage API' );\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Event listener for transition end on the current slide.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onTransitionEnd( event ) {\n\n\t\tif( transition === 'running' && /section/gi.test( event.target.nodeName ) ) {\n\t\t\ttransition = 'idle';\n\t\t\tdispatchEvent({\n\t\t\t\ttype: 'slidetransitionend',\n\t\t\t\tdata: { indexh, indexv, previousSlide, currentSlide }\n\t\t\t});\n\t\t}\n\n\t}\n\n\t/**\n\t * A global listener for all click events inside of the\n\t * .slides container.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onSlidesClicked( event ) {\n\n\t\tconst anchor = Util.closest( event.target, 'a[href^=\"#\"]' );\n\n\t\t// If a hash link is clicked, we find the target slide\n\t\t// and navigate to it. We previously relied on 'hashchange'\n\t\t// for links like these but that prevented media with\n\t\t// audio tracks from playing in mobile browsers since it\n\t\t// wasn't considered a direct interaction with the document.\n\t\tif( anchor ) {\n\t\t\tconst hash = anchor.getAttribute( 'href' );\n\t\t\tconst indices = location.getIndicesFromHash( hash );\n\n\t\t\tif( indices ) {\n\t\t\t\tReveal.slide( indices.h, indices.v, indices.f );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the window level 'resize' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onWindowResize( event ) {\n\n\t\tlayout();\n\n\t}\n\n\t/**\n\t * Handle for the window level 'visibilitychange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onPageVisibilityChange( event ) {\n\n\t\t// If, after clicking a link or similar and we're coming back,\n\t\t// focus the document.body to ensure we can use keyboard shortcuts\n\t\tif( document.hidden === false && document.activeElement !== document.body ) {\n\t\t\t// Not all elements support .blur() - SVGs among them.\n\t\t\tif( typeof document.activeElement.blur === 'function' ) {\n\t\t\t\tdocument.activeElement.blur();\n\t\t\t}\n\t\t\tdocument.body.focus();\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the document level 'fullscreenchange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onFullscreenChange( event ) {\n\n\t\tlet element = document.fullscreenElement || document.webkitFullscreenElement;\n\t\tif( element === dom.wrapper ) {\n\t\t\tevent.stopImmediatePropagation();\n\n\t\t\t// Timeout to avoid layout shift in Safari\n\t\t\tsetTimeout( () => {\n\t\t\t\tReveal.layout();\n\t\t\t\tReveal.focus.focus(); // focus.focus :'(\n\t\t\t}, 1 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Handles clicks on links that are set to preview in the\n\t * iframe overlay.\n\t *\n\t * @param {object} event\n\t */\n\tfunction onPreviewLinkClicked( event ) {\n\n\t\tif( event.currentTarget && event.currentTarget.hasAttribute( 'href' ) ) {\n\t\t\tlet url = event.currentTarget.getAttribute( 'href' );\n\t\t\tif( url ) {\n\t\t\t\tshowPreview( url );\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Handles click on the auto-sliding controls element.\n\t *\n\t * @param {object} [event]\n\t */\n\tfunction onAutoSlidePlayerClick( event ) {\n\n\t\t// Replay\n\t\tif( isLastSlide() && config.loop === false ) {\n\t\t\tslide( 0, 0 );\n\t\t\tresumeAutoSlide();\n\t\t}\n\t\t// Resume\n\t\telse if( autoSlidePaused ) {\n\t\t\tresumeAutoSlide();\n\t\t}\n\t\t// Pause\n\t\telse {\n\t\t\tpauseAutoSlide();\n\t\t}\n\n\t}\n\n\n\t// --------------------------------------------------------------------//\n\t// ------------------------------- API --------------------------------//\n\t// --------------------------------------------------------------------//\n\n\t// The public reveal.js API\n\tconst API = {\n\t\tVERSION,\n\n\t\tinitialize,\n\t\tconfigure,\n\t\tdestroy,\n\n\t\tsync,\n\t\tsyncSlide,\n\t\tsyncFragments: fragments.sync.bind( fragments ),\n\n\t\t// Navigation methods\n\t\tslide,\n\t\tleft: navigateLeft,\n\t\tright: navigateRight,\n\t\tup: navigateUp,\n\t\tdown: navigateDown,\n\t\tprev: navigatePrev,\n\t\tnext: navigateNext,\n\n\t\t// Navigation aliases\n\t\tnavigateLeft, navigateRight, navigateUp, navigateDown, navigatePrev, navigateNext,\n\n\t\t// Fragment methods\n\t\tnavigateFragment: fragments.goto.bind( fragments ),\n\t\tprevFragment: fragments.prev.bind( fragments ),\n\t\tnextFragment: fragments.next.bind( fragments ),\n\n\t\t// Event binding\n\t\ton,\n\t\toff,\n\n\t\t// Legacy event binding methods left in for backwards compatibility\n\t\taddEventListener: on,\n\t\tremoveEventListener: off,\n\n\t\t// Forces an update in slide layout\n\t\tlayout,\n\n\t\t// Randomizes the order of slides\n\t\tshuffle,\n\n\t\t// Returns an object with the available routes as booleans (left/right/top/bottom)\n\t\tavailableRoutes,\n\n\t\t// Returns an object with the available fragments as booleans (prev/next)\n\t\tavailableFragments: fragments.availableRoutes.bind( fragments ),\n\n\t\t// Toggles a help overlay with keyboard shortcuts\n\t\ttoggleHelp,\n\n\t\t// Toggles the overview mode on/off\n\t\ttoggleOverview: overview.toggle.bind( overview ),\n\n\t\t// Toggles the scroll view on/off\n\t\ttoggleScrollView: scrollView.toggle.bind( scrollView ),\n\n\t\t// Toggles the \"black screen\" mode on/off\n\t\ttogglePause,\n\n\t\t// Toggles the auto slide mode on/off\n\t\ttoggleAutoSlide,\n\n\t\t// Toggles visibility of the jump-to-slide UI\n\t\ttoggleJumpToSlide,\n\n\t\t// Slide navigation checks\n\t\tisFirstSlide,\n\t\tisLastSlide,\n\t\tisLastVerticalSlide,\n\t\tisVerticalSlide,\n\t\tisVerticalStack,\n\n\t\t// State checks\n\t\tisPaused,\n\t\tisAutoSliding,\n\t\tisSpeakerNotes: notes.isSpeakerNotesWindow.bind( notes ),\n\t\tisOverview: overview.isActive.bind( overview ),\n\t\tisFocused: focus.isFocused.bind( focus ),\n\n\t\tisScrollView: scrollView.isActive.bind( scrollView ),\n\t\tisPrintView: printView.isActive.bind( printView ),\n\n\t\t// Checks if reveal.js has been loaded and is ready for use\n\t\tisReady: () => ready,\n\n\t\t// Slide preloading\n\t\tloadSlide: slideContent.load.bind( slideContent ),\n\t\tunloadSlide: slideContent.unload.bind( slideContent ),\n\n\t\t// Media playback\n\t\tstartEmbeddedContent: () => slideContent.startEmbeddedContent( currentSlide ),\n\t\tstopEmbeddedContent: () => slideContent.stopEmbeddedContent( currentSlide, { unloadIframes: false } ),\n\n\t\t// Preview management\n\t\tshowPreview,\n\t\thidePreview: closeOverlay,\n\n\t\t// Adds or removes all internal event listeners\n\t\taddEventListeners,\n\t\tremoveEventListeners,\n\t\tdispatchEvent,\n\n\t\t// Facility for persisting and restoring the presentation state\n\t\tgetState,\n\t\tsetState,\n\n\t\t// Presentation progress on range of 0-1\n\t\tgetProgress,\n\n\t\t// Returns the indices of the current, or specified, slide\n\t\tgetIndices,\n\n\t\t// Returns an Array of key:value maps of the attributes of each\n\t\t// slide in the deck\n\t\tgetSlidesAttributes,\n\n\t\t// Returns the number of slides that we have passed\n\t\tgetSlidePastCount,\n\n\t\t// Returns the total number of slides\n\t\tgetTotalSlides,\n\n\t\t// Returns the slide element at the specified index\n\t\tgetSlide,\n\n\t\t// Returns the previous slide element, may be null\n\t\tgetPreviousSlide: () => previousSlide,\n\n\t\t// Returns the current slide element\n\t\tgetCurrentSlide: () => currentSlide,\n\n\t\t// Returns the slide background element at the specified index\n\t\tgetSlideBackground,\n\n\t\t// Returns the speaker notes string for a slide, or null\n\t\tgetSlideNotes: notes.getSlideNotes.bind( notes ),\n\n\t\t// Returns an Array of all slides\n\t\tgetSlides,\n\n\t\t// Returns an array with all horizontal/vertical slides in the deck\n\t\tgetHorizontalSlides,\n\t\tgetVerticalSlides,\n\n\t\t// Checks if the presentation contains two or more horizontal\n\t\t// and vertical slides\n\t\thasHorizontalSlides,\n\t\thasVerticalSlides,\n\n\t\t// Checks if the deck has navigated on either axis at least once\n\t\thasNavigatedHorizontally: () => navigationHistory.hasNavigatedHorizontally,\n\t\thasNavigatedVertically: () => navigationHistory.hasNavigatedVertically,\n\n\t\tshouldAutoAnimateBetween,\n\n\t\t// Adds/removes a custom key binding\n\t\taddKeyBinding: keyboard.addKeyBinding.bind( keyboard ),\n\t\tremoveKeyBinding: keyboard.removeKeyBinding.bind( keyboard ),\n\n\t\t// Programmatically triggers a keyboard event\n\t\ttriggerKey: keyboard.triggerKey.bind( keyboard ),\n\n\t\t// Registers a new shortcut to include in the help overlay\n\t\tregisterKeyboardShortcut: keyboard.registerKeyboardShortcut.bind( keyboard ),\n\n\t\tgetComputedSlideSize,\n\t\tsetCurrentScrollPage,\n\n\t\t// Returns the current scale of the presentation content\n\t\tgetScale: () => scale,\n\n\t\t// Returns the current configuration object\n\t\tgetConfig: () => config,\n\n\t\t// Helper method, retrieves query string as a key:value map\n\t\tgetQueryHash: Util.getQueryHash,\n\n\t\t// Returns the path to the current slide as represented in the URL\n\t\tgetSlidePath: location.getHash.bind( location ),\n\n\t\t// Returns reveal.js DOM elements\n\t\tgetRevealElement: () => revealElement,\n\t\tgetSlidesElement: () => dom.slides,\n\t\tgetViewportElement: () => dom.viewport,\n\t\tgetBackgroundsElement: () => backgrounds.element,\n\n\t\t// API for registering and retrieving plugins\n\t\tregisterPlugin: plugins.registerPlugin.bind( plugins ),\n\t\thasPlugin: plugins.hasPlugin.bind( plugins ),\n\t\tgetPlugin: plugins.getPlugin.bind( plugins ),\n\t\tgetPlugins: plugins.getRegisteredPlugins.bind( plugins )\n\n\t};\n\n\t// Our internal API which controllers have access to\n\tUtil.extend( Reveal, {\n\t\t...API,\n\n\t\t// Methods for announcing content to screen readers\n\t\tannounceStatus,\n\t\tgetStatusText,\n\n\t\t// Controllers\n\t\tfocus,\n\t\tscroll: scrollView,\n\t\tprogress,\n\t\tcontrols,\n\t\tlocation,\n\t\toverview,\n\t\tfragments,\n\t\tbackgrounds,\n\t\tslideContent,\n\t\tslideNumber,\n\n\t\tonUserInput,\n\t\tcloseOverlay,\n\t\tupdateSlidesVisibility,\n\t\tlayoutSlideContents,\n\t\ttransformSlides,\n\t\tcueAutoSlide,\n\t\tcancelAutoSlide\n\t} );\n\n\treturn API;\n\n};\n","import Deck, { VERSION } from './reveal.js'\n\n/**\n * Expose the Reveal class to the window. To create a\n * new instance:\n * let deck = new Reveal( document.querySelector( '.reveal' ), {\n * controls: false\n * } );\n * deck.initialize().then(() => {\n * // reveal.js is ready\n * });\n */\nlet Reveal = Deck;\n\n\n/**\n * The below is a thin shell that mimics the pre 4.0\n * reveal.js API and ensures backwards compatibility.\n * This API only allows for one Reveal instance per\n * page, whereas the new API above lets you run many\n * presentations on the same page.\n *\n * Reveal.initialize( { controls: false } ).then(() => {\n * // reveal.js is ready\n * });\n */\n\nlet enqueuedAPICalls = [];\n\nReveal.initialize = options => {\n\n\t// Create our singleton reveal.js instance\n\tObject.assign( Reveal, new Deck( document.querySelector( '.reveal' ), options ) );\n\n\t// Invoke any enqueued API calls\n\tenqueuedAPICalls.map( method => method( Reveal ) );\n\n\treturn Reveal.initialize();\n\n}\n\n/**\n * The pre 4.0 API let you add event listener before\n * initializing. We maintain the same behavior by\n * queuing up premature API calls and invoking all\n * of them when Reveal.initialize is called.\n */\n[ 'configure', 'on', 'off', 'addEventListener', 'removeEventListener', 'registerPlugin' ].forEach( method => {\n\tReveal[method] = ( ...args ) => {\n\t\tenqueuedAPICalls.push( deck => deck[method].call( null, ...args ) );\n\t}\n} );\n\nReveal.isReady = () => false;\n\nReveal.VERSION = VERSION;\n\nexport default Reveal;"],"names":["Playback","constructor","container","progressCheck","this","diameter","diameter2","thickness","playing","progress","progressOffset","canvas","document","createElement","className","width","height","style","context","getContext","appendChild","render","setPlaying","value","wasPlaying","animate","progressBefore","requestAnimationFrame","bind","radius","x","y","iconSize","endAngle","Math","PI","startAngle","save","clearRect","beginPath","arc","fillStyle","fill","lineWidth","strokeStyle","stroke","translate","fillRect","moveTo","lineTo","restore","on","type","listener","addEventListener","off","removeEventListener","destroy","parentNode","removeChild","defaultConfig","margin","minScale","maxScale","controls","controlsTutorial","controlsLayout","controlsBackArrows","slideNumber","showSlideNumber","hashOneBasedIndex","hash","respondToHashChanges","jumpToSlide","history","keyboard","keyboardCondition","disableLayout","overview","center","touch","loop","rtl","navigationMode","shuffle","fragments","fragmentInURL","embedded","help","pause","showNotes","showHiddenSlides","autoPlayMedia","preloadIframes","autoAnimate","autoAnimateMatcher","autoAnimateEasing","autoAnimateDuration","autoAnimateUnmatched","autoAnimateStyles","autoSlide","autoSlideStoppable","autoSlideMethod","defaultTiming","mouseWheel","previewLinks","postMessage","postMessageEvents","focusBodyOnPageVisibilityChange","transition","transitionSpeed","backgroundTransition","parallaxBackgroundImage","parallaxBackgroundSize","parallaxBackgroundRepeat","parallaxBackgroundPosition","parallaxBackgroundHorizontal","parallaxBackgroundVertical","view","scrollLayout","scrollSnap","scrollProgress","scrollActivationWidth","pdfMaxPagesPerSlide","Number","POSITIVE_INFINITY","pdfSeparateFragments","pdfPageHeightOffset","viewDistance","mobileViewDistance","display","hideInactiveCursor","hideCursorTime","sortFragmentsOnSync","dependencies","plugins","extend","a","b","i","queryAll","el","selector","Array","from","querySelectorAll","toggleClass","classList","add","remove","deserialize","match","parseFloat","transformElement","element","transform","matches","target","matchesMethod","matchesSelector","msMatchesSelector","call","closest","createStyleSheet","tag","length","styleSheet","cssText","createTextNode","head","getQueryHash","query","location","search","replace","split","shift","pop","unescape","fileExtensionToMimeMap","mp4","m4a","ogv","mpeg","webm","SLIDES_SELECTOR","HORIZONTAL_SLIDES_SELECTOR","VERTICAL_SLIDES_SELECTOR","POST_MESSAGE_METHOD_BLACKLIST","FRAGMENT_STYLE_REGEX","autoAnimateCounter","AutoAnimate","Reveal","run","fromSlide","toSlide","reset","allSlides","getSlides","toSlideIndex","indexOf","fromSlideIndex","hasAttribute","getAttribute","autoAnimateStyleSheet","animationOptions","getAutoAnimateOptions","dataset","slideDirection","fromSlideIsHidden","getConfig","css","getAutoAnimatableElements","map","elements","autoAnimateElements","to","options","defaultUnmatchedDuration","duration","defaultUnmatchedDelay","getUnmatchedAutoAnimateElements","forEach","unmatchedElement","unmatchedOptions","id","delay","push","autoAnimateTarget","innerHTML","join","getComputedStyle","fontWeight","dispatchEvent","data","sheet","getRevealElement","elementOptions","easing","fromProps","getAutoAnimatableProperties","toProps","contains","styles","scale","presentationScale","getScale","delta","scaleX","scaleY","round","propertyName","toValue","fromValue","explicitValue","toStyleProperties","Object","keys","inheritedOptions","autoAnimatedParent","autoAnimateDelay","direction","config","properties","bounds","measure","getBoundingClientRect","offsetLeft","offsetTop","offsetWidth","offsetHeight","computedStyles","property","isNaN","pairs","getAutoAnimatePairs","reserved","filter","pair","index","textNodes","findAutoAnimateMatches","node","nodeName","innerText","textContent","getLocalBoundingBox","fromScope","toScope","serializer","fromMatches","toMatches","slice","key","fromElement","primaryIndex","secondaryIndex","rootElement","children","reduce","result","containsAnimatedElements","querySelector","concat","colorToRgb","color","hex3","r","parseInt","charAt","g","hex6","rgb","rgba","Backgrounds","create","getHorizontalSlides","slideh","backgroundStack","createBackground","slidev","backgroundImage","backgroundSize","backgroundRepeat","backgroundPosition","setTimeout","slide","contentElement","slideBackgroundElement","slideBackgroundContentElement","sync","background","backgroundVideo","backgroundIframe","backgroundColor","backgroundGradient","backgroundOpacity","dataPreload","removeAttribute","opacity","test","setAttribute","contrastClass","getContrastClass","contrastColor","computedBackgroundStyle","window","bubbleSlideContrastClassToElement","classToBubble","update","includeAll","currentSlide","getCurrentSlide","indices","getIndices","currentBackground","horizontalPast","horizontalFuture","childNodes","backgroundh","h","backgroundv","v","indexv","previousBackground","slideContent","stopEmbeddedContent","unloadIframes","shouldPreload","startEmbeddedContent","currentBackgroundContent","backgroundImageURL","previousBackgroundHash","currentBackgroundHash","updateParallax","backgroundWidth","backgroundHeight","horizontalSlides","verticalSlides","getVerticalSlides","horizontalOffsetMultiplier","horizontalOffset","slideWidth","horizontalSlideCount","verticalOffsetMultiplier","verticalOffset","slideHeight","verticalSlideCount","UA","navigator","userAgent","isMobile","platform","maxTouchPoints","isAndroid","Controls","onNavigateLeftClicked","onNavigateRightClicked","onNavigateUpClicked","onNavigateDownClicked","onNavigatePrevClicked","onNavigateNextClicked","revealElement","controlsLeft","controlsRight","controlsUp","controlsDown","controlsPrev","controlsNext","controlsRightArrow","controlsLeftArrow","controlsDownArrow","configure","oldConfig","pointerEvents","eventName","unbind","routes","availableRoutes","left","right","up","down","fragmentsRoutes","prev","next","isVerticalSlide","hasNavigatedVertically","hasNavigatedHorizontally","event","preventDefault","onUserInput","STATE_FOCUS","STATE_BLUR","Focus","onRevealPointerDown","onDocumentPointerDown","blur","focus","state","isFocused","Fragments","disable","enable","getSlidesElement","hiddenFragments","sort","grouped","ordered","unordered","sorted","fragment","group","sortAll","horizontalSlide","verticalSlide","changedFragments","shown","hidden","maxIndex","currentFragment","max","wasVisible","announceStatus","getStatusText","bubbles","min","goto","offset","lastVisibleFragment","writeURL","JumpToSlide","onInput","onBlur","onKeyDown","jumpInput","placeholder","show","indicesOnShow","hide","isVisible","clearTimeout","jumpTimeout","jump","trim","slideNumberFormat","getIndicesFromHash","oneBasedIndex","f","jumpAfter","regex","RegExp","find","cancel","confirm","keyCode","stopImmediatePropagation","Keyboard","shortcuts","bindings","onDocumentKeyDown","addKeyBinding","binding","callback","description","removeKeyBinding","triggerKey","registerKeyboardShortcut","getShortcuts","getBindings","autoSlideWasPaused","isAutoSliding","activeElementIsCE","activeElement","isContentEditable","activeElementIsInput","tagName","activeElementIsNotes","unusedModifier","shiftKey","altKey","ctrlKey","metaKey","resumeKeyCodes","isPaused","useLinearMode","hasHorizontalSlides","hasVerticalSlides","triggered","apply","action","skipFragments","isActive","undefined","MAX_VALUE","deactivate","includes","togglePause","requestMethod","documentElement","requestFullscreen","webkitRequestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","enterFullscreen","getViewportElement","toggleAutoSlide","toggleJumpToSlide","toggleHelp","closeOverlay","toggle","cueAutoSlide","Location","MAX_REPLACE_STATE_FREQUENCY","writeURLTimeout","replaceStateTimestamp","onWindowHashChange","name","bits","hashIndexBase","getElementById","decodeURIComponent","error","readURL","currentIndices","newIndices","getHash","debouncedReplaceState","pathname","replaceState","url","Date","now","replaceStateTimeout","s","encodeURIComponent","Notes","isScrollView","isPrintView","getSlideNotes","updateVisibility","hasNotes","isSpeakerNotesWindow","notesElements","notesElement","Overview","active","onSlideClicked","activate","cancelAutoSlide","getBackgroundsElement","slideSize","getComputedSlideSize","overviewSlideWidth","overviewSlideHeight","updateSlidesVisibility","layout","indexh","hslide","vslide","hbackground","vbackground","vmin","innerWidth","innerHeight","transformSlides","override","loadScript","script","async","defer","src","onload","onreadystatechange","readyState","onerror","err","Error","insertBefore","lastChild","Plugins","reveal","registeredPlugins","asyncDependencies","load","registerPlugin","Promise","resolve","scripts","scriptsToLoad","condition","scriptLoadedCallback","initPlugins","then","console","warn","pluginValues","values","pluginsToInitialize","loadAsync","initNextPlugin","afterPlugInitialized","plugin","init","promise","arguments","hasPlugin","getPlugin","getRegisteredPlugins","Pointer","lastMouseWheelStep","cursorHidden","cursorInactiveTimeout","onDocumentCursorActive","onDocumentMouseScroll","showCursor","cursor","hideCursor","detail","wheelDelta","PrintView","slides","injectPageNumbers","pageWidth","floor","pageHeight","body","viewportElement","presentationBackground","viewportStyles","layoutSlideContents","slideScrollHeights","scrollHeight","pages","pageContainer","top","contentHeight","numberOfPages","ceil","page","notes","notesSpacing","notesLayout","bottom","numberElement","fragmentGroups","previousFragmentStep","clonedPage","cloneNode","fragmentNumber","Progress","onProgressClicked","bar","getProgress","getTotalSlides","getMaxWidth","slidesTotal","slideIndex","clientX","targetIndices","ScrollView","activatedCallbacks","onScroll","stateBeforeActivation","getState","slideHTMLBeforeActivation","pageElements","previousSlide","createPageElement","contentContainer","shouldAutoAnimateBetween","stickyContainer","isVerticalStack","createProgressBar","stack","setState","restoreScrollPosition","passive","stateBeforeDeactivation","removeProgressBar","progressBar","progressBarInner","progressBarPlayhead","firstChild","handleDocumentMouseMove","clientY","progressBarHeight","scrollTop","handleDocumentMouseUp","draggingProgressBar","showProgressBar","syncPages","syncScrollPosition","useCompactLayout","viewportHeight","compactHeight","scrollTriggerHeight","setProperty","scrollSnapType","slideTriggers","pageElement","createPage","slideElement","stickyElement","backgroundElement","autoAnimatePages","activatePage","deactivatePage","createFragmentTriggersForPage","createAutoAnimateTriggersForPage","totalScrollTriggerCount","scrollTriggers","total","triggerStick","scrollSnapAlign","marginTop","removeProperty","scrollPadding","totalHeight","position","setTriggerRanges","syncProgressBar","trigger","rangeStart","range","scrollTriggerSegmentSize","scrollTrigger","autoAnimateElement","autoAnimatePage","viewportHeightFactor","playheadHeight","progressBarScrollableHeight","progressSegmentHeight","spacing","slideTrigger","progressBarSlide","scrollTriggerElements","triggerElement","scrollProgressMid","activePage","loaded","unload","activateTrigger","deactivateTrigger","setProgressBarValue","getAllPages","hideProgressBarTimeout","scrollToSlide","getScrollTriggerBySlide","storeScrollPosition","storeScrollPositionTimeout","sessionStorage","setItem","origin","scrollPosition","getItem","scrollOrigin","setCurrentScrollPage","backgrounds","sibling","getSlideByIndices","flatMap","e","t","o","l","u","cancelAnimationFrame","dirty","c","styleComputed","m","p","d","S","availableWidth","clientWidth","currentWidth","scrollWidth","previousFontSize","currentFontSize","minSize","maxSize","whiteSpace","multiLine","n","getPropertyValue","preStyleTestCompleted","fontSize","CustomEvent","oldValue","newValue","scaleFactor","w","observeMutations","observer","disconnect","originalStyle","z","F","MutationObserver","observe","subtree","childList","characterData","W","E","observeWindowDelay","M","defineProperty","set","observeWindow","fitAll","C","assign","newbie","fit","unfreeze","freeze","unsubscribe","SlideContent","startEmbeddedIframe","preload","media","sources","source","backgroundContent","backgroundVideoLoop","backgroundVideoMuted","encodeRFC3986URI","encodeURI","charCodeAt","toString","toUpperCase","decodeURI","isSpeakerNotes","video","muted","getMimeTypeFromFile","filename","excludeIframes","iframe","maxHeight","maxWidth","backgroundIframeElement","scopeElement","fitty","getSlideBackground","formatEmbeddedContent","_appendParamToIframeSource","sourceAttribute","sourceURL","param","autoplay","play","startEmbeddedMedia","catch","isAttachedToDOM","currentTime","contentWindow","SlideNumber","slideNumberDisplay","getSlideNumber","format","visibility","getSlidePastCount","sep","formatNumber","delimiter","Touch","touchStartX","touchStartY","touchStartCount","touchCaptured","onPointerDown","onPointerMove","onPointerUp","onTouchStart","onTouchMove","onTouchEnd","msPointerEnabled","isSwipePrevented","touches","currentX","currentY","includeFragments","deltaX","deltaY","abs","pointerType","MSPOINTER_TYPE_TOUCH","VERSION","Deck","autoSlidePlayer","ready","navigationHistory","slidesTransform","dom","autoSlideTimeout","autoSlideStartTime","autoSlidePaused","scrollView","printView","pointer","start","Util","wrapper","parent","childElementCount","Device","pauseOverlay","createSingletonNode","tagname","classname","nodes","testNode","statusElement","overflow","clip","createStatusElement","setupDOM","onPostMessage","setInterval","scrollLeft","onFullscreenChange","activatePrintView","activateScrollView","removeEventListeners","viewport","activateInitialView","text","nodeType","isAriaHidden","isDisplayHidden","child","isReady","numberOfSlides","resume","enablePreviewLinks","disablePreviewLinks","onAutoSlidePlayerClick","addEventListeners","onWindowResize","onSlidesClicked","onTransitionEnd","onPageVisibilityChange","useCapture","transforms","createEvent","initEvent","dispatchPostMessage","dispatchSlideChanged","self","message","namespace","JSON","stringify","onPreviewLinkClicked","showPreview","overlay","showHelp","html","viewportWidth","size","oldScale","presentationWidth","presentationHeight","zoom","len","remainingHeight","getRemainingHeight","newHeight","oldHeight","nw","naturalWidth","videoWidth","nh","naturalHeight","videoHeight","es","setPreviousVerticalIndex","getPreviousVerticalIndex","attributeName","isLastVerticalSlide","nextElementSibling","isFirstSlide","isLastSlide","wasPaused","defaultPrevented","stateBefore","indexhBefore","indexvBefore","updateSlides","slideChanged","currentHorizontalSlide","currentVerticalSlides","autoAnimateTransition","stateLoop","j","splice","beforeSlide","random","slidesLength","printMode","loopedForwards","loopedBackwards","reverse","showFragmentsIn","hideFragmentsIn","wasPresent","slideState","distanceX","distanceY","horizontalSlidesLength","verticalSlidesLength","oy","fragmentRoutes","pastCount","mainLoop","isVertical","getSlide","indexf","paused","fragmentAutoSlide","parentAutoSlide","slideAutoSlide","playbackRate","navigateNext","pauseAutoSlide","resumeAutoSlide","navigateLeft","navigateRight","navigateUp","navigateDown","navigatePrev","parse","method","args","anchor","fullscreenElement","webkitFullscreenElement","currentTarget","API","initialize","initOptions","setViewport","syncSlide","syncFragments","navigateFragment","prevFragment","nextFragment","availableFragments","toggleOverview","toggleScrollView","isOverview","loadSlide","unloadSlide","hidePreview","pausedFlag","overviewFlag","totalCount","allFragments","fragmentWeight","getSlidesAttributes","attributes","attribute","getPreviousSlide","getSlidePath","getPlugins","scroll","enqueuedAPICalls","deck"],"mappings":"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","x_google_ignoreList":[22]}