diff options
31 files changed, 1777 insertions, 162 deletions
diff --git a/Gruntfile.js b/Gruntfile.js index 4df3181..7d984c6 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,6 +1,6 @@ /* global module:false */ module.exports = function(grunt) { - + var port = grunt.option('port') || 8000; // Project configuration grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), @@ -15,7 +15,6 @@ module.exports = function(grunt) { ' */' }, - // Tests will be added soon qunit: { files: [ 'test/*.html' ] }, @@ -48,7 +47,8 @@ module.exports = function(grunt) { 'css/theme/simple.css': 'css/theme/source/simple.scss', 'css/theme/sky.css': 'css/theme/source/sky.scss', 'css/theme/moon.css': 'css/theme/source/moon.scss', - 'css/theme/solarized.css': 'css/theme/source/solarized.scss' + 'css/theme/solarized.css': 'css/theme/source/solarized.scss', + 'css/theme/blood.css': 'css/theme/source/blood.scss' } } }, @@ -78,7 +78,7 @@ module.exports = function(grunt) { connect: { server: { options: { - port: 8000, + port: port, base: '.' } } @@ -11,7 +11,7 @@ reveal.js comes with a broad range of features including [nested slides](https:/ - [Examples](https://github.com/hakimel/reveal.js/wiki/Example-Presentations): Presentations created with reveal.js, add your own! - [Browser Support](https://github.com/hakimel/reveal.js/wiki/Browser-Support): Explanation of browser support and fallbacks. -## Slides +## Online Editor Presentations are written using HTML or markdown but there's also an online editor for those of you who prefer a graphical interface. Give it a try at [http://slid.es](http://slid.es). @@ -58,6 +58,33 @@ You can write your content as a separate file and have reveal.js load it at runt <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n" data-notes="^Note:" data-charset="iso-8859-15"></section> ``` +#### Element Attributes + +Special syntax is available for adding attributes to Markdown elements. This is useful for fragments, amongst other things. + +```html +<section data-markdown> + <script type="text/template"> + - Item 1 {.class="fragment" data-fragment-index="2"} + - Item 2 {.class="fragment" data-fragment-index="1"} + </script> +</section> +``` + +### Slide Attributes + +Special syntax is available for adding attributes to the slide `<section>` elements generated by your Markdown. + +```html +<section data-markdown> + <script type="text/template"> + <!-- slide-attributes: data-background="#ff0000" --> + Mardown content + </script> +</section> +``` + + ### Configuration At the end of your page you need to initialize reveal by running the following code. Note that all config values are optional and will default as specified below. @@ -71,43 +98,72 @@ Reveal.initialize({ // Display a presentation progress bar progress: true, + // Display the page number of the current slide + slideNumber: false, + // Push each slide change to the browser history history: false, // Enable keyboard shortcuts for navigation keyboard: true, - // Enable touch events for navigation - touch: true, - // Enable the slide overview mode overview: true, // Vertical centering of slides center: true, + // Enables touch navigation on devices with touch input + touch: true, + // Loop the presentation loop: false, // Change the presentation direction to be RTL rtl: false, + // Turns fragments on and off globally + fragments: true, + + // Flags if the presentation is running in an embedded mode, + // i.e. contained within a limited portion of the screen + embedded: false, + // Number of milliseconds between automatically proceeding to the // next slide, disabled when set to 0, this value can be overwritten // by using a data-autoslide attribute on your slides autoSlide: 0, + // Stop auto-sliding after user input + autoSlideStoppable: true, + // Enable slide navigation via mouse wheel mouseWheel: false, + // Hides the address bar on mobile devices + hideAddressBar: true, + + // Opens links in an iframe preview overlay + previewLinks: false, + // Transition style transition: 'default', // default/cube/page/concave/zoom/linear/fade/none // Transition speed transitionSpeed: 'default', // default/fast/slow - // Transition style for full page backgrounds - backgroundTransition: 'default' // default/linear/none + // Transition style for full page slide backgrounds + backgroundTransition: 'default', // default/none/slide/concave/convex/zoom + + // Number of slides away from the current that are visible + viewDistance: 3, + + // Parallax background image + parallaxBackgroundImage: '', // e.g. "'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg'" + + // Parallax background size + parallaxBackgroundSize: '' // CSS syntax, e.g. "2100px 900px" + }); ``` @@ -192,6 +248,27 @@ Reveal.initialize({ }); ``` + +### Auto-sliding + +Presentations can be configure to progress through slides automatically, without any user input. To enable this you will need to tell the framework how many milliseconds it should wait between slides: + +```javascript +// Slide every five seconds +Reveal.configure({ + autoSlide: 5000 +}); +``` + +When this is turned on a control element will appear that enables users to pause and resume auto-sliding. Sliding is also paused automatically as soon as the user starts navigating. You can disable these controls by specifying ```autoSlideStoppable: false``` in your reveal.js config. + +You can also override the slide duration for individual slides by using the ```data-autoslide``` attribute on individual sections: + +```html +<section data-autoslide="10000">This will remain on screen for 10 seconds</section> +``` + + ### Keyboard Bindings If you're unhappy with any of the default keyboard bindings you can override them using the ```keyboard``` config option: @@ -292,6 +369,29 @@ Slides are contained within a limited portion of the screen by default to allow Backgrounds transition using a fade animation by default. This can be changed to a linear sliding transition by passing ```backgroundTransition: 'slide'``` to the ```Reveal.initialize()``` call. Alternatively you can set ```data-background-transition``` on any section with a background to override that specific transition. +### Parallax Background + +If you want to use a parallax scrolling background, set the two following config properties when initializing reveal.js (the third one is optional). + +```javascript +Reveal.initialize({ + + // Parallax background image + parallaxBackgroundImage: '', // e.g. "https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "2100px 900px" - currently only pixels are supported (don't use % or auto) + + // This slide transition gives best results: + transition: linear + +}); +``` + +Make sure that the background size is much bigger than screen size to allow for some scrolling. + + + ### Slide Transitions The global presentation transition is set using the ```transition``` config value. You can override the global transition for a specific slide by using the ```data-transition``` attribute: @@ -330,7 +430,7 @@ You can also add relative navigation links, similar to the built in reveal.js co ### Fragments -Fragments are used to highlight individual elements on a slide. Every element with the class ```fragment``` will be stepped through before moving on to the next slide. Here's an example: http://lab.hakim.se/reveal-js/#/16 +Fragments are used to highlight individual elements on a slide. Every element with the class ```fragment``` will be stepped through before moving on to the next slide. Here's an example: http://lab.hakim.se/reveal-js/#/fragments The default fragment style is to start out invisible and fade in. This style can be changed by appending a different class to the fragment: @@ -424,6 +524,8 @@ Add `data-autoplay` to your media element if you want it to automatically start <video data-autoplay src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video> ``` +Additionally the framework automatically pushes two [post messages](https://developer.mozilla.org/en-US/docs/Web/API/Window.postMessage) to all iframes, ```slide:start``` when the slide containing the iframe is made visible and ```slide:stop``` when it is hidden. + ### Stretching elements Sometimes it's desirable to have an element, like an image or video, stretch to consume as much space as possible within a given slide. This can be done by adding the ```.stretch``` class to an element as seen below: @@ -464,6 +566,7 @@ The framework comes with a few different themes included: - night: Black background, thick white text, orange links - serif: Cappuccino background, gray text, brown links - simple: White background, black text, blue links +- solarized: Cream-colored background, dark green text, blue links Each theme is available as a separate stylesheet. To change theme you will need to replace **default** below with your desired theme name in index.html: @@ -757,27 +860,29 @@ Some reveal.js features, like external markdown, require that presentations run 2. Install [Grunt](http://gruntjs.com/getting-started#installing-the-cli) 4. Clone the reveal.js repository -``` -$ git clone git@github.com:hakimel/reveal.js.git +```sh +$ git clone https://github.com/hakimel/reveal.js.git ``` 5. Navigate to the reveal.js folder -``` +```sh $ cd reveal.js ``` 6. Install dependencies -``` +```sh $ npm install ``` 7. Serve the presentation and monitor source files for changes -``` +```sh $ grunt serve ``` 8. Open <http://localhost:8000> to view your presentation +You can change the port by using `grunt serve --port 8001`. + ### Folder Structure - **css/** Core styles without which the project does not function @@ -786,6 +891,22 @@ $ grunt serve - **lib/** All other third party assets (JavaScript, CSS, fonts) +### Contributing + +Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**. If you are reporting a bug make sure to include information about which browser and operating system you are using as well as the necessary steps to reproduce the issue. + +If you have personal support questions use [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js). + + +#### Pull requests + +- Should follow the coding style of the file you work in, most importantly: + - Tabs to indent + - Single-quoted strings +- Should be made towards the **dev branch** +- Should be submitted from a feature/topic branch (not your master) +- Should not include the minified **reveal.min.js** file + ## License diff --git a/css/reveal.css b/css/reveal.css index ef611ed..96a3a2b 100644 --- a/css/reveal.css +++ b/css/reveal.css @@ -334,7 +334,7 @@ body { } .reveal table th { - text-shadow: rgb(255,255,255) 1px 1px 2px; + font-weight: bold; } .reveal sup { @@ -476,6 +476,19 @@ body { transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); } +/********************************************* + * SLIDE NUMBER + *********************************************/ + +.reveal .slide-number { + position: fixed; + display: block; + right: 15px; + bottom: 15px; + opacity: 0.5; + z-index: 31; + font-size: 12px; +} /********************************************* * SLIDES @@ -517,6 +530,10 @@ body { perspective-origin: 0px -100px; } +.reveal .slides>section { + -ms-perspective: 600px; +} + .reveal .slides>section, .reveal .slides>section>section { display: none; @@ -526,7 +543,7 @@ body { z-index: 10; line-height: 1.2em; - font-weight: normal; + font-weight: inherit; -webkit-transform-style: preserve-3d; -moz-transform-style: preserve-3d; @@ -707,6 +724,15 @@ body { * ZOOM TRANSITION *********************************************/ +.reveal .slides>section[data-transition=zoom], +.reveal.zoom .slides>section { + -webkit-transition-timing-function: ease; + -moz-transition-timing-function: ease; + -ms-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} + .reveal .slides>section[data-transition=zoom].past, .reveal.zoom .slides>section.past { opacity: 0; @@ -1264,6 +1290,11 @@ body { position: absolute; width: 100%; height: 100%; + + -webkit-perspective: 600px; + -moz-perspective: 600px; + -ms-perspective: 600px; + perspective: 600px; } .reveal .slide-background { position: absolute; @@ -1277,11 +1308,11 @@ body { background-repeat: no-repeat; background-size: cover; - -webkit-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - -moz-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - -ms-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - -o-transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - transition: all 600ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -webkit-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -ms-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -o-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); } .reveal .slide-background.present { opacity: 1; @@ -1303,7 +1334,7 @@ body { transition: none; } -/* Linear sliding transition style */ +/* 2D slide */ .reveal[data-background-transition=slide]>.backgrounds .slide-background, .reveal>.backgrounds .slide-background[data-background-transition=slide] { opacity: 1; @@ -1312,12 +1343,6 @@ body { -moz-backface-visibility: hidden; -ms-backface-visibility: hidden; backface-visibility: hidden; - - -webkit-transition-duration: 800ms; - -moz-transition-duration: 800ms; - -ms-transition-duration: 800ms; - -o-transition-duration: 800ms; - transition-duration: 800ms; } .reveal[data-background-transition=slide]>.backgrounds .slide-background.past, .reveal>.backgrounds .slide-background.past[data-background-transition=slide] { @@ -1354,6 +1379,142 @@ body { } +/* Convex */ +.reveal[data-background-transition=convex]>.backgrounds .slide-background.past, +.reveal>.backgrounds .slide-background.past[data-background-transition=convex] { + opacity: 0; + + -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); +} +.reveal[data-background-transition=convex]>.backgrounds .slide-background.future, +.reveal>.backgrounds .slide-background.future[data-background-transition=convex] { + opacity: 0; + + -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + -moz-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); +} + +.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past, +.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex] { + opacity: 0; + + -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); + -moz-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); + -ms-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); +} +.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future, +.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex] { + opacity: 0; + + -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); + -moz-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); +} + + +/* Concave */ +.reveal[data-background-transition=concave]>.backgrounds .slide-background.past, +.reveal>.backgrounds .slide-background.past[data-background-transition=concave] { + opacity: 0; + + -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); + -moz-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); + -ms-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); +} +.reveal[data-background-transition=concave]>.backgrounds .slide-background.future, +.reveal>.backgrounds .slide-background.future[data-background-transition=concave] { + opacity: 0; + + -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); + -moz-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); + -ms-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); +} + +.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past, +.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave] { + opacity: 0; + + -webkit-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); + -moz-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); + -ms-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); +} +.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future, +.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave] { + opacity: 0; + + -webkit-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); + -moz-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); +} + +/* Zoom */ +.reveal[data-background-transition=zoom]>.backgrounds .slide-background, +.reveal>.backgrounds .slide-background[data-background-transition=zoom] { + -webkit-transition-timing-function: ease; + -moz-transition-timing-function: ease; + -ms-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; +} + +.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past, +.reveal>.backgrounds .slide-background.past[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + + -webkit-transform: scale(16); + -moz-transform: scale(16); + -ms-transform: scale(16); + -o-transform: scale(16); + transform: scale(16); +} +.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future, +.reveal>.backgrounds .slide-background.future[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + + -webkit-transform: scale(0.2); + -moz-transform: scale(0.2); + -ms-transform: scale(0.2); + -o-transform: scale(0.2); + transform: scale(0.2); +} + +.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past, +.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + + -webkit-transform: scale(16); + -moz-transform: scale(16); + -ms-transform: scale(16); + -o-transform: scale(16); + transform: scale(16); +} +.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future, +.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + + -webkit-transform: scale(0.2); + -moz-transform: scale(0.2); + -ms-transform: scale(0.2); + -o-transform: scale(0.2); + transform: scale(0.2); +} + + /* Global transition speed settings */ .reveal[data-transition-speed="fast"]>.backgrounds .slide-background { -webkit-transition-duration: 400ms; @@ -1398,6 +1559,31 @@ body { float: right } +/********************************************* + * PARALLAX BACKGROUND + *********************************************/ + +.reveal.has-parallax-background .backgrounds { + -webkit-transition: all 0.8s ease; + -moz-transition: all 0.8s ease; + -ms-transition: all 0.8s ease; + transition: all 0.8s ease; +} + +/* Global transition speed settings */ +.reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds { + -webkit-transition-duration: 400ms; + -moz-transition-duration: 400ms; + -ms-transition-duration: 400ms; + transition-duration: 400ms; +} +.reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds { + -webkit-transition-duration: 1200ms; + -moz-transition-duration: 1200ms; + -ms-transition-duration: 1200ms; + transition-duration: 1200ms; +} + /********************************************* * LINK PREVIEW OVERLAY @@ -1522,6 +1708,30 @@ body { } + +/********************************************* + * PLAYBACK COMPONENT + *********************************************/ + +.reveal .playback { + position: fixed; + left: 15px; + bottom: 15px; + z-index: 30; + cursor: pointer; + + -webkit-transition: all 400ms ease; + -moz-transition: all 400ms ease; + -ms-transition: all 400ms ease; + transition: all 400ms ease; +} + +.reveal.overview .playback { + opacity: 0; + visibility: hidden; +} + + /********************************************* * ROLLING LINKS *********************************************/ diff --git a/css/reveal.min.css b/css/reveal.min.css index 87f1aa6..ff2e5ba 100644 --- a/css/reveal.min.css +++ b/css/reveal.min.css @@ -4,4 +4,4 @@ * MIT licensed * * Copyright (C) 2013 Hakim El Hattab, http://hakim.se - */ html,body,.reveal div,.reveal span,.reveal applet,.reveal object,.reveal iframe,.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6,.reveal p,.reveal blockquote,.reveal pre,.reveal a,.reveal abbr,.reveal acronym,.reveal address,.reveal big,.reveal cite,.reveal code,.reveal del,.reveal dfn,.reveal em,.reveal img,.reveal ins,.reveal kbd,.reveal q,.reveal s,.reveal samp,.reveal small,.reveal strike,.reveal strong,.reveal sub,.reveal sup,.reveal tt,.reveal var,.reveal b,.reveal u,.reveal i,.reveal center,.reveal dl,.reveal dt,.reveal dd,.reveal ol,.reveal ul,.reveal li,.reveal fieldset,.reveal form,.reveal label,.reveal legend,.reveal table,.reveal caption,.reveal tbody,.reveal tfoot,.reveal thead,.reveal tr,.reveal th,.reveal td,.reveal article,.reveal aside,.reveal canvas,.reveal details,.reveal embed,.reveal figure,.reveal figcaption,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal output,.reveal ruby,.reveal section,.reveal summary,.reveal time,.reveal mark,.reveal audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}.reveal article,.reveal aside,.reveal details,.reveal figcaption,.reveal figure,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal section{display:block}html,body{width:100%;height:100%;overflow:hidden}body{position:relative;line-height:1}::selection{background:#FF5E99;color:#fff;text-shadow:none}.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6{-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;word-wrap:break-word;line-height:1}.reveal h1{font-size:3.77em}.reveal h2{font-size:2.11em}.reveal h3{font-size:1.55em}.reveal h4{font-size:1em}.reveal .slides section .fragment{opacity:0;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .slides section .fragment.visible{opacity:1}.reveal .slides section .fragment.grow{opacity:1}.reveal .slides section .fragment.grow.visible{-webkit-transform:scale(1.3);-moz-transform:scale(1.3);-ms-transform:scale(1.3);-o-transform:scale(1.3);transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1}.reveal .slides section .fragment.shrink.visible{-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}.reveal .slides section .fragment.zoom-in{opacity:0;-webkit-transform:scale(0.1);-moz-transform:scale(0.1);-ms-transform:scale(0.1);-o-transform:scale(0.1);transform:scale(0.1)}.reveal .slides section .fragment.zoom-in.visible{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.reveal .slides section .fragment.roll-in{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}.reveal .slides section .fragment.roll-in.visible{opacity:1;-webkit-transform:rotateX(0);-moz-transform:rotateX(0);-ms-transform:rotateX(0);-o-transform:rotateX(0);transform:rotateX(0)}.reveal .slides section .fragment.fade-out{opacity:1}.reveal .slides section .fragment.fade-out.visible{opacity:0}.reveal .slides section .fragment.semi-fade-out{opacity:1}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5}.reveal .slides section .fragment.highlight-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-blue{opacity:1}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal:after{content:'';font-style:italic}.reveal iframe{z-index:1}.reveal img,.reveal video,.reveal iframe{max-width:95%;max-height:95%}.reveal a{position:relative}.reveal strong,.reveal b{font-weight:700}.reveal em,.reveal i{font-style:italic}.reveal ol,.reveal ul{display:inline-block;text-align:left;margin:0 0 0 1em}.reveal ol{list-style-type:decimal}.reveal ul{list-style-type:disc}.reveal ul ul{list-style-type:square}.reveal ul ul ul{list-style-type:circle}.reveal ul ul,.reveal ul ol,.reveal ol ol,.reveal ol ul{display:block;margin-left:40px}.reveal p{margin-bottom:10px;line-height:1.2em}.reveal q,.reveal blockquote{quotes:none}.reveal blockquote{display:block;position:relative;width:70%;margin:5px auto;padding:5px;font-style:italic;background:rgba(255,255,255,.05);box-shadow:0 0 2px rgba(0,0,0,.2)}.reveal blockquote p:first-child,.reveal blockquote p:last-child{display:inline-block}.reveal q{font-style:italic}.reveal pre{display:block;position:relative;width:90%;margin:15px auto;text-align:left;font-size:.55em;font-family:monospace;line-height:1.2em;word-wrap:break-word;box-shadow:0 0 6px rgba(0,0,0,.3)}.reveal code{font-family:monospace}.reveal pre code{padding:5px;overflow:auto;max-height:400px;word-wrap:normal}.reveal pre.stretch code{height:100%;max-height:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal table th,.reveal table td{text-align:left;padding-right:.3em}.reveal table th{text-shadow:#fff 1px 1px 2px}.reveal sup{vertical-align:super}.reveal sub{vertical-align:sub}.reveal small{display:inline-block;font-size:.6em;line-height:1.2em;vertical-align:top}.reveal small *{vertical-align:top}.reveal .stretch{max-width:none;max-height:none}.reveal .controls{display:none;position:fixed;width:110px;height:110px;z-index:30;right:10px;bottom:10px}.reveal .controls div{position:absolute;opacity:.05;width:0;height:0;border:12px solid transparent;-moz-transform:scale(.9999);-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .controls div.enabled{opacity:.7;cursor:pointer}.reveal .controls div.enabled:active{margin-top:1px}.reveal .controls div.navigate-left{top:42px;border-right-width:22px;border-right-color:#eee}.reveal .controls div.navigate-left.fragmented{opacity:.3}.reveal .controls div.navigate-right{left:74px;top:42px;border-left-width:22px;border-left-color:#eee}.reveal .controls div.navigate-right.fragmented{opacity:.3}.reveal .controls div.navigate-up{left:42px;border-bottom-width:22px;border-bottom-color:#eee}.reveal .controls div.navigate-up.fragmented{opacity:.3}.reveal .controls div.navigate-down{left:42px;top:74px;border-top-width:22px;border-top-color:#eee}.reveal .controls div.navigate-down.fragmented{opacity:.3}.reveal .progress{position:fixed;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10}.reveal .progress:after{content:'';display:'block';position:absolute;height:20px;width:100%;top:-20px}.reveal .progress span{display:block;height:100%;width:0;-webkit-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);transition:width 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal{position:relative;width:100%;height:100%;-ms-touch-action:none}.reveal .slides{position:absolute;width:100%;height:100%;left:50%;top:50%;overflow:visible;z-index:1;text-align:center;-webkit-transition:-webkit-perspective .4s ease;-moz-transition:-moz-perspective .4s ease;-ms-transition:-ms-perspective .4s ease;-o-transition:-o-perspective .4s ease;transition:perspective .4s ease;-webkit-perspective:600px;-moz-perspective:600px;-ms-perspective:600px;perspective:600px;-webkit-perspective-origin:0 -100px;-moz-perspective-origin:0 -100px;-ms-perspective-origin:0 -100px;perspective-origin:0 -100px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;padding:20px 0;z-index:10;line-height:1.2em;font-weight:400;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:-webkit-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-webkit-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:-moz-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-moz-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:-ms-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-ms-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:-o-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-o-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);transition:transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow] .slides section{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides section[data-transition-speed=fast]{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal .slides section[data-transition-speed=slow]{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides>section{left:-50%;top:-50%}.reveal .slides>section.stack{padding-top:0;padding-bottom:0}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:auto!important}.reveal .slides>section.future,.reveal .slides>section>section.future,.reveal .slides>section.past,.reveal .slides>section>section.past{pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section[data-transition=default].past,.reveal .slides>section.past{display:block;opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section.future{display:block;opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section.past{display:block;opacity:0;-webkit-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-moz-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-ms-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section.future{display:block;opacity:0;-webkit-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-moz-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-ms-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides>section[data-transition=concave].past,.reveal.concave .slides>section.past{-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal.concave .slides>section.future{-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal.concave .slides>section>section.past{-webkit-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-moz-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-ms-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal.concave .slides>section>section.future{-webkit-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-moz-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-ms-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides>section[data-transition=zoom].past,.reveal.zoom .slides>section.past{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal.zoom .slides>section.future{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal.zoom .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=zoom].future,.reveal.zoom .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.linear section{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.reveal.linear .slides>section.past{-webkit-transform:translate(-150%,0);-moz-transform:translate(-150%,0);-ms-transform:translate(-150%,0);-o-transform:translate(-150%,0);transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal.linear .slides>section.future{-webkit-transform:translate(150%,0);-moz-transform:translate(150%,0);-ms-transform:translate(150%,0);-o-transform:translate(150%,0);transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal.linear .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal.linear .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.cube .slides{-webkit-perspective:1300px;-moz-perspective:1300px;-ms-perspective:1300px;perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.center.cube .slides section{min-height:auto}.reveal.cube .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;-webkit-transform:translateZ(-20px);-moz-transform:translateZ(-20px);-ms-transform:translateZ(-20px);-o-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg);-moz-transform:translateZ(-90px) rotateX(65deg);-ms-transform:translateZ(-90px) rotateX(65deg);-o-transform:translateZ(-90px) rotateX(65deg);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0}.reveal.cube .slides>section.past{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg);transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg);-moz-transform:translate3d(100%,0,0) rotateY(90deg);-ms-transform:translate3d(100%,0,0) rotateY(90deg);transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg);-moz-transform:translate3d(0,-100%,0) rotateX(90deg);-ms-transform:translate3d(0,-100%,0) rotateX(90deg);transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg);-moz-transform:translate3d(0,100%,0) rotateX(-90deg);-ms-transform:translate3d(0,100%,0) rotateX(-90deg);transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{-webkit-perspective-origin:0 50%;-moz-perspective-origin:0 50%;-ms-perspective-origin:0 50%;perspective-origin:0 50%;-webkit-perspective:3000px;-moz-perspective:3000px;-ms-perspective:3000px;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);-webkit-transform:translateZ(-20px);-moz-transform:translateZ(-20px);-ms-transform:translateZ(-20px);-o-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0}.reveal.page .slides>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(-40%,0,0) rotateY(-80deg);-moz-transform:translate3d(-40%,0,0) rotateY(-80deg);-ms-transform:translate3d(-40%,0,0) rotateY(-80deg);transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,-40%,0) rotateX(80deg);-moz-transform:translate3d(0,-40%,0) rotateX(80deg);-ms-transform:translate3d(0,-40%,0) rotateX(80deg);transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section,.reveal.fade .slides>section>section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:opacity .5s;-moz-transition:opacity .5s;-ms-transition:opacity .5s;-o-transition:opacity .5s;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section,.reveal.fade.overview-deactivating .slides section,.reveal.fade.overview-deactivating .slides>section>section{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal.overview .slides{-webkit-perspective-origin:0 0;-moz-perspective-origin:0 0;-ms-perspective-origin:0 0;perspective-origin:0 0;-webkit-perspective:700px;-moz-perspective:700px;-ms-perspective:700px;perspective:700px}.reveal.overview .slides section{height:600px;top:-300px!important;overflow:hidden;opacity:1!important;visibility:visible!important;cursor:pointer;background:rgba(0,0,0,.1)}.reveal.overview .slides section .fragment{opacity:1}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides section>section{opacity:1;cursor:pointer}.reveal.overview .slides section:hover{background:rgba(0,0,0,.3)}.reveal.overview .slides section.present{background:rgba(0,0,0,.3)}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0;overflow:visible}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;-webkit-transition:all 1s ease;-moz-transition:all 1s ease;-ms-transition:all 1s ease;-o-transition:all 1s ease;transition:all 1s ease}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.no-transforms{overflow-y:auto}.no-transforms .reveal .slides{position:relative;width:80%;height:auto!important;top:0;left:50%;margin:0;text-align:center}.no-transforms .reveal .controls,.no-transforms .reveal .progress{display:none!important}.no-transforms .reveal .slides section{display:block!important;opacity:1!important;position:relative!important;height:auto;min-height:auto;top:0;left:-50%;margin:70px 0;-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none}.no-transforms .reveal .slides section section{left:0}.reveal .no-transition,.reveal .no-transition *{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important;transition:none!important}.reveal .state-background{position:absolute;width:100%;height:100%;background:rgba(0,0,0,0);-webkit-transition:background 800ms ease;-moz-transition:background 800ms ease;-ms-transition:background 800ms ease;-o-transition:background 800ms ease;transition:background 800ms ease}.alert .reveal .state-background{background:rgba(200,50,30,.6)}.soothe .reveal .state-background{background:rgba(50,200,90,.4)}.blackout .reveal .state-background{background:rgba(0,0,0,.6)}.whiteout .reveal .state-background{background:rgba(255,255,255,.6)}.cobalt .reveal .state-background{background:rgba(22,152,213,.6)}.mint .reveal .state-background{background:rgba(22,213,75,.6)}.submerge .reveal .state-background{background:rgba(12,25,77,.6)}.lila .reveal .state-background{background:rgba(180,50,140,.6)}.sunset .reveal .state-background{background:rgba(255,122,0,.6)}.reveal>.backgrounds{position:absolute;width:100%;height:100%}.reveal .slide-background{position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;background-color:rgba(0,0,0,0);background-position:50% 50%;background-repeat:no-repeat;background-size:cover;-webkit-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);-o-transition:all 600ms cubic-bezier(0.26,.86,.44,.985);transition:all 600ms cubic-bezier(0.26,.86,.44,.985)}.reveal .slide-background.present{opacity:1;visibility:visible}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal[data-background-transition=none]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=none]{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal[data-background-transition=slide]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=slide]{opacity:1;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition-duration:800ms;-moz-transition-duration:800ms;-ms-transition-duration:800ms;-o-transition-duration:800ms;transition-duration:800ms}.reveal[data-background-transition=slide]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=slide]{-webkit-transform:translate(-100%,0);-moz-transform:translate(-100%,0);-ms-transform:translate(-100%,0);-o-transform:translate(-100%,0);transform:translate(-100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=slide]{-webkit-transform:translate(100%,0);-moz-transform:translate(100%,0);-ms-transform:translate(100%,0);-o-transform:translate(100%,0);transform:translate(100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide]{-webkit-transform:translate(0,-100%);-moz-transform:translate(0,-100%);-ms-transform:translate(0,-100%);-o-transform:translate(0,-100%);transform:translate(0,-100%)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide]{-webkit-transform:translate(0,100%);-moz-transform:translate(0,100%);-ms-transform:translate(0,100%);-o-transform:translate(0,100%);transform:translate(0,100%)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl pre,.reveal.rtl code{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{float:right}.reveal .preview-link-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.visible{opacity:1;visibility:visible}.reveal .preview-link-overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay header{position:absolute;left:0;top:0;width:100%;height:40px;z-index:2;border-bottom:1px solid #222}.reveal .preview-link-overlay header a{display:inline-block;width:40px;height:40px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal .preview-link-overlay header a:hover{opacity:1}.reveal .preview-link-overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal .preview-link-overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal .preview-link-overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal .preview-link-overlay .viewport{position:absolute;top:40px;right:0;bottom:0;left:0}.reveal .preview-link-overlay .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.loaded .viewport iframe{opacity:1;visibility:visible}.reveal .preview-link-overlay.loaded .spinner{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);transform:scale(0.2)}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;-webkit-perspective:400px;-moz-perspective:400px;-ms-perspective:400px;perspective:400px;-webkit-perspective-origin:50% 50%;-moz-perspective-origin:50% 50%;-ms-perspective-origin:50% 50%;perspective-origin:50% 50%}.reveal .roll:hover{background:0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-ms-transition:all 400ms ease;transition:all 400ms ease;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);-webkit-transform:translate3d(0px,0,-45px) rotateX(90deg);-moz-transform:translate3d(0px,0,-45px) rotateX(90deg);-ms-transform:translate3d(0px,0,-45px) rotateX(90deg);transform:translate3d(0px,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:translate3d(0px,110%,0) rotateX(-90deg);-moz-transform:translate3d(0px,110%,0) rotateX(-90deg);-ms-transform:translate3d(0px,110%,0) rotateX(-90deg);transform:translate3d(0px,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.zoomed .reveal *,.zoomed .reveal :before,.zoomed .reveal :after{-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;transform:none!important;-webkit-backface-visibility:visible!important;-moz-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .progress,.zoomed .reveal .controls{opacity:0}.zoomed .reveal .roll span{background:0}.zoomed .reveal .roll span:after{visibility:hidden}
\ No newline at end of file + */ html,body,.reveal div,.reveal span,.reveal applet,.reveal object,.reveal iframe,.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6,.reveal p,.reveal blockquote,.reveal pre,.reveal a,.reveal abbr,.reveal acronym,.reveal address,.reveal big,.reveal cite,.reveal code,.reveal del,.reveal dfn,.reveal em,.reveal img,.reveal ins,.reveal kbd,.reveal q,.reveal s,.reveal samp,.reveal small,.reveal strike,.reveal strong,.reveal sub,.reveal sup,.reveal tt,.reveal var,.reveal b,.reveal u,.reveal i,.reveal center,.reveal dl,.reveal dt,.reveal dd,.reveal ol,.reveal ul,.reveal li,.reveal fieldset,.reveal form,.reveal label,.reveal legend,.reveal table,.reveal caption,.reveal tbody,.reveal tfoot,.reveal thead,.reveal tr,.reveal th,.reveal td,.reveal article,.reveal aside,.reveal canvas,.reveal details,.reveal embed,.reveal figure,.reveal figcaption,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal output,.reveal ruby,.reveal section,.reveal summary,.reveal time,.reveal mark,.reveal audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}.reveal article,.reveal aside,.reveal details,.reveal figcaption,.reveal figure,.reveal footer,.reveal header,.reveal hgroup,.reveal menu,.reveal nav,.reveal section{display:block}html,body{width:100%;height:100%;overflow:hidden}body{position:relative;line-height:1}::selection{background:#FF5E99;color:#fff;text-shadow:none}.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal h5,.reveal h6{-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;word-wrap:break-word;line-height:1}.reveal h1{font-size:3.77em}.reveal h2{font-size:2.11em}.reveal h3{font-size:1.55em}.reveal h4{font-size:1em}.reveal .slides section .fragment{opacity:0;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .slides section .fragment.visible{opacity:1}.reveal .slides section .fragment.grow{opacity:1}.reveal .slides section .fragment.grow.visible{-webkit-transform:scale(1.3);-moz-transform:scale(1.3);-ms-transform:scale(1.3);-o-transform:scale(1.3);transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1}.reveal .slides section .fragment.shrink.visible{-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}.reveal .slides section .fragment.zoom-in{opacity:0;-webkit-transform:scale(0.1);-moz-transform:scale(0.1);-ms-transform:scale(0.1);-o-transform:scale(0.1);transform:scale(0.1)}.reveal .slides section .fragment.zoom-in.visible{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.reveal .slides section .fragment.roll-in{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}.reveal .slides section .fragment.roll-in.visible{opacity:1;-webkit-transform:rotateX(0);-moz-transform:rotateX(0);-ms-transform:rotateX(0);-o-transform:rotateX(0);transform:rotateX(0)}.reveal .slides section .fragment.fade-out{opacity:1}.reveal .slides section .fragment.fade-out.visible{opacity:0}.reveal .slides section .fragment.semi-fade-out{opacity:1}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5}.reveal .slides section .fragment.highlight-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-blue{opacity:1}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal:after{content:'';font-style:italic}.reveal iframe{z-index:1}.reveal img,.reveal video,.reveal iframe{max-width:95%;max-height:95%}.reveal a{position:relative}.reveal strong,.reveal b{font-weight:700}.reveal em,.reveal i{font-style:italic}.reveal ol,.reveal ul{display:inline-block;text-align:left;margin:0 0 0 1em}.reveal ol{list-style-type:decimal}.reveal ul{list-style-type:disc}.reveal ul ul{list-style-type:square}.reveal ul ul ul{list-style-type:circle}.reveal ul ul,.reveal ul ol,.reveal ol ol,.reveal ol ul{display:block;margin-left:40px}.reveal p{margin-bottom:10px;line-height:1.2em}.reveal q,.reveal blockquote{quotes:none}.reveal blockquote{display:block;position:relative;width:70%;margin:5px auto;padding:5px;font-style:italic;background:rgba(255,255,255,.05);box-shadow:0 0 2px rgba(0,0,0,.2)}.reveal blockquote p:first-child,.reveal blockquote p:last-child{display:inline-block}.reveal q{font-style:italic}.reveal pre{display:block;position:relative;width:90%;margin:15px auto;text-align:left;font-size:.55em;font-family:monospace;line-height:1.2em;word-wrap:break-word;box-shadow:0 0 6px rgba(0,0,0,.3)}.reveal code{font-family:monospace}.reveal pre code{padding:5px;overflow:auto;max-height:400px;word-wrap:normal}.reveal pre.stretch code{height:100%;max-height:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal table th,.reveal table td{text-align:left;padding-right:.3em}.reveal table th{font-weight:700}.reveal sup{vertical-align:super}.reveal sub{vertical-align:sub}.reveal small{display:inline-block;font-size:.6em;line-height:1.2em;vertical-align:top}.reveal small *{vertical-align:top}.reveal .stretch{max-width:none;max-height:none}.reveal .controls{display:none;position:fixed;width:110px;height:110px;z-index:30;right:10px;bottom:10px}.reveal .controls div{position:absolute;opacity:.05;width:0;height:0;border:12px solid transparent;-moz-transform:scale(.9999);-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.reveal .controls div.enabled{opacity:.7;cursor:pointer}.reveal .controls div.enabled:active{margin-top:1px}.reveal .controls div.navigate-left{top:42px;border-right-width:22px;border-right-color:#eee}.reveal .controls div.navigate-left.fragmented{opacity:.3}.reveal .controls div.navigate-right{left:74px;top:42px;border-left-width:22px;border-left-color:#eee}.reveal .controls div.navigate-right.fragmented{opacity:.3}.reveal .controls div.navigate-up{left:42px;border-bottom-width:22px;border-bottom-color:#eee}.reveal .controls div.navigate-up.fragmented{opacity:.3}.reveal .controls div.navigate-down{left:42px;top:74px;border-top-width:22px;border-top-color:#eee}.reveal .controls div.navigate-down.fragmented{opacity:.3}.reveal .progress{position:fixed;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10}.reveal .progress:after{content:'';display:'block';position:absolute;height:20px;width:100%;top:-20px}.reveal .progress span{display:block;height:100%;width:0;-webkit-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:width 800ms cubic-bezier(0.26,.86,.44,.985);transition:width 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal .slide-number{position:fixed;display:block;right:15px;bottom:15px;opacity:.5;z-index:31;font-size:12px}.reveal{position:relative;width:100%;height:100%;-ms-touch-action:none}.reveal .slides{position:absolute;width:100%;height:100%;left:50%;top:50%;overflow:visible;z-index:1;text-align:center;-webkit-transition:-webkit-perspective .4s ease;-moz-transition:-moz-perspective .4s ease;-ms-transition:-ms-perspective .4s ease;-o-transition:-o-perspective .4s ease;transition:perspective .4s ease;-webkit-perspective:600px;-moz-perspective:600px;-ms-perspective:600px;perspective:600px;-webkit-perspective-origin:0 -100px;-moz-perspective-origin:0 -100px;-ms-perspective-origin:0 -100px;perspective-origin:0 -100px}.reveal .slides>section{-ms-perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;padding:20px 0;z-index:10;line-height:1.2em;font-weight:inherit;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transition:-webkit-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-webkit-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:-moz-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-moz-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:-ms-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-ms-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:-o-transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),-o-transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985);transition:transform-origin 800ms cubic-bezier(0.26,.86,.44,.985),transform 800ms cubic-bezier(0.26,.86,.44,.985),visibility 800ms cubic-bezier(0.26,.86,.44,.985),opacity 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow] .slides section{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides section[data-transition-speed=fast]{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal .slides section[data-transition-speed=slow]{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .slides>section{left:-50%;top:-50%}.reveal .slides>section.stack{padding-top:0;padding-bottom:0}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:auto!important}.reveal .slides>section.future,.reveal .slides>section>section.future,.reveal .slides>section.past,.reveal .slides>section>section.past{pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section[data-transition=default].past,.reveal .slides>section.past{display:block;opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section.future{display:block;opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section.past{display:block;opacity:0;-webkit-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-moz-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);-ms-transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0);transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section.future{display:block;opacity:0;-webkit-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-moz-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);-ms-transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0);transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides>section[data-transition=concave].past,.reveal.concave .slides>section.past{-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal.concave .slides>section.future{-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal.concave .slides>section>section.past{-webkit-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-moz-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);-ms-transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0);transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal.concave .slides>section>section.future{-webkit-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-moz-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);-ms-transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0);transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides>section[data-transition=zoom],.reveal.zoom .slides>section{-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-ms-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal.zoom .slides>section.past{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal.zoom .slides>section.future{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal.zoom .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=zoom].future,.reveal.zoom .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.linear section{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.reveal .slides>section[data-transition=linear].past,.reveal.linear .slides>section.past{-webkit-transform:translate(-150%,0);-moz-transform:translate(-150%,0);-ms-transform:translate(-150%,0);-o-transform:translate(-150%,0);transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal.linear .slides>section.future{-webkit-transform:translate(150%,0);-moz-transform:translate(150%,0);-ms-transform:translate(150%,0);-o-transform:translate(150%,0);transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal.linear .slides>section>section.past{-webkit-transform:translate(0,-150%);-moz-transform:translate(0,-150%);-ms-transform:translate(0,-150%);-o-transform:translate(0,-150%);transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal.linear .slides>section>section.future{-webkit-transform:translate(0,150%);-moz-transform:translate(0,150%);-ms-transform:translate(0,150%);-o-transform:translate(0,150%);transform:translate(0,150%)}.reveal.cube .slides{-webkit-perspective:1300px;-moz-perspective:1300px;-ms-perspective:1300px;perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.center.cube .slides section{min-height:auto}.reveal.cube .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;-webkit-transform:translateZ(-20px);-moz-transform:translateZ(-20px);-ms-transform:translateZ(-20px);-o-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg);-moz-transform:translateZ(-90px) rotateX(65deg);-ms-transform:translateZ(-90px) rotateX(65deg);-o-transform:translateZ(-90px) rotateX(65deg);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0}.reveal.cube .slides>section.past{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg);transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg);-moz-transform:translate3d(100%,0,0) rotateY(90deg);-ms-transform:translate3d(100%,0,0) rotateY(90deg);transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg);-moz-transform:translate3d(0,-100%,0) rotateX(90deg);-ms-transform:translate3d(0,-100%,0) rotateX(90deg);transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg);-moz-transform:translate3d(0,100%,0) rotateX(-90deg);-ms-transform:translate3d(0,100%,0) rotateX(-90deg);transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{-webkit-perspective-origin:0 50%;-moz-perspective-origin:0 50%;-ms-perspective-origin:0 50%;perspective-origin:0 50%;-webkit-perspective:3000px;-moz-perspective:3000px;-ms-perspective:3000px;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:'';position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);-webkit-transform:translateZ(-20px);-moz-transform:translateZ(-20px);-ms-transform:translateZ(-20px);-o-transform:translateZ(-20px);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:'';position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0}.reveal.page .slides>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(-40%,0,0) rotateY(-80deg);-moz-transform:translate3d(-40%,0,0) rotateY(-80deg);-ms-transform:translate3d(-40%,0,0) rotateY(-80deg);transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translate3d(0,-40%,0) rotateX(80deg);-moz-transform:translate3d(0,-40%,0) rotateX(80deg);-ms-transform:translate3d(0,-40%,0) rotateX(80deg);transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section,.reveal.fade .slides>section>section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:opacity .5s;-moz-transition:opacity .5s;-ms-transition:opacity .5s;-o-transition:opacity .5s;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section,.reveal.fade.overview-deactivating .slides section,.reveal.fade.overview-deactivating .slides>section>section{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section{-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none;-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal.overview .slides{-webkit-perspective-origin:0 0;-moz-perspective-origin:0 0;-ms-perspective-origin:0 0;perspective-origin:0 0;-webkit-perspective:700px;-moz-perspective:700px;-ms-perspective:700px;perspective:700px}.reveal.overview .slides section{height:600px;top:-300px!important;overflow:hidden;opacity:1!important;visibility:visible!important;cursor:pointer;background:rgba(0,0,0,.1)}.reveal.overview .slides section .fragment{opacity:1}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides section>section{opacity:1;cursor:pointer}.reveal.overview .slides section:hover{background:rgba(0,0,0,.3)}.reveal.overview .slides section.present{background:rgba(0,0,0,.3)}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0;overflow:visible}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;-webkit-transition:all 1s ease;-moz-transition:all 1s ease;-ms-transition:all 1s ease;-o-transition:all 1s ease;transition:all 1s ease}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.no-transforms{overflow-y:auto}.no-transforms .reveal .slides{position:relative;width:80%;height:auto!important;top:0;left:50%;margin:0;text-align:center}.no-transforms .reveal .controls,.no-transforms .reveal .progress{display:none!important}.no-transforms .reveal .slides section{display:block!important;opacity:1!important;position:relative!important;height:auto;min-height:auto;top:0;left:-50%;margin:70px 0;-webkit-transform:none;-moz-transform:none;-ms-transform:none;-o-transform:none;transform:none}.no-transforms .reveal .slides section section{left:0}.reveal .no-transition,.reveal .no-transition *{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important;transition:none!important}.reveal .state-background{position:absolute;width:100%;height:100%;background:rgba(0,0,0,0);-webkit-transition:background 800ms ease;-moz-transition:background 800ms ease;-ms-transition:background 800ms ease;-o-transition:background 800ms ease;transition:background 800ms ease}.alert .reveal .state-background{background:rgba(200,50,30,.6)}.soothe .reveal .state-background{background:rgba(50,200,90,.4)}.blackout .reveal .state-background{background:rgba(0,0,0,.6)}.whiteout .reveal .state-background{background:rgba(255,255,255,.6)}.cobalt .reveal .state-background{background:rgba(22,152,213,.6)}.mint .reveal .state-background{background:rgba(22,213,75,.6)}.submerge .reveal .state-background{background:rgba(12,25,77,.6)}.lila .reveal .state-background{background:rgba(180,50,140,.6)}.sunset .reveal .state-background{background:rgba(255,122,0,.6)}.reveal>.backgrounds{position:absolute;width:100%;height:100%;-webkit-perspective:600px;-moz-perspective:600px;-ms-perspective:600px;perspective:600px}.reveal .slide-background{position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;background-color:rgba(0,0,0,0);background-position:50% 50%;background-repeat:no-repeat;background-size:cover;-webkit-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);-moz-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);-ms-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);-o-transition:all 800ms cubic-bezier(0.26,.86,.44,.985);transition:all 800ms cubic-bezier(0.26,.86,.44,.985)}.reveal .slide-background.present{opacity:1;visibility:visible}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal[data-background-transition=none]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=none]{-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.reveal[data-background-transition=slide]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=slide]{opacity:1;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.reveal[data-background-transition=slide]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=slide]{-webkit-transform:translate(-100%,0);-moz-transform:translate(-100%,0);-ms-transform:translate(-100%,0);-o-transform:translate(-100%,0);transform:translate(-100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=slide]{-webkit-transform:translate(100%,0);-moz-transform:translate(100%,0);-ms-transform:translate(100%,0);-o-transform:translate(100%,0);transform:translate(100%,0)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide]{-webkit-transform:translate(0,-100%);-moz-transform:translate(0,-100%);-ms-transform:translate(0,-100%);-o-transform:translate(0,-100%);transform:translate(0,-100%)}.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide]{-webkit-transform:translate(0,100%);-moz-transform:translate(0,100%);-ms-transform:translate(0,100%);-o-transform:translate(0,100%);transform:translate(0,100%)}.reveal[data-background-transition=convex]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0);-moz-transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0);transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex]{opacity:0;-webkit-transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0);transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0);transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0);transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0);-moz-transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0);transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave]{opacity:0;-webkit-transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0);transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background,.reveal>.backgrounds .slide-background[data-background-transition=zoom]{-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-ms-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past,.reveal>.backgrounds .slide-background.past[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future,.reveal>.backgrounds .slide-background.future[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past,.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(16);-moz-transform:scale(16);-ms-transform:scale(16);-o-transform:scale(16);transform:scale(16)}.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future,.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom]{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);-o-transform:scale(0.2);transform:scale(0.2)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl pre,.reveal.rtl code{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{float:right}.reveal.has-parallax-background .backgrounds{-webkit-transition:all .8s ease;-moz-transition:all .8s ease;-ms-transition:all .8s ease;transition:all .8s ease}.reveal.has-parallax-background[data-transition-speed=fast] .backgrounds{-webkit-transition-duration:400ms;-moz-transition-duration:400ms;-ms-transition-duration:400ms;transition-duration:400ms}.reveal.has-parallax-background[data-transition-speed=slow] .backgrounds{-webkit-transition-duration:1200ms;-moz-transition-duration:1200ms;-ms-transition-duration:1200ms;transition-duration:1200ms}.reveal .preview-link-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.visible{opacity:1;visibility:visible}.reveal .preview-link-overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay header{position:absolute;left:0;top:0;width:100%;height:40px;z-index:2;border-bottom:1px solid #222}.reveal .preview-link-overlay header a{display:inline-block;width:40px;height:40px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal .preview-link-overlay header a:hover{opacity:1}.reveal .preview-link-overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal .preview-link-overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal .preview-link-overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal .preview-link-overlay .viewport{position:absolute;top:40px;right:0;bottom:0;left:0}.reveal .preview-link-overlay .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;-webkit-transition:all .3s ease;-moz-transition:all .3s ease;-ms-transition:all .3s ease;transition:all .3s ease}.reveal .preview-link-overlay.loaded .viewport iframe{opacity:1;visibility:visible}.reveal .preview-link-overlay.loaded .spinner{opacity:0;visibility:hidden;-webkit-transform:scale(0.2);-moz-transform:scale(0.2);-ms-transform:scale(0.2);transform:scale(0.2)}.reveal .playback{position:fixed;left:15px;bottom:15px;z-index:30;cursor:pointer;-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-ms-transition:all 400ms ease;transition:all 400ms ease}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;-webkit-perspective:400px;-moz-perspective:400px;-ms-perspective:400px;perspective:400px;-webkit-perspective-origin:50% 50%;-moz-perspective-origin:50% 50%;-ms-perspective-origin:50% 50%;perspective-origin:50% 50%}.reveal .roll:hover{background:0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;-webkit-transition:all 400ms ease;-moz-transition:all 400ms ease;-ms-transition:all 400ms ease;transition:all 400ms ease;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);-webkit-transform:translate3d(0px,0,-45px) rotateX(90deg);-moz-transform:translate3d(0px,0,-45px) rotateX(90deg);-ms-transform:translate3d(0px,0,-45px) rotateX(90deg);transform:translate3d(0px,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:translate3d(0px,110%,0) rotateX(-90deg);-moz-transform:translate3d(0px,110%,0) rotateX(-90deg);-ms-transform:translate3d(0px,110%,0) rotateX(-90deg);transform:translate3d(0px,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.zoomed .reveal *,.zoomed .reveal :before,.zoomed .reveal :after{-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;transform:none!important;-webkit-backface-visibility:visible!important;-moz-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .progress,.zoomed .reveal .controls{opacity:0}.zoomed .reveal .roll span{background:0}.zoomed .reveal .roll span:after{visibility:hidden}
\ No newline at end of file diff --git a/css/theme/README.md b/css/theme/README.md index 28ded29..8237586 100644 --- a/css/theme/README.md +++ b/css/theme/README.md @@ -2,7 +2,7 @@ Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup - +You also need to install Ruby and then Sass (with `gem install sass`). ## Creating a Theme @@ -21,3 +21,5 @@ This is where you override the default theme. Either by specifying variables (se 4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)** The template theme file which will generate final CSS output based on the currently defined variables. + +When you are done, run `grunt themes` to compile the Sass file to CSS and you are ready to use your new theme. diff --git a/css/theme/beige.css b/css/theme/beige.css index 1d9a886..7fb3ca4 100644 --- a/css/theme/beige.css +++ b/css/theme/beige.css @@ -27,7 +27,7 @@ body { .reveal { font-family: "Lato", sans-serif; font-size: 36px; - font-weight: 200; + font-weight: normal; letter-spacing: -0.02em; color: #333333; } @@ -128,6 +128,13 @@ body { border-top-color: #c0a86e; } /********************************************* + * SLIDE NUMBER + *********************************************/ +.reveal .slide-number { + color: #8b743d; +} + +/********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { diff --git a/css/theme/blood.css b/css/theme/blood.css new file mode 100644 index 0000000..91521ab --- /dev/null +++ b/css/theme/blood.css @@ -0,0 +1,169 @@ +@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); +/** + * Blood theme for reveal.js + * Author: Walther http://github.com/Walther + * + * Designed to be used with highlight.js theme + * "monokai_sublime.css" available from + * https://github.com/isagalaev/highlight.js/ + * + * For other themes, change $codeBackground accordingly. + * + */ +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #222222; + background: -moz-radial-gradient(center, circle cover, #626262 0%, #222222 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #626262), color-stop(100%, #222222)); + background: -webkit-radial-gradient(center, circle cover, #626262 0%, #222222 100%); + background: -o-radial-gradient(center, circle cover, #626262 0%, #222222 100%); + background: -ms-radial-gradient(center, circle cover, #626262 0%, #222222 100%); + background: radial-gradient(center, circle cover, #626262 0%, #222222 100%); + background-color: #2b2b2b; } + +.reveal { + font-family: Ubuntu, "sans-serif"; + font-size: 36px; + font-weight: normal; + letter-spacing: -0.02em; + color: #eeeeee; } + +::selection { + color: white; + background: #aa2233; + text-shadow: none; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #eeeeee; + font-family: Ubuntu, "sans-serif"; + line-height: 0.9em; + letter-spacing: 0.02em; + text-transform: uppercase; + text-shadow: 2px 2px 2px #222222; } + +.reveal h1 { + text-shadow: 0 1px 0 #cccccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbbbbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaaaaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } + +/********************************************* + * LINKS + *********************************************/ +.reveal a:not(.image) { + color: #aa2233; + text-decoration: none; + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + -ms-transition: color .15s ease; + -o-transition: color .15s ease; + transition: color .15s ease; } + +.reveal a:not(.image):hover { + color: #dd5566; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #6a1520; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #eeeeee; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #aa2233; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls div.navigate-left, +.reveal .controls div.navigate-left.enabled { + border-right-color: #aa2233; } + +.reveal .controls div.navigate-right, +.reveal .controls div.navigate-right.enabled { + border-left-color: #aa2233; } + +.reveal .controls div.navigate-up, +.reveal .controls div.navigate-up.enabled { + border-bottom-color: #aa2233; } + +.reveal .controls div.navigate-down, +.reveal .controls div.navigate-down.enabled { + border-top-color: #aa2233; } + +.reveal .controls div.navigate-left.enabled:hover { + border-right-color: #dd5566; } + +.reveal .controls div.navigate-right.enabled:hover { + border-left-color: #dd5566; } + +.reveal .controls div.navigate-up.enabled:hover { + border-bottom-color: #dd5566; } + +.reveal .controls div.navigate-down.enabled:hover { + border-top-color: #dd5566; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #aa2233; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -ms-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -o-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } + +.reveal p { + font-weight: 300; + text-shadow: 1px 1px #222222; } + +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + font-weight: 700; } + +.reveal a:not(.image), +.reveal a:not(.image):hover { + text-shadow: 2px 2px 2px #000; } + +.reveal small a:not(.image), +.reveal small a:not(.image):hover { + text-shadow: 1px 1px 1px #000; } + +.reveal p code { + background-color: #23241f; + display: inline-block; + border-radius: 7px; } + +.reveal small code { + vertical-align: baseline; } diff --git a/css/theme/default.css b/css/theme/default.css index 9a2f7c6..71bcc17 100644 --- a/css/theme/default.css +++ b/css/theme/default.css @@ -27,7 +27,7 @@ body { .reveal { font-family: "Lato", sans-serif; font-size: 36px; - font-weight: 200; + font-weight: normal; letter-spacing: -0.02em; color: #eeeeee; } @@ -128,6 +128,13 @@ body { border-top-color: #71e9f4; } /********************************************* + * SLIDE NUMBER + *********************************************/ +.reveal .slide-number { + color: #13daec; +} + +/********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { diff --git a/css/theme/moon.css b/css/theme/moon.css index 5aa2866..8b9bb1d 100644 --- a/css/theme/moon.css +++ b/css/theme/moon.css @@ -27,7 +27,7 @@ body { .reveal { font-family: "Lato", sans-serif; font-size: 36px; - font-weight: 200; + font-weight: normal; letter-spacing: -0.02em; color: #93a1a1; } @@ -128,6 +128,13 @@ body { border-top-color: #78b9e6; } /********************************************* + * SLIDE NUMBER + *********************************************/ +.reveal .slide-number { + color: #268bd2; +} + +/********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { diff --git a/css/theme/night.css b/css/theme/night.css index 2ea3fc4..fe48c2e 100644 --- a/css/theme/night.css +++ b/css/theme/night.css @@ -15,7 +15,7 @@ body { .reveal { font-family: "Open Sans", sans-serif; font-size: 30px; - font-weight: 200; + font-weight: normal; letter-spacing: -0.02em; color: #eeeeee; } @@ -116,6 +116,13 @@ body { border-top-color: #f3d7ac; } /********************************************* + * SLIDE NUMBER + *********************************************/ +.reveal .slide-number { + color: #e7ad52; +} + +/********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { diff --git a/css/theme/serif.css b/css/theme/serif.css index 734de56..fdc913a 100644 --- a/css/theme/serif.css +++ b/css/theme/serif.css @@ -17,7 +17,7 @@ body { .reveal { font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif; font-size: 36px; - font-weight: 200; + font-weight: normal; letter-spacing: -0.02em; color: black; } @@ -118,6 +118,13 @@ body { border-top-color: #8b7c69; } /********************************************* + * SLIDE NUMBER + *********************************************/ +.reveal .slide-number { + color: #51483d; +} + +/********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { diff --git a/css/theme/simple.css b/css/theme/simple.css index b8f31bc..3ae86dc 100644 --- a/css/theme/simple.css +++ b/css/theme/simple.css @@ -17,7 +17,7 @@ body { .reveal { font-family: "Lato", sans-serif; font-size: 36px; - font-weight: 200; + font-weight: normal; letter-spacing: -0.02em; color: black; } @@ -118,6 +118,13 @@ body { border-top-color: #0000f1; } /********************************************* + * SLIDE NUMBER + *********************************************/ +.reveal .slide-number { + color: darkblue; +} + +/********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { diff --git a/css/theme/sky.css b/css/theme/sky.css index 35d048e..352627b 100644 --- a/css/theme/sky.css +++ b/css/theme/sky.css @@ -24,7 +24,7 @@ body { .reveal { font-family: "Open Sans", sans-serif; font-size: 36px; - font-weight: 200; + font-weight: normal; letter-spacing: -0.02em; color: #333333; } @@ -125,6 +125,13 @@ body { border-top-color: #74a7cb; } /********************************************* + * SLIDE NUMBER + *********************************************/ +.reveal .slide-number { + color: #3b759e; +} + +/********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { diff --git a/css/theme/solarized.css b/css/theme/solarized.css index 17c3205..092c5d0 100644 --- a/css/theme/solarized.css +++ b/css/theme/solarized.css @@ -27,7 +27,7 @@ body { .reveal { font-family: "Lato", sans-serif; font-size: 36px; - font-weight: 200; + font-weight: normal; letter-spacing: -0.02em; color: #657b83; } @@ -128,6 +128,13 @@ body { border-top-color: #78b9e6; } /********************************************* + * SLIDE NUMBER + *********************************************/ +.reveal .slide-number { + color: #268bd2; +} + +/********************************************* * PROGRESS BAR *********************************************/ .reveal .progress { diff --git a/css/theme/source/blood.scss b/css/theme/source/blood.scss new file mode 100644 index 0000000..a9925a1 --- /dev/null +++ b/css/theme/source/blood.scss @@ -0,0 +1,91 @@ +/** + * Blood theme for reveal.js + * Author: Walther http://github.com/Walther + * + * Designed to be used with highlight.js theme + * "monokai_sublime.css" available from + * https://github.com/isagalaev/highlight.js/ + * + * For other themes, change $codeBackground accordingly. + * + */ + + // Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + +// Include theme-specific fonts + +@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); + +// Colors used in the theme +$blood: #a23; +$coal: #222; +$codeBackground: #23241f; + +// Main text +$mainFont: Ubuntu, 'sans-serif'; +$mainFontSize: 36px; +$mainColor: #eee; + +// Headings +$headingFont: Ubuntu, 'sans-serif'; +$headingTextShadow: 2px 2px 2px $coal; + +// h1 shadow, borrowed humbly from +// (c) Default theme by Hakim El Hattab +$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); + +// Links +$linkColor: $blood; +$linkColorHover: lighten( $linkColor, 20% ); + +// Text selection +$selectionBackgroundColor: $blood; +$selectionColor: #fff; + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( $coal, lighten( $coal, 25% ) ); +} + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- + +// some overrides after theme template import + +.reveal p { + font-weight: 300; + text-shadow: 1px 1px $coal; +} + +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + font-weight: 700; +} + +.reveal a:not(.image), +.reveal a:not(.image):hover { + text-shadow: 2px 2px 2px #000; +} + +.reveal small a:not(.image), +.reveal small a:not(.image):hover { + text-shadow: 1px 1px 1px #000; +} + +.reveal p code { + background-color: $codeBackground; + display: inline-block; + border-radius: 7px; +} + +.reveal small code { + vertical-align: baseline; +}
\ No newline at end of file diff --git a/css/theme/template/theme.scss b/css/theme/template/theme.scss index 735b765..ff86356 100644 --- a/css/theme/template/theme.scss +++ b/css/theme/template/theme.scss @@ -12,7 +12,7 @@ body { .reveal { font-family: $mainFont; font-size: $mainFontSize; - font-weight: 200; + font-weight: normal; letter-spacing: -0.02em; color: $mainColor; } @@ -281,7 +281,7 @@ function linkify( selector ) { </section> <section> - <section> + <section id="fragments"> <h2>Fragmented Views</h2> <p>Hit the next arrow...</p> <p class="fragment">... to step through ...</p> @@ -366,6 +366,10 @@ function linkify( selector ) { theme: Reveal.getQueryHash().theme, // available themes are in /css/theme transition: Reveal.getQueryHash().transition || 'default', // default/cube/page/concave/zoom/linear/fade/none + // Parallax scrolling + // parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg', + // parallaxBackgroundSize: '2100px 900px', + // Optional libraries used to extend on reveal.js dependencies: [ { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } }, diff --git a/js/reveal.js b/js/reveal.js index e1cd623..7b81e5c 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -12,7 +12,7 @@ var Reveal = (function(){ var SLIDES_SELECTOR = '.reveal .slides section', HORIZONTAL_SLIDES_SELECTOR = '.reveal .slides>section', VERTICAL_SLIDES_SELECTOR = '.reveal .slides>section.present>section', - HOME_SLIDE_SELECTOR = '.reveal .slides>section:first-child', + HOME_SLIDE_SELECTOR = '.reveal .slides>section:first-of-type', // Configurations defaults, can be overridden at initialization time config = { @@ -35,6 +35,9 @@ var Reveal = (function(){ // Display a presentation progress bar progress: true, + // Display the page number of the current slide + slideNumber: false, + // Push each slide change to the browser history history: false, @@ -44,7 +47,7 @@ var Reveal = (function(){ // Enable the slide overview mode overview: true, - // Vertical centring of slides + // Vertical centering of slides center: true, // Enables touch navigation on devices with touch input @@ -68,15 +71,24 @@ var Reveal = (function(){ // by using a data-autoslide attribute on your slides autoSlide: 0, + // Stop auto-sliding after user input + autoSlideStoppable: true, + // Enable slide navigation via mouse wheel mouseWheel: false, // Apply a 3D roll to links on hover rollingLinks: false, + // Hides the address bar on mobile devices + hideAddressBar: true, + // Opens links in an iframe preview overlay previewLinks: false, + // Focuses body when page changes visiblity to ensure keyboard shortcuts work + focusBodyOnPageVisiblityChange: true, + // Theme (see /css/theme) theme: null, @@ -89,19 +101,23 @@ var Reveal = (function(){ // Transition style for full page slide backgrounds backgroundTransition: 'default', // default/linear/none + // Parallax background image + parallaxBackgroundImage: '', // CSS syntax, e.g. "a.jpg" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "3000px 2000px" + // Number of slides away from the current that are visible viewDistance: 3, // Script dependencies to load dependencies: [] + }, // Flags if reveal.js is loaded (has dispatched the 'ready' event) loaded = false, - // The current auto-slide duration - autoSlide = 0, - // The horizontal and vertical index of the currently active slide indexh, indexv, @@ -110,6 +126,8 @@ var Reveal = (function(){ previousSlide, currentSlide, + previousBackground, + // Slides may hold a data-state attribute which we pick up and apply // as a class to the body. This list contains the combined state of // all current slides. @@ -121,11 +139,8 @@ var Reveal = (function(){ // Cached references to DOM elements dom = {}, - // Client support for CSS 3D transforms, see #checkCapabilities() - supports3DTransforms, - - // Client support for CSS 2D transforms, see #checkCapabilities() - supports2DTransforms, + // Features supported by the browser, see #checkCapabilities() + features = {}, // Client is a mobile device, see #checkCapabilities() isMobileDevice, @@ -133,9 +148,6 @@ var Reveal = (function(){ // Throttles mouse wheel navigation lastMouseWheelStep = 0, - // An interval used to automatically move on to the next slide - autoSlideTimeout = 0, - // Delays updates to the URL due to a Chrome thumbnailer bug writeURLTimeout = 0, @@ -148,6 +160,15 @@ var Reveal = (function(){ // Flags if the interaction event listeners are bound eventsAreBound = false, + // The current auto-slide duration + autoSlide = 0, + + // Auto slide properties + autoSlidePlayer, + autoSlideTimeout = 0, + autoSlideStartTime = -1, + autoSlidePaused = false, + // Holds information about the currently ongoing touch input touch = { startX: 0, @@ -165,7 +186,7 @@ var Reveal = (function(){ checkCapabilities(); - if( !supports2DTransforms && !supports3DTransforms ) { + if( !features.transforms2d && !features.transforms3d ) { document.body.setAttribute( 'class', 'no-transforms' ); // If the browser doesn't support core features we won't be @@ -176,8 +197,15 @@ var Reveal = (function(){ // Force a layout when the whole page, incl fonts, has loaded window.addEventListener( 'load', layout, false ); + var query = Reveal.getQueryHash(); + + // Do not accept new dependencies via query config to avoid + // the potential of malicious script injection + if( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies']; + // Copy options over to our config object extend( config, options ); + extend( config, query ); // Hide the address bar in mobile browsers hideAddressBar(); @@ -193,18 +221,23 @@ var Reveal = (function(){ */ function checkCapabilities() { - supports3DTransforms = 'WebkitPerspective' in document.body.style || + features.transforms3d = 'WebkitPerspective' in document.body.style || 'MozPerspective' in document.body.style || 'msPerspective' in document.body.style || 'OPerspective' in document.body.style || 'perspective' in document.body.style; - supports2DTransforms = 'WebkitTransform' in document.body.style || + features.transforms2d = 'WebkitTransform' in document.body.style || 'MozTransform' in document.body.style || 'msTransform' in document.body.style || 'OTransform' in document.body.style || 'transform' in document.body.style; + features.requestAnimationFrameMethod = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; + features.requestAnimationFrame = typeof features.requestAnimationFrameMethod === 'function'; + + features.canvas = !!document.createElement( 'canvas' ).getContext; + isMobileDevice = navigator.userAgent.match( /(iphone|ipod|android)/gi ); } @@ -280,6 +313,9 @@ var Reveal = (function(){ // Read the initial hash readURL(); + // Update all backgrounds + updateBackground( true ); + // Notify listeners that the presentation is ready but use a 1ms // timeout to ensure it's not fired synchronously after #initialize() setTimeout( function() { @@ -346,6 +382,9 @@ var Reveal = (function(){ '<div class="navigate-up"></div>' + '<div class="navigate-down"></div>' ); + // Slide number + dom.slideNumber = createSingletonNode( dom.wrapper, 'div', 'slide-number', '' ); + // State background element [DEPRECATED] createSingletonNode( dom.wrapper, 'div', 'state-background', null ); @@ -419,7 +458,7 @@ var Reveal = (function(){ if( data.background ) { // Auto-wrap image urls in url(...) - if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(png|jpg|jpeg|gif|bmp)$/gi.test( data.background ) ) { + if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test( data.background ) ) { element.style.backgroundImage = 'url('+ data.background +')'; } else { @@ -427,6 +466,10 @@ var Reveal = (function(){ } } + if( data.background || data.backgroundColor || data.backgroundImage ) { + element.setAttribute( 'data-background-hash', data.background + data.backgroundSize + data.backgroundImage + data.backgroundColor + data.backgroundRepeat + data.backgroundPosition + data.backgroundTransition ); + } + // Additional and optional background properties if( data.backgroundSize ) element.style.backgroundSize = data.backgroundSize; if( data.backgroundImage ) element.style.backgroundImage = 'url("' + data.backgroundImage + '")'; @@ -467,6 +510,28 @@ var Reveal = (function(){ } ); + // Add parallax background if specified + if( config.parallaxBackgroundImage ) { + + dom.background.style.backgroundImage = 'url("' + config.parallaxBackgroundImage + '")'; + dom.background.style.backgroundSize = config.parallaxBackgroundSize; + + // Make sure the below properties are set on the element - these properties are + // needed for proper transitions to be set on the element via CSS. To remove + // annoying background slide-in effect when the presentation starts, apply + // these properties after short time delay + setTimeout( function() { + dom.wrapper.classList.add( 'has-parallax-background' ); + }, 1 ); + + } + else { + + dom.background.style.backgroundImage = ''; + dom.wrapper.classList.remove( 'has-parallax-background' ); + + } + } /** @@ -475,6 +540,8 @@ var Reveal = (function(){ */ function configure( options ) { + var numberOfSlides = document.querySelectorAll( SLIDES_SELECTOR ).length; + dom.wrapper.classList.remove( config.transition ); // New config options may be passed when this method @@ -482,7 +549,7 @@ var Reveal = (function(){ if( typeof options === 'object' ) extend( config, options ); // Force linear transition based on browser capabilities - if( supports3DTransforms === false ) config.transition = 'linear'; + if( features.transforms3d === false ) config.transition = 'linear'; dom.wrapper.classList.add( config.transition ); @@ -532,6 +599,20 @@ var Reveal = (function(){ enablePreviewLinks( '[data-preview-link]' ); } + // Auto-slide playback controls + if( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable && features.canvas && features.requestAnimationFrame ) { + autoSlidePlayer = new Playback( dom.wrapper, function() { + return Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 ); + } ); + + autoSlidePlayer.on( 'click', onAutoSlidePlayerClick ); + autoSlidePaused = false; + } + else if( autoSlidePlayer ) { + autoSlidePlayer.destroy(); + autoSlidePlayer = null; + } + // Load the theme in the config, if it's not already loaded if( config.theme && dom.theme ) { var themeURL = dom.theme.getAttribute( 'href' ); @@ -575,10 +656,28 @@ var Reveal = (function(){ document.addEventListener( 'keydown', onDocumentKeyDown, false ); } - if ( config.progress && dom.progress ) { + if( config.progress && dom.progress ) { dom.progress.addEventListener( 'click', onProgressClicked, false ); } + if( config.focusBodyOnPageVisiblityChange ) { + var visibilityChange; + + if( 'hidden' in document ) { + visibilityChange = 'visibilitychange'; + } + else if( 'msHidden' in document ) { + visibilityChange = 'msvisibilitychange'; + } + else if( 'webkitHidden' in document ) { + visibilityChange = 'webkitvisibilitychange'; + } + + if( visibilityChange ) { + document.addEventListener( visibilityChange, onPageVisibilityChange, false ); + } + } + [ 'touchstart', 'click' ].forEach( function( eventName ) { dom.controlsLeft.forEach( function( el ) { el.addEventListener( eventName, onNavigateLeftClicked, false ); } ); dom.controlsRight.forEach( function( el ) { el.addEventListener( eventName, onNavigateRightClicked, false ); } ); @@ -767,7 +866,7 @@ var Reveal = (function(){ */ function hideAddressBar() { - if( isMobileDevice ) { + if( config.hideAddressBar && isMobileDevice ) { // Events that should trigger the address bar to hide window.addEventListener( 'load', removeAddressBar, false ); window.addEventListener( 'orientationchange', removeAddressBar, false ); @@ -781,16 +880,6 @@ var Reveal = (function(){ */ function removeAddressBar() { - // Portrait and not Chrome for iOS - if( window.orientation === 0 && !/crios/gi.test( navigator.userAgent ) ) { - document.documentElement.style.overflow = 'scroll'; - document.body.style.height = '120%'; - } - else { - document.documentElement.style.overflow = ''; - document.body.style.height = '100%'; - } - setTimeout( function() { window.scrollTo( 0, 1 ); }, 10 ); @@ -815,7 +904,7 @@ var Reveal = (function(){ */ function enableRollingLinks() { - if( supports3DTransforms && !( 'msPerspective' in document.body.style ) ) { + if( features.transforms3d && !( 'msPerspective' in document.body.style ) ) { var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a:not(.image)' ); for( var i = 0, len = anchors.length; i < len; i++ ) { @@ -1035,7 +1124,7 @@ var Reveal = (function(){ continue; } - if( config.center ) { + if( config.center || slide.classList.contains( 'center' ) ) { // Vertical stacks are not centred since their section // children will be if( slide.classList.contains( 'stack' ) ) { @@ -1052,6 +1141,7 @@ var Reveal = (function(){ } updateProgress(); + updateParallax(); } @@ -1468,7 +1558,6 @@ var Reveal = (function(){ // Store references to the previous and current slides currentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide; - // Show fragment, if specified if( typeof f !== 'undefined' ) { var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment' ) ); @@ -1530,10 +1619,14 @@ var Reveal = (function(){ updateControls(); updateProgress(); updateBackground(); + updateParallax(); + updateSlideNumber(); // Update the URL hash writeURL(); + cueAutoSlide(); + } /** @@ -1561,7 +1654,8 @@ var Reveal = (function(){ updateControls(); updateProgress(); - updateBackground(); + updateBackground( true ); + updateSlideNumber(); } @@ -1614,16 +1708,23 @@ var Reveal = (function(){ if( i < index ) { // Any element previous to index is given the 'past' class element.classList.add( reverse ? 'future' : 'past' ); + + var pastFragments = toArray( element.querySelectorAll( '.fragment' ) ); + + // Show all fragments on prior slides + while( pastFragments.length ) { + pastFragments.pop().classList.add( 'visible' ); + } } else if( i > index ) { // Any element subsequent to index is given the 'future' class element.classList.add( reverse ? 'past' : 'future' ); - var fragments = toArray( element.querySelectorAll( '.fragment.visible' ) ); + var futureFragments = toArray( element.querySelectorAll( '.fragment.visible' ) ); // No fragments in future slides should be visible ahead of time - while( fragments.length ) { - fragments.pop().classList.remove( 'visible' ); + while( futureFragments.length ) { + futureFragments.pop().classList.remove( 'visible' ); } } @@ -1644,18 +1745,6 @@ var Reveal = (function(){ state = state.concat( slideState.split( ' ' ) ); } - // If this slide has a data-autoslide attribute associated use this as - // autoSlide value otherwise use the global configured time - var slideAutoSlide = slides[index].getAttribute( 'data-autoslide' ); - if( slideAutoSlide ) { - autoSlide = parseInt( slideAutoSlide, 10 ); - } - else { - autoSlide = config.autoSlide; - } - - cueAutoSlide(); - } else { // Since there are no slides we can't be anywhere beyond the @@ -1772,6 +1861,25 @@ var Reveal = (function(){ } /** + * Updates the slide number div to reflect the current slide. + */ + function updateSlideNumber() { + + // Update slide number if enabled + if( config.slideNumber && dom.slideNumber) { + + // Display the number of the page using 'indexh - indexv' format + var indexString = indexh; + if( indexv > 0 ) { + indexString += ' - ' + indexv; + } + + dom.slideNumber.innerHTML = indexString; + } + + } + + /** * Updates the state of all control/navigation arrows. */ function updateControls() { @@ -1822,29 +1930,70 @@ var Reveal = (function(){ } /** - * Updates the background elements to reflect the current + * Updates the background elements to reflect the current * slide. + * + * @param {Boolean} includeAll If true, the backgrounds of + * all vertical slides (not just the present) will be updated. */ - function updateBackground() { + function updateBackground( includeAll ) { + + var currentBackground = null; + + // Reverse past/future classes when in RTL mode + var horizontalPast = config.rtl ? 'future' : 'past', + horizontalFuture = config.rtl ? 'past' : 'future'; - // Update the classes of all backgrounds to match the + // Update the classes of all backgrounds to match the // states of their slides (past/present/future) toArray( dom.background.childNodes ).forEach( function( backgroundh, h ) { - // Reverse past/future classes when in RTL mode - var horizontalPast = config.rtl ? 'future' : 'past', - horizontalFuture = config.rtl ? 'past' : 'future'; + if( h < indexh ) { + backgroundh.className = 'slide-background ' + horizontalPast; + } + else if ( h > indexh ) { + backgroundh.className = 'slide-background ' + horizontalFuture; + } + else { + backgroundh.className = 'slide-background present'; + + // Store a reference to the current background element + currentBackground = backgroundh; + } - backgroundh.className = 'slide-background ' + ( h < indexh ? horizontalPast : h > indexh ? horizontalFuture : 'present' ); + if( includeAll || h === indexh ) { + toArray( backgroundh.childNodes ).forEach( function( backgroundv, v ) { - toArray( backgroundh.childNodes ).forEach( function( backgroundv, v ) { + if( v < indexv ) { + backgroundv.className = 'slide-background past'; + } + else if ( v > indexv ) { + backgroundv.className = 'slide-background future'; + } + else { + backgroundv.className = 'slide-background present'; - backgroundv.className = 'slide-background ' + ( v < indexv ? 'past' : v > indexv ? 'future' : 'present' ); + // Only if this is the present horizontal and vertical slide + if( h === indexh ) currentBackground = backgroundv; + } - } ); + } ); + } } ); + // Don't transition between identical backgrounds. This + // prevents unwanted flicker. + if( currentBackground ) { + var previousBackgroundHash = previousBackground ? previousBackground.getAttribute( 'data-background-hash' ) : null; + var currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' ); + if( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== previousBackground ) { + dom.background.classList.add( 'no-transition' ); + } + + previousBackground = currentBackground; + } + // Allow the first background to apply without transition setTimeout( function() { dom.background.classList.remove( 'no-transition' ); @@ -1853,6 +2002,42 @@ var Reveal = (function(){ } /** + * Updates the position of the parallax background based + * on the current slide index. + */ + function updateParallax() { + + if( config.parallaxBackgroundImage ) { + + var horizontalSlides = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ), + verticalSlides = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); + + var backgroundSize = dom.background.style.backgroundSize.split( ' ' ), + backgroundWidth, backgroundHeight; + + if( backgroundSize.length === 1 ) { + backgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 ); + } + else { + backgroundWidth = parseInt( backgroundSize[0], 10 ); + backgroundHeight = parseInt( backgroundSize[1], 10 ); + } + + var slideWidth = dom.background.offsetWidth; + var horizontalSlideCount = horizontalSlides.length; + var horizontalOffset = -( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) * indexh; + + var slideHeight = dom.background.offsetHeight; + var verticalSlideCount = verticalSlides.length; + var verticalOffset = verticalSlideCount > 0 ? -( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 ) * indexv : 0; + + dom.background.style.backgroundPosition = horizontalOffset + 'px ' + verticalOffset + 'px'; + + } + + } + + /** * Determine what available routes there are for navigation. * * @return {Object} containing four booleans: left/right/up/down @@ -1909,7 +2094,7 @@ var Reveal = (function(){ */ function startEmbeddedContent( slide ) { - if( slide ) { + if( slide && !isSpeakerNotes() ) { // HTML5 media elements toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { if( el.hasAttribute( 'data-autoplay' ) ) { @@ -1917,10 +2102,15 @@ var Reveal = (function(){ } } ); + // iframe embeds + toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) { + el.contentWindow.postMessage( 'slide:start', '*' ); + }); + // YouTube embeds toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { if( el.hasAttribute( 'data-autoplay' ) ) { - el.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*'); + el.contentWindow.postMessage( '{"event":"command","func":"playVideo","args":""}', '*' ); } }); } @@ -1941,10 +2131,15 @@ var Reveal = (function(){ } } ); + // iframe embeds + toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) { + el.contentWindow.postMessage( 'slide:stop', '*' ); + }); + // YouTube embeds toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) { - el.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*'); + el.contentWindow.postMessage( '{"event":"command","func":"pauseVideo","args":""}', '*' ); } }); } @@ -1952,6 +2147,16 @@ var Reveal = (function(){ } /** + * Checks if this presentation is running inside of the + * speaker notes window. + */ + function isSpeakerNotes() { + + return !!window.location.search.match( /receiver/gi ); + + } + + /** * Reads the current URL (hash) and navigates accordingly. */ function readURL() { @@ -2146,11 +2351,42 @@ var Reveal = (function(){ */ function cueAutoSlide() { - clearTimeout( autoSlideTimeout ); + cancelAutoSlide(); + + if( currentSlide ) { + + var parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null; + var slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' ); + + // Pick value in the following priority order: + // 1. Current slide's data-autoslide + // 2. Parent slide's data-autoslide + // 3. Global autoSlide setting + if( slideAutoSlide ) { + autoSlide = parseInt( slideAutoSlide, 10 ); + } + else if( parentAutoSlide ) { + autoSlide = parseInt( parentAutoSlide, 10 ); + } + else { + autoSlide = config.autoSlide; + } + + // Cue the next auto-slide if: + // - There is an autoSlide value + // - Auto-sliding isn't paused by the user + // - The presentation isn't paused + // - The overview isn't active + // - The presentation isn't over + if( autoSlide && !autoSlidePaused && !isPaused() && !isOverview() && ( !Reveal.isLastSlide() || config.loop === true ) ) { + autoSlideTimeout = setTimeout( navigateNext, autoSlide ); + autoSlideStartTime = Date.now(); + } + + if( autoSlidePlayer ) { + autoSlidePlayer.setPlaying( autoSlideTimeout !== -1 ); + } - // Cue the next auto-slide if enabled - if( autoSlide && !isPaused() && !isOverview() ) { - autoSlideTimeout = setTimeout( navigateNext, autoSlide ); } } @@ -2161,6 +2397,25 @@ var Reveal = (function(){ function cancelAutoSlide() { clearTimeout( autoSlideTimeout ); + autoSlideTimeout = -1; + + } + + function pauseAutoSlide() { + + autoSlidePaused = true; + clearTimeout( autoSlideTimeout ); + + if( autoSlidePlayer ) { + autoSlidePlayer.setPlaying( false ); + } + + } + + function resumeAutoSlide() { + + autoSlidePaused = false; + cueAutoSlide(); } @@ -2260,14 +2515,25 @@ var Reveal = (function(){ // ----------------------------- EVENTS -------------------------------// // --------------------------------------------------------------------// + /** + * Called by all event handlers that are based on user + * input. + */ + function onUserInput( event ) { + + if( config.autoSlideStoppable ) { + pauseAutoSlide(); + } + + } /** * Handler for the document level 'keydown' event. - * - * @param {Object} event */ function onDocumentKeyDown( event ) { + onUserInput( event ); + // Check if there's a focused element that could be using // the keyboard var activeElement = document.activeElement; @@ -2354,8 +2620,13 @@ var Reveal = (function(){ event.preventDefault(); } // ESC or O key - else if ( ( event.keyCode === 27 || event.keyCode === 79 ) && supports3DTransforms ) { - toggleOverview(); + else if ( ( event.keyCode === 27 || event.keyCode === 79 ) && features.transforms3d ) { + if( dom.preview ) { + closePreview(); + } + else { + toggleOverview(); + } event.preventDefault(); } @@ -2397,6 +2668,8 @@ var Reveal = (function(){ // Each touch should only trigger one action if( !touch.captured ) { + onUserInput( event ); + var currentX = event.touches[0].clientX; var currentY = event.touches[0].clientY; @@ -2550,6 +2823,8 @@ var Reveal = (function(){ */ function onProgressClicked( event ) { + onUserInput( event ); + event.preventDefault(); var slidesTotal = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).length; @@ -2562,12 +2837,12 @@ var Reveal = (function(){ /** * Event handler for navigation control buttons. */ - function onNavigateLeftClicked( event ) { event.preventDefault(); navigateLeft(); } - function onNavigateRightClicked( event ) { event.preventDefault(); navigateRight(); } - function onNavigateUpClicked( event ) { event.preventDefault(); navigateUp(); } - function onNavigateDownClicked( event ) { event.preventDefault(); navigateDown(); } - function onNavigatePrevClicked( event ) { event.preventDefault(); navigatePrev(); } - function onNavigateNextClicked( event ) { event.preventDefault(); navigateNext(); } + function onNavigateLeftClicked( event ) { event.preventDefault(); onUserInput(); navigateLeft(); } + function onNavigateRightClicked( event ) { event.preventDefault(); onUserInput(); navigateRight(); } + function onNavigateUpClicked( event ) { event.preventDefault(); onUserInput(); navigateUp(); } + function onNavigateDownClicked( event ) { event.preventDefault(); onUserInput(); navigateDown(); } + function onNavigatePrevClicked( event ) { event.preventDefault(); onUserInput(); navigatePrev(); } + function onNavigateNextClicked( event ) { event.preventDefault(); onUserInput(); navigateNext(); } /** * Handler for the window level 'hashchange' event. @@ -2588,6 +2863,24 @@ var Reveal = (function(){ } /** + * Handle for the window level 'visibilitychange' event. + */ + function onPageVisibilityChange( event ) { + + var isHidden = document.webkitHidden || + document.msHidden || + document.hidden; + + // If, after clicking a link or similar and we're coming back, + // focus the document.body to ensure we can use keyboard shortcuts + if( isHidden === false && document.activeElement !== document.body ) { + document.activeElement.blur(); + document.body.focus(); + } + + } + + /** * Invoked when a slide is and we're in the overview. */ function onOverviewSlideClicked( event ) { @@ -2633,6 +2926,191 @@ var Reveal = (function(){ } + /** + * Handles click on the auto-sliding controls element. + */ + function onAutoSlidePlayerClick( event ) { + + // Replay + if( Reveal.isLastSlide() && config.loop === false ) { + slide( 0, 0 ); + resumeAutoSlide(); + } + // Resume + else if( autoSlidePaused ) { + resumeAutoSlide(); + } + // Pause + else { + pauseAutoSlide(); + } + + } + + + // --------------------------------------------------------------------// + // ------------------------ PLAYBACK COMPONENT ------------------------// + // --------------------------------------------------------------------// + + + /** + * Constructor for the playback component, which displays + * play/pause/progress controls. + * + * @param {HTMLElement} container The component will append + * itself to this + * @param {Function} progressCheck A method which will be + * called frequently to get the current progress on a range + * of 0-1 + */ + function Playback( container, progressCheck ) { + + // Cosmetics + this.diameter = 50; + this.thickness = 3; + + // Flags if we are currently playing + this.playing = false; + + // Current progress on a 0-1 range + this.progress = 0; + + // Used to loop the animation smoothly + this.progressOffset = 1; + + this.container = container; + this.progressCheck = progressCheck; + + this.canvas = document.createElement( 'canvas' ); + this.canvas.className = 'playback'; + this.canvas.width = this.diameter; + this.canvas.height = this.diameter; + this.context = this.canvas.getContext( '2d' ); + + this.container.appendChild( this.canvas ); + + this.render(); + + } + + Playback.prototype.setPlaying = function( value ) { + + var wasPlaying = this.playing; + + this.playing = value; + + // Start repainting if we weren't already + if( !wasPlaying && this.playing ) { + this.animate(); + } + else { + this.render(); + } + + }; + + Playback.prototype.animate = function() { + + var progressBefore = this.progress; + + this.progress = this.progressCheck(); + + // When we loop, offset the progress so that it eases + // smoothly rather than immediately resetting + if( progressBefore > 0.8 && this.progress < 0.2 ) { + this.progressOffset = this.progress; + } + + this.render(); + + if( this.playing ) { + features.requestAnimationFrameMethod.call( window, this.animate.bind( this ) ); + } + + }; + + /** + * Renders the current progress and playback state. + */ + Playback.prototype.render = function() { + + var progress = this.playing ? this.progress : 0, + radius = ( this.diameter / 2 ) - this.thickness, + x = this.diameter / 2, + y = this.diameter / 2, + iconSize = 14; + + // Ease towards 1 + this.progressOffset += ( 1 - this.progressOffset ) * 0.1; + + var endAngle = ( - Math.PI / 2 ) + ( progress * ( Math.PI * 2 ) ); + var startAngle = ( - Math.PI / 2 ) + ( this.progressOffset * ( Math.PI * 2 ) ); + + this.context.save(); + this.context.clearRect( 0, 0, this.diameter, this.diameter ); + + // Solid background color + this.context.beginPath(); + this.context.arc( x, y, radius + 2, 0, Math.PI * 2, false ); + this.context.fillStyle = 'rgba( 0, 0, 0, 0.4 )'; + this.context.fill(); + + // Draw progress track + this.context.beginPath(); + this.context.arc( x, y, radius, 0, Math.PI * 2, false ); + this.context.lineWidth = this.thickness; + this.context.strokeStyle = '#666'; + this.context.stroke(); + + if( this.playing ) { + // Draw progress on top of track + this.context.beginPath(); + this.context.arc( x, y, radius, startAngle, endAngle, false ); + this.context.lineWidth = this.thickness; + this.context.strokeStyle = '#fff'; + this.context.stroke(); + } + + this.context.translate( x - ( iconSize / 2 ), y - ( iconSize / 2 ) ); + + // Draw play/pause icons + if( this.playing ) { + this.context.fillStyle = '#fff'; + this.context.fillRect( 0, 0, iconSize / 2 - 2, iconSize ); + this.context.fillRect( iconSize / 2 + 2, 0, iconSize / 2 - 2, iconSize ); + } + else { + this.context.beginPath(); + this.context.translate( 2, 0 ); + this.context.moveTo( 0, 0 ); + this.context.lineTo( iconSize - 2, iconSize / 2 ); + this.context.lineTo( 0, iconSize ); + this.context.fillStyle = '#fff'; + this.context.fill(); + } + + this.context.restore(); + + }; + + Playback.prototype.on = function( type, listener ) { + this.canvas.addEventListener( type, listener, false ); + }; + + Playback.prototype.off = function( type, listener ) { + this.canvas.removeEventListener( type, listener, false ); + }; + + Playback.prototype.destroy = function() { + + this.playing = false; + + if( this.canvas.parentNode ) { + this.container.removeChild( this.canvas ); + } + + }; + // --------------------------------------------------------------------// // ------------------------------- API --------------------------------// @@ -2730,6 +3208,15 @@ var Reveal = (function(){ query[ a.split( '=' ).shift() ] = a.split( '=' ).pop(); } ); + // Basic deserialization + for( var i in query ) { + var value = query[ i ]; + if( value === 'null' ) query[ i ] = null; + else if( value === 'true' ) query[ i ] = true; + else if( value === 'false' ) query[ i ] = false; + else if( !isNaN( parseFloat( value ) ) ) query[ i ] = parseFloat( value ); + } + return query; }, diff --git a/js/reveal.min.js b/js/reveal.min.js index 659fb8b..3f6cb3e 100644 --- a/js/reveal.min.js +++ b/js/reveal.min.js @@ -1,8 +1,9 @@ /*! - * reveal.js 2.6.0-dev (2013-09-04, 08:56) + * reveal.js 2.6.0-dev (2013-11-17, 17:12) * http://lab.hakim.se/reveal-js * MIT licensed * * Copyright (C) 2013 Hakim El Hattab, http://hakim.se */ -var Reveal=function(){"use strict";function a(a){return b(),Kb||Jb?(window.addEventListener("load",C,!1),l(Qb,a),s(),c(),void 0):(document.body.setAttribute("class","no-transforms"),void 0)}function b(){Jb="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,Kb="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,Lb=navigator.userAgent.match(/(iphone|ipod|android)/gi)}function c(){function a(){c.length&&head.js.apply(null,c),d()}for(var b=[],c=[],e=0,f=Qb.dependencies.length;f>e;e++){var g=Qb.dependencies[e];(!g.condition||g.condition())&&(g.async?c.push(g.src):b.push(g.src),"function"==typeof g.callback&&head.ready(g.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],g.callback))}b.length?(head.ready(a),head.js.apply(null,b)):a()}function d(){f(),e(),i(),_(),setTimeout(function(){Vb.slides.classList.remove("no-transition"),Rb=!0,u("ready",{indexh:Fb,indexv:Gb,currentSlide:Ib})},1)}function e(){var a=m(document.querySelectorAll(Nb));a.forEach(function(a){var b=m(a.querySelectorAll("section"));b.forEach(function(a,b){b>0&&a.classList.add("future")})})}function f(){Vb.theme=document.querySelector("#theme"),Vb.wrapper=document.querySelector(".reveal"),Vb.slides=document.querySelector(".reveal .slides"),Vb.slides.classList.add("no-transition"),Vb.background=g(Vb.wrapper,"div","backgrounds",null),Vb.progress=g(Vb.wrapper,"div","progress","<span></span>"),Vb.progressbar=Vb.progress.querySelector("span"),g(Vb.wrapper,"aside","controls",'<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>'),g(Vb.wrapper,"div","state-background",null),g(Vb.wrapper,"div","pause-overlay",null),Vb.controls=document.querySelector(".reveal .controls"),Vb.controlsLeft=m(document.querySelectorAll(".navigate-left")),Vb.controlsRight=m(document.querySelectorAll(".navigate-right")),Vb.controlsUp=m(document.querySelectorAll(".navigate-up")),Vb.controlsDown=m(document.querySelectorAll(".navigate-down")),Vb.controlsPrev=m(document.querySelectorAll(".navigate-prev")),Vb.controlsNext=m(document.querySelectorAll(".navigate-next"))}function g(a,b,c,d){var e=a.querySelector("."+c);return e||(e=document.createElement(b),e.classList.add(c),null!==d&&(e.innerHTML=d),a.appendChild(e)),e}function h(){function a(a,b){var c={background:a.getAttribute("data-background"),backgroundSize:a.getAttribute("data-background-size"),backgroundImage:a.getAttribute("data-background-image"),backgroundColor:a.getAttribute("data-background-color"),backgroundRepeat:a.getAttribute("data-background-repeat"),backgroundPosition:a.getAttribute("data-background-position"),backgroundTransition:a.getAttribute("data-background-transition")},d=document.createElement("div");return d.className="slide-background",c.background&&(/^(http|file|\/\/)/gi.test(c.background)||/\.(png|jpg|jpeg|gif|bmp)$/gi.test(c.background)?d.style.backgroundImage="url("+c.background+")":d.style.background=c.background),c.backgroundSize&&(d.style.backgroundSize=c.backgroundSize),c.backgroundImage&&(d.style.backgroundImage='url("'+c.backgroundImage+'")'),c.backgroundColor&&(d.style.backgroundColor=c.backgroundColor),c.backgroundRepeat&&(d.style.backgroundRepeat=c.backgroundRepeat),c.backgroundPosition&&(d.style.backgroundPosition=c.backgroundPosition),c.backgroundTransition&&d.setAttribute("data-background-transition",c.backgroundTransition),b.appendChild(d),d}r()&&document.body.classList.add("print-pdf"),Vb.background.innerHTML="",Vb.background.classList.add("no-transition"),m(document.querySelectorAll(Nb)).forEach(function(b){var c;c=r()?a(b,b):a(b,Vb.background),m(b.querySelectorAll("section")).forEach(function(b){r()?a(b,b):a(b,c)})})}function i(a){if(Vb.wrapper.classList.remove(Qb.transition),"object"==typeof a&&l(Qb,a),Jb===!1&&(Qb.transition="linear"),Vb.wrapper.classList.add(Qb.transition),Vb.wrapper.setAttribute("data-transition-speed",Qb.transitionSpeed),Vb.wrapper.setAttribute("data-background-transition",Qb.backgroundTransition),Vb.controls.style.display=Qb.controls?"block":"none",Vb.progress.style.display=Qb.progress?"block":"none",Qb.rtl?Vb.wrapper.classList.add("rtl"):Vb.wrapper.classList.remove("rtl"),Qb.center?Vb.wrapper.classList.add("center"):Vb.wrapper.classList.remove("center"),Qb.mouseWheel?(document.addEventListener("DOMMouseScroll",tb,!1),document.addEventListener("mousewheel",tb,!1)):(document.removeEventListener("DOMMouseScroll",tb,!1),document.removeEventListener("mousewheel",tb,!1)),Qb.rollingLinks?v():w(),Qb.previewLinks?x():(y(),x("[data-preview-link]")),Qb.theme&&Vb.theme){var b=Vb.theme.getAttribute("href"),c=/[^\/]*?(?=\.css)/,d=b.match(c)[0];Qb.theme!==d&&(b=b.replace(c,Qb.theme),Vb.theme.setAttribute("href",b))}R()}function j(){_b=!0,window.addEventListener("hashchange",Bb,!1),window.addEventListener("resize",Cb,!1),Qb.touch&&(Vb.wrapper.addEventListener("touchstart",nb,!1),Vb.wrapper.addEventListener("touchmove",ob,!1),Vb.wrapper.addEventListener("touchend",pb,!1),window.navigator.msPointerEnabled&&(Vb.wrapper.addEventListener("MSPointerDown",qb,!1),Vb.wrapper.addEventListener("MSPointerMove",rb,!1),Vb.wrapper.addEventListener("MSPointerUp",sb,!1))),Qb.keyboard&&document.addEventListener("keydown",mb,!1),Qb.progress&&Vb.progress&&Vb.progress.addEventListener("click",ub,!1),["touchstart","click"].forEach(function(a){Vb.controlsLeft.forEach(function(b){b.addEventListener(a,vb,!1)}),Vb.controlsRight.forEach(function(b){b.addEventListener(a,wb,!1)}),Vb.controlsUp.forEach(function(b){b.addEventListener(a,xb,!1)}),Vb.controlsDown.forEach(function(b){b.addEventListener(a,yb,!1)}),Vb.controlsPrev.forEach(function(b){b.addEventListener(a,zb,!1)}),Vb.controlsNext.forEach(function(b){b.addEventListener(a,Ab,!1)})})}function k(){_b=!1,document.removeEventListener("keydown",mb,!1),window.removeEventListener("hashchange",Bb,!1),window.removeEventListener("resize",Cb,!1),Vb.wrapper.removeEventListener("touchstart",nb,!1),Vb.wrapper.removeEventListener("touchmove",ob,!1),Vb.wrapper.removeEventListener("touchend",pb,!1),window.navigator.msPointerEnabled&&(Vb.wrapper.removeEventListener("MSPointerDown",qb,!1),Vb.wrapper.removeEventListener("MSPointerMove",rb,!1),Vb.wrapper.removeEventListener("MSPointerUp",sb,!1)),Qb.progress&&Vb.progress&&Vb.progress.removeEventListener("click",ub,!1),["touchstart","click"].forEach(function(a){Vb.controlsLeft.forEach(function(b){b.removeEventListener(a,vb,!1)}),Vb.controlsRight.forEach(function(b){b.removeEventListener(a,wb,!1)}),Vb.controlsUp.forEach(function(b){b.removeEventListener(a,xb,!1)}),Vb.controlsDown.forEach(function(b){b.removeEventListener(a,yb,!1)}),Vb.controlsPrev.forEach(function(b){b.removeEventListener(a,zb,!1)}),Vb.controlsNext.forEach(function(b){b.removeEventListener(a,Ab,!1)})})}function l(a,b){for(var c in b)a[c]=b[c]}function m(a){return Array.prototype.slice.call(a)}function n(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function o(a,b){a.style.WebkitTransform=b,a.style.MozTransform=b,a.style.msTransform=b,a.style.OTransform=b,a.style.transform=b}function p(a){var b=0;if(a){var c=0;m(a.childNodes).forEach(function(a){"number"==typeof a.offsetTop&&a.style&&("absolute"===a.style.position&&(c+=1),b=Math.max(b,a.offsetTop+a.offsetHeight))}),0===c&&(b=a.offsetHeight)}return b}function q(a,b){if(b=b||0,a){var c=a.parentNode,d=c.childNodes;m(d).forEach(function(c){if("number"==typeof c.offsetHeight&&c!==a){var d=window.getComputedStyle(c),e=parseInt(d.marginTop,10),f=parseInt(d.marginBottom,10);b-=c.offsetHeight+e+f}});var e=window.getComputedStyle(a);b-=parseInt(e.marginTop,10)+parseInt(e.marginBottom,10)}return b}function r(){return/print-pdf/gi.test(window.location.search)}function s(){Lb&&(window.addEventListener("load",t,!1),window.addEventListener("orientationchange",t,!1))}function t(){0!==window.orientation||/crios/gi.test(navigator.userAgent)?(document.documentElement.style.overflow="",document.body.style.height="100%"):(document.documentElement.style.overflow="scroll",document.body.style.height="120%"),setTimeout(function(){window.scrollTo(0,1)},10)}function u(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),l(c,b),Vb.wrapper.dispatchEvent(c)}function v(){if(Jb&&!("msPerspective"in document.body.style))for(var a=document.querySelectorAll(Mb+" a:not(.image)"),b=0,c=a.length;c>b;b++){var d=a[b];if(!(!d.textContent||d.querySelector("*")||d.className&&d.classList.contains(d,"roll"))){var e=document.createElement("span");e.setAttribute("data-title",d.text),e.innerHTML=d.innerHTML,d.classList.add("roll"),d.innerHTML="",d.appendChild(e)}}}function w(){for(var a=document.querySelectorAll(Mb+" a.roll"),b=0,c=a.length;c>b;b++){var d=a[b],e=d.querySelector("span");e&&(d.classList.remove("roll"),d.innerHTML=e.innerHTML)}}function x(a){var b=m(document.querySelectorAll(a?a:"a"));b.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.addEventListener("click",Eb,!1)})}function y(){var a=m(document.querySelectorAll("a"));a.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.removeEventListener("click",Eb,!1)})}function z(a){A(),Vb.preview=document.createElement("div"),Vb.preview.classList.add("preview-link-overlay"),Vb.wrapper.appendChild(Vb.preview),Vb.preview.innerHTML=["<header>",'<a class="close" href="#"><span class="icon"></span></a>','<a class="external" href="'+a+'" target="_blank"><span class="icon"></span></a>',"</header>",'<div class="spinner"></div>','<div class="viewport">','<iframe src="'+a+'"></iframe>',"</div>"].join(""),Vb.preview.querySelector("iframe").addEventListener("load",function(){Vb.preview.classList.add("loaded")},!1),Vb.preview.querySelector(".close").addEventListener("click",function(a){A(),a.preventDefault()},!1),Vb.preview.querySelector(".external").addEventListener("click",function(){A()},!1),setTimeout(function(){Vb.preview.classList.add("visible")},1)}function A(){Vb.preview&&(Vb.preview.setAttribute("src",""),Vb.preview.parentNode.removeChild(Vb.preview),Vb.preview=null)}function B(a){var b=m(a);return b.forEach(function(a,b){a.hasAttribute("data-fragment-index")||a.setAttribute("data-fragment-index",b)}),b.sort(function(a,b){return a.getAttribute("data-fragment-index")-b.getAttribute("data-fragment-index")}),b}function C(){if(Vb.wrapper&&!r()){var a=Vb.wrapper.offsetWidth,b=Vb.wrapper.offsetHeight;a-=b*Qb.margin,b-=b*Qb.margin;var c=Qb.width,d=Qb.height,e=20;D(Qb.width,Qb.height,e),"string"==typeof c&&/%$/.test(c)&&(c=parseInt(c,10)/100*a),"string"==typeof d&&/%$/.test(d)&&(d=parseInt(d,10)/100*b),Vb.slides.style.width=c+"px",Vb.slides.style.height=d+"px",Ub=Math.min(a/c,b/d),Ub=Math.max(Ub,Qb.minScale),Ub=Math.min(Ub,Qb.maxScale),"undefined"==typeof Vb.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)?o(Vb.slides,"translate(-50%, -50%) scale("+Ub+") translate(50%, 50%)"):Vb.slides.style.zoom=Ub;for(var f=m(document.querySelectorAll(Mb)),g=0,h=f.length;h>g;g++){var i=f[g];"none"!==i.style.display&&(i.style.top=Qb.center?i.classList.contains("stack")?0:Math.max(-(p(i)/2)-e,-d/2)+"px":"")}U()}}function D(a,b,c){m(Vb.slides.querySelectorAll("section > .stretch")).forEach(function(d){var e=q(d,b-2*c);if(/(img|video)/gi.test(d.nodeName)){var f=d.naturalWidth||d.videoWidth,g=d.naturalHeight||d.videoHeight,h=Math.min(a/f,e/g);d.style.width=f*h+"px",d.style.height=g*h+"px"}else d.style.width=a+"px",d.style.height=e+"px"})}function E(a,b){"object"==typeof a&&"function"==typeof a.setAttribute&&a.setAttribute("data-previous-indexv",b||0)}function F(a){if("object"==typeof a&&"function"==typeof a.setAttribute&&a.classList.contains("stack")){var b=a.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(a.getAttribute(b)||0,10)}return 0}function G(){if(Qb.overview){fb();var a=Vb.wrapper.classList.contains("overview"),b=window.innerWidth<400?1e3:2500;Vb.wrapper.classList.add("overview"),Vb.wrapper.classList.remove("overview-deactivating"),clearTimeout(Zb),clearTimeout($b),Zb=setTimeout(function(){for(var c=document.querySelectorAll(Nb),d=0,e=c.length;e>d;d++){var f=c[d],g=Qb.rtl?-105:105;if(f.setAttribute("data-index-h",d),o(f,"translateZ(-"+b+"px) translate("+(d-Fb)*g+"%, 0%)"),f.classList.contains("stack"))for(var h=f.querySelectorAll("section"),i=0,j=h.length;j>i;i++){var k=d===Fb?Gb:F(f),l=h[i];l.setAttribute("data-index-h",d),l.setAttribute("data-index-v",i),o(l,"translate(0%, "+105*(i-k)+"%)"),l.addEventListener("click",Db,!0)}else f.addEventListener("click",Db,!0)}T(),C(),a||u("overviewshown",{indexh:Fb,indexv:Gb,currentSlide:Ib})},10)}}function H(){Qb.overview&&(clearTimeout(Zb),clearTimeout($b),Vb.wrapper.classList.remove("overview"),Vb.wrapper.classList.add("overview-deactivating"),$b=setTimeout(function(){Vb.wrapper.classList.remove("overview-deactivating")},1),m(document.querySelectorAll(Mb)).forEach(function(a){o(a,""),a.removeEventListener("click",Db,!0)}),Q(Fb,Gb),eb(),u("overviewhidden",{indexh:Fb,indexv:Gb,currentSlide:Ib}))}function I(a){"boolean"==typeof a?a?G():H():J()?H():G()}function J(){return Vb.wrapper.classList.contains("overview")}function K(a){return a=a?a:Ib,a&&a.parentNode&&!!a.parentNode.nodeName.match(/section/i)}function L(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullscreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&b.apply(a)}function M(){var a=Vb.wrapper.classList.contains("paused");fb(),Vb.wrapper.classList.add("paused"),a===!1&&u("paused")}function N(){var a=Vb.wrapper.classList.contains("paused");Vb.wrapper.classList.remove("paused"),eb(),a&&u("resumed")}function O(){P()?N():M()}function P(){return Vb.wrapper.classList.contains("paused")}function Q(a,b,c,d){Hb=Ib;var e=document.querySelectorAll(Nb);void 0===b&&(b=F(e[a])),Hb&&Hb.parentNode&&Hb.parentNode.classList.contains("stack")&&E(Hb.parentNode,Gb);var f=Tb.concat();Tb.length=0;var g=Fb||0,h=Gb||0;Fb=S(Nb,void 0===a?Fb:a),Gb=S(Ob,void 0===b?Gb:b),T(),C();a:for(var i=0,j=Tb.length;j>i;i++){for(var k=0;k<f.length;k++)if(f[k]===Tb[i]){f.splice(k,1);continue a}document.documentElement.classList.add(Tb[i]),u(Tb[i])}for(;f.length;)document.documentElement.classList.remove(f.pop());J()&&G();var l=e[Fb],n=l.querySelectorAll("section");if(Ib=n[Gb]||l,"undefined"!=typeof c){var o=B(Ib.querySelectorAll(".fragment"));m(o).forEach(function(a,b){c>b?a.classList.add("visible"):a.classList.remove("visible")})}var p=Fb!==g||Gb!==h;p?u("slidechanged",{indexh:Fb,indexv:Gb,previousSlide:Hb,currentSlide:Ib,origin:d}):Hb=null,Hb&&(Hb.classList.remove("present"),document.querySelector(Pb).classList.contains("present")&&setTimeout(function(){var a,b=m(document.querySelectorAll(Nb+".stack"));for(a in b)b[a]&&E(b[a],0)},0)),p&&($(Hb),Z(Ib)),V(),U(),W(),ab()}function R(){k(),j(),C(),Sb=Qb.autoSlide,eb(),h(),V(),U(),W()}function S(a,b){var c=m(document.querySelectorAll(a)),d=c.length;if(d){Qb.loop&&(b%=d,0>b&&(b=d+b)),b=Math.max(Math.min(b,d-1),0);for(var e=0;d>e;e++){var f=c[e],g=Qb.rtl&&!K(f);if(f.classList.remove("past"),f.classList.remove("present"),f.classList.remove("future"),f.setAttribute("hidden",""),b>e)f.classList.add(g?"future":"past");else if(e>b){f.classList.add(g?"past":"future");for(var h=m(f.querySelectorAll(".fragment.visible"));h.length;)h.pop().classList.remove("visible")}f.querySelector("section")&&f.classList.add("stack")}c[b].classList.add("present"),c[b].removeAttribute("hidden");var i=c[b].getAttribute("data-state");i&&(Tb=Tb.concat(i.split(" ")));var j=c[b].getAttribute("data-autoslide");Sb=j?parseInt(j,10):Qb.autoSlide,eb()}else b=0;return b}function T(){var a,b,c=m(document.querySelectorAll(Nb)),d=c.length;if(d){var e=J()?10:Qb.viewDistance;Lb&&(e=J()?6:1);for(var f=0;d>f;f++){var g=c[f],h=m(g.querySelectorAll("section")),i=h.length;if(a=Math.abs((Fb-f)%(d-e))||0,g.style.display=a>e?"none":"block",i)for(var j=F(g),k=0;i>k;k++){var l=h[k];b=f===Fb?Math.abs(Gb-k):Math.abs(k-j),l.style.display=a+b>e?"none":"block"}}}}function U(){if(Qb.progress&&Vb.progress){var a=m(document.querySelectorAll(Nb)),b=document.querySelectorAll(Mb+":not(.stack)").length,c=0;a:for(var d=0;d<a.length;d++){for(var e=a[d],f=m(e.querySelectorAll("section")),g=0;g<f.length;g++){if(f[g].classList.contains("present"))break a;c++}if(e.classList.contains("present"))break;e.classList.contains("stack")===!1&&c++}Vb.progressbar.style.width=c/(b-1)*window.innerWidth+"px"}}function V(){var a=X(),b=Y();Vb.controlsLeft.concat(Vb.controlsRight).concat(Vb.controlsUp).concat(Vb.controlsDown).concat(Vb.controlsPrev).concat(Vb.controlsNext).forEach(function(a){a.classList.remove("enabled"),a.classList.remove("fragmented")}),a.left&&Vb.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&Vb.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&Vb.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&Vb.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&Vb.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&Vb.controlsNext.forEach(function(a){a.classList.add("enabled")}),Ib&&(b.prev&&Vb.controlsPrev.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&Vb.controlsNext.forEach(function(a){a.classList.add("fragmented","enabled")}),K(Ib)?(b.prev&&Vb.controlsUp.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&Vb.controlsDown.forEach(function(a){a.classList.add("fragmented","enabled")})):(b.prev&&Vb.controlsLeft.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&Vb.controlsRight.forEach(function(a){a.classList.add("fragmented","enabled")})))}function W(){m(Vb.background.childNodes).forEach(function(a,b){var c=Qb.rtl?"future":"past",d=Qb.rtl?"past":"future";a.className="slide-background "+(Fb>b?c:b>Fb?d:"present"),m(a.childNodes).forEach(function(a,b){a.className="slide-background "+(Gb>b?"past":b>Gb?"future":"present")})}),setTimeout(function(){Vb.background.classList.remove("no-transition")},1)}function X(){var a=document.querySelectorAll(Nb),b=document.querySelectorAll(Ob),c={left:Fb>0||Qb.loop,right:Fb<a.length-1||Qb.loop,up:Gb>0,down:Gb<b.length-1};if(Qb.rtl){var d=c.left;c.left=c.right,c.right=d}return c}function Y(){if(Ib&&Qb.fragments){var a=Ib.querySelectorAll(".fragment"),b=Ib.querySelectorAll(".fragment:not(.visible)");return{prev:a.length-b.length>0,next:!!b.length}}return{prev:!1,next:!1}}function Z(a){a&&(m(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&a.play()}),m(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function $(a){a&&(m(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-ignore")||a.pause()}),m(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-ignore")||"function"!=typeof a.contentWindow.postMessage||a.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function _(){var a=window.location.hash,b=a.slice(2).split("/"),c=a.replace(/#|\//gi,"");if(isNaN(parseInt(b[0],10))&&c.length){var d=document.querySelector("#"+c);if(d){var e=Reveal.getIndices(d);Q(e.h,e.v)}else Q(Fb||0,Gb||0)}else{var f=parseInt(b[0],10)||0,g=parseInt(b[1],10)||0;(f!==Fb||g!==Gb)&&Q(f,g)}}function ab(a){if(Qb.history)if(clearTimeout(Yb),"number"==typeof a)Yb=setTimeout(ab,a);else{var b="/";Ib&&"string"==typeof Ib.getAttribute("id")?b="/"+Ib.getAttribute("id"):((Fb>0||Gb>0)&&(b+=Fb),Gb>0&&(b+="/"+Gb)),window.location.hash=b}}function bb(a){var b,c=Fb,d=Gb;if(a){var e=K(a),f=e?a.parentNode:a,g=m(document.querySelectorAll(Nb));c=Math.max(g.indexOf(f),0),e&&(d=Math.max(m(a.parentNode.querySelectorAll("section")).indexOf(a),0))}if(!a&&Ib){var h=Ib.querySelectorAll(".fragment").length>0;if(h){var i=Ib.querySelectorAll(".fragment.visible");b=i.length}}return{h:c,v:d,f:b}}function cb(){if(Ib&&Qb.fragments){var a=B(Ib.querySelectorAll(".fragment:not(.visible)"));if(a.length){var b=a[0].getAttribute("data-fragment-index");return a=Ib.querySelectorAll('.fragment[data-fragment-index="'+b+'"]'),m(a).forEach(function(a){a.classList.add("visible")}),u("fragmentshown",{fragment:a[0],fragments:a}),V(),!0}}return!1}function db(){if(Ib&&Qb.fragments){var a=B(Ib.querySelectorAll(".fragment.visible"));if(a.length){var b=a[a.length-1].getAttribute("data-fragment-index");return a=Ib.querySelectorAll('.fragment[data-fragment-index="'+b+'"]'),m(a).forEach(function(a){a.classList.remove("visible")}),u("fragmenthidden",{fragment:a[0],fragments:a}),V(),!0}}return!1}function eb(){clearTimeout(Xb),!Sb||P()||J()||(Xb=setTimeout(lb,Sb))}function fb(){clearTimeout(Xb)}function gb(){Qb.rtl?(J()||cb()===!1)&&X().left&&Q(Fb+1):(J()||db()===!1)&&X().left&&Q(Fb-1)}function hb(){Qb.rtl?(J()||db()===!1)&&X().right&&Q(Fb-1):(J()||cb()===!1)&&X().right&&Q(Fb+1)}function ib(){(J()||db()===!1)&&X().up&&Q(Fb,Gb-1)}function jb(){(J()||cb()===!1)&&X().down&&Q(Fb,Gb+1)}function kb(){if(db()===!1)if(X().up)ib();else{var a=document.querySelector(Nb+".past:nth-child("+Fb+")");if(a){var b=a.querySelectorAll("section").length-1||void 0,c=Fb-1;Q(c,b)}}}function lb(){cb()===!1&&(X().down?jb():hb()),eb()}function mb(a){document.activeElement;var b=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(b||a.shiftKey&&32!==a.keyCode||a.altKey||a.ctrlKey||a.metaKey)){if(P()&&-1===[66,190,191].indexOf(a.keyCode))return!1;var c=!1;if("object"==typeof Qb.keyboard)for(var d in Qb.keyboard)if(parseInt(d,10)===a.keyCode){var e=Qb.keyboard[d];"function"==typeof e?e.apply(null,[a]):"string"==typeof e&&"function"==typeof Reveal[e]&&Reveal[e].call(),c=!0}if(c===!1)switch(c=!0,a.keyCode){case 80:case 33:kb();break;case 78:case 34:lb();break;case 72:case 37:gb();break;case 76:case 39:hb();break;case 75:case 38:ib();break;case 74:case 40:jb();break;case 36:Q(0);break;case 35:Q(Number.MAX_VALUE);break;case 32:J()?H():a.shiftKey?kb():lb();break;case 13:J()?H():c=!1;break;case 66:case 190:case 191:O();break;case 70:L();break;default:c=!1}c?a.preventDefault():27!==a.keyCode&&79!==a.keyCode||!Jb||(I(),a.preventDefault()),eb()}}function nb(a){ac.startX=a.touches[0].clientX,ac.startY=a.touches[0].clientY,ac.startCount=a.touches.length,2===a.touches.length&&Qb.overview&&(ac.startSpan=n({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:ac.startX,y:ac.startY}))}function ob(a){if(ac.captured)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===ac.startCount&&Qb.overview){var d=n({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:ac.startX,y:ac.startY});Math.abs(ac.startSpan-d)>ac.threshold&&(ac.captured=!0,d<ac.startSpan?G():H()),a.preventDefault()}else if(1===a.touches.length&&2!==ac.startCount){var e=b-ac.startX,f=c-ac.startY;e>ac.threshold&&Math.abs(e)>Math.abs(f)?(ac.captured=!0,gb()):e<-ac.threshold&&Math.abs(e)>Math.abs(f)?(ac.captured=!0,hb()):f>ac.threshold?(ac.captured=!0,ib()):f<-ac.threshold&&(ac.captured=!0,jb()),Qb.embedded?(ac.captured||K(Ib))&&a.preventDefault():a.preventDefault()}}}function pb(){ac.captured=!1}function qb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],nb(a))}function rb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],ob(a))}function sb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],pb(a))}function tb(a){if(Date.now()-Wb>600){Wb=Date.now();var b=a.detail||-a.wheelDelta;b>0?lb():kb()}}function ub(a){a.preventDefault();var b=m(document.querySelectorAll(Nb)).length,c=Math.floor(a.clientX/Vb.wrapper.offsetWidth*b);Q(c)}function vb(a){a.preventDefault(),gb()}function wb(a){a.preventDefault(),hb()}function xb(a){a.preventDefault(),ib()}function yb(a){a.preventDefault(),jb()}function zb(a){a.preventDefault(),kb()}function Ab(a){a.preventDefault(),lb()}function Bb(){_()}function Cb(){C()}function Db(a){if(_b&&J()){a.preventDefault();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b&&!b.classList.contains("disabled")&&(H(),b.nodeName.match(/section/gi))){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);Q(c,d)}}}function Eb(a){var b=a.target.getAttribute("href");b&&(z(b),a.preventDefault())}var Fb,Gb,Hb,Ib,Jb,Kb,Lb,Mb=".reveal .slides section",Nb=".reveal .slides>section",Ob=".reveal .slides>section.present>section",Pb=".reveal .slides>section:first-child",Qb={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,embedded:!1,autoSlide:0,mouseWheel:!1,rollingLinks:!1,previewLinks:!1,theme:null,transition:"default",transitionSpeed:"default",backgroundTransition:"default",viewDistance:3,dependencies:[]},Rb=!1,Sb=0,Tb=[],Ub=1,Vb={},Wb=0,Xb=0,Yb=0,Zb=0,$b=0,_b=!1,ac={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40};return{initialize:a,configure:i,sync:R,slide:Q,left:gb,right:hb,up:ib,down:jb,prev:kb,next:lb,prevFragment:db,nextFragment:cb,navigateTo:Q,navigateLeft:gb,navigateRight:hb,navigateUp:ib,navigateDown:jb,navigatePrev:kb,navigateNext:lb,layout:C,availableRoutes:X,availableFragments:Y,toggleOverview:I,togglePause:O,isOverview:J,isPaused:P,addEventListeners:j,removeEventListeners:k,getIndices:bb,getSlide:function(a,b){var c=document.querySelectorAll(Nb)[a],d=c&&c.querySelectorAll("section");return"undefined"!=typeof b?d?d[b]:void 0:c},getPreviousSlide:function(){return Hb},getCurrentSlide:function(){return Ib},getScale:function(){return Ub},getConfig:function(){return Qb},getQueryHash:function(){var a={};return location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(b){a[b.split("=").shift()]=b.split("=").pop()}),a},isFirstSlide:function(){return null==document.querySelector(Mb+".past")?!0:!1},isLastSlide:function(){return Ib?Ib.nextElementSibling?!1:K(Ib)&&Ib.parentNode.nextElementSibling?!1:!0:!1},isReady:function(){return Rb},addEventListener:function(a,b,c){"addEventListener"in window&&(Vb.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(Vb.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)}}}();
\ No newline at end of file +var Reveal=function(){"use strict";function a(a){if(b(),!cc.transforms2d&&!cc.transforms3d)return document.body.setAttribute("class","no-transforms"),void 0;window.addEventListener("load",C,!1);var d=Reveal.getQueryHash();"undefined"!=typeof d.dependencies&&delete d.dependencies,l(Zb,a),l(Zb,d),s(),c()}function b(){cc.transforms3d="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,cc.transforms2d="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,cc.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,cc.requestAnimationFrame="function"==typeof cc.requestAnimationFrameMethod,cc.canvas=!!document.createElement("canvas").getContext,Tb=navigator.userAgent.match(/(iphone|ipod|android)/gi)}function c(){function a(){c.length&&head.js.apply(null,c),d()}for(var b=[],c=[],e=0,f=Zb.dependencies.length;f>e;e++){var g=Zb.dependencies[e];(!g.condition||g.condition())&&(g.async?c.push(g.src):b.push(g.src),"function"==typeof g.callback&&head.ready(g.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],g.callback))}b.length?(head.ready(a),head.js.apply(null,b)):a()}function d(){f(),e(),i(),cb(),X(!0),setTimeout(function(){bc.slides.classList.remove("no-transition"),$b=!0,u("ready",{indexh:Ob,indexv:Pb,currentSlide:Rb})},1)}function e(){var a=m(document.querySelectorAll(Wb));a.forEach(function(a){var b=m(a.querySelectorAll("section"));b.forEach(function(a,b){b>0&&a.classList.add("future")})})}function f(){bc.theme=document.querySelector("#theme"),bc.wrapper=document.querySelector(".reveal"),bc.slides=document.querySelector(".reveal .slides"),bc.slides.classList.add("no-transition"),bc.background=g(bc.wrapper,"div","backgrounds",null),bc.progress=g(bc.wrapper,"div","progress","<span></span>"),bc.progressbar=bc.progress.querySelector("span"),g(bc.wrapper,"aside","controls",'<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>'),bc.slideNumber=g(bc.wrapper,"div","slide-number",""),g(bc.wrapper,"div","state-background",null),g(bc.wrapper,"div","pause-overlay",null),bc.controls=document.querySelector(".reveal .controls"),bc.controlsLeft=m(document.querySelectorAll(".navigate-left")),bc.controlsRight=m(document.querySelectorAll(".navigate-right")),bc.controlsUp=m(document.querySelectorAll(".navigate-up")),bc.controlsDown=m(document.querySelectorAll(".navigate-down")),bc.controlsPrev=m(document.querySelectorAll(".navigate-prev")),bc.controlsNext=m(document.querySelectorAll(".navigate-next"))}function g(a,b,c,d){var e=a.querySelector("."+c);return e||(e=document.createElement(b),e.classList.add(c),null!==d&&(e.innerHTML=d),a.appendChild(e)),e}function h(){function a(a,b){var c={background:a.getAttribute("data-background"),backgroundSize:a.getAttribute("data-background-size"),backgroundImage:a.getAttribute("data-background-image"),backgroundColor:a.getAttribute("data-background-color"),backgroundRepeat:a.getAttribute("data-background-repeat"),backgroundPosition:a.getAttribute("data-background-position"),backgroundTransition:a.getAttribute("data-background-transition")},d=document.createElement("div");return d.className="slide-background",c.background&&(/^(http|file|\/\/)/gi.test(c.background)||/\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test(c.background)?d.style.backgroundImage="url("+c.background+")":d.style.background=c.background),(c.background||c.backgroundColor||c.backgroundImage)&&d.setAttribute("data-background-hash",c.background+c.backgroundSize+c.backgroundImage+c.backgroundColor+c.backgroundRepeat+c.backgroundPosition+c.backgroundTransition),c.backgroundSize&&(d.style.backgroundSize=c.backgroundSize),c.backgroundImage&&(d.style.backgroundImage='url("'+c.backgroundImage+'")'),c.backgroundColor&&(d.style.backgroundColor=c.backgroundColor),c.backgroundRepeat&&(d.style.backgroundRepeat=c.backgroundRepeat),c.backgroundPosition&&(d.style.backgroundPosition=c.backgroundPosition),c.backgroundTransition&&d.setAttribute("data-background-transition",c.backgroundTransition),b.appendChild(d),d}r()&&document.body.classList.add("print-pdf"),bc.background.innerHTML="",bc.background.classList.add("no-transition"),m(document.querySelectorAll(Wb)).forEach(function(b){var c;c=r()?a(b,b):a(b,bc.background),m(b.querySelectorAll("section")).forEach(function(b){r()?a(b,b):a(b,c)})}),Zb.parallaxBackgroundImage?(bc.background.style.backgroundImage='url("'+Zb.parallaxBackgroundImage+'")',bc.background.style.backgroundSize=Zb.parallaxBackgroundSize,setTimeout(function(){bc.wrapper.classList.add("has-parallax-background")},1)):(bc.background.style.backgroundImage="",bc.wrapper.classList.remove("has-parallax-background"))}function i(a){var b=document.querySelectorAll(Vb).length;if(bc.wrapper.classList.remove(Zb.transition),"object"==typeof a&&l(Zb,a),cc.transforms3d===!1&&(Zb.transition="linear"),bc.wrapper.classList.add(Zb.transition),bc.wrapper.setAttribute("data-transition-speed",Zb.transitionSpeed),bc.wrapper.setAttribute("data-background-transition",Zb.backgroundTransition),bc.controls.style.display=Zb.controls?"block":"none",bc.progress.style.display=Zb.progress?"block":"none",Zb.rtl?bc.wrapper.classList.add("rtl"):bc.wrapper.classList.remove("rtl"),Zb.center?bc.wrapper.classList.add("center"):bc.wrapper.classList.remove("center"),Zb.mouseWheel?(document.addEventListener("DOMMouseScroll",zb,!1),document.addEventListener("mousewheel",zb,!1)):(document.removeEventListener("DOMMouseScroll",zb,!1),document.removeEventListener("mousewheel",zb,!1)),Zb.rollingLinks?v():w(),Zb.previewLinks?x():(y(),x("[data-preview-link]")),b>1&&Zb.autoSlide&&Zb.autoSlideStoppable&&cc.canvas&&cc.requestAnimationFrame?(Ub=new Nb(bc.wrapper,function(){return Math.min(Math.max((Date.now()-kc)/ic,0),1)}),Ub.on("click",Mb),lc=!1):Ub&&(Ub.destroy(),Ub=null),Zb.theme&&bc.theme){var c=bc.theme.getAttribute("href"),d=/[^\/]*?(?=\.css)/,e=c.match(d)[0];Zb.theme!==e&&(c=c.replace(d,Zb.theme),bc.theme.setAttribute("href",c))}R()}function j(){if(hc=!0,window.addEventListener("hashchange",Hb,!1),window.addEventListener("resize",Ib,!1),Zb.touch&&(bc.wrapper.addEventListener("touchstart",tb,!1),bc.wrapper.addEventListener("touchmove",ub,!1),bc.wrapper.addEventListener("touchend",vb,!1),window.navigator.msPointerEnabled&&(bc.wrapper.addEventListener("MSPointerDown",wb,!1),bc.wrapper.addEventListener("MSPointerMove",xb,!1),bc.wrapper.addEventListener("MSPointerUp",yb,!1))),Zb.keyboard&&document.addEventListener("keydown",sb,!1),Zb.progress&&bc.progress&&bc.progress.addEventListener("click",Ab,!1),Zb.focusBodyOnPageVisiblityChange){var a;"hidden"in document?a="visibilitychange":"msHidden"in document?a="msvisibilitychange":"webkitHidden"in document&&(a="webkitvisibilitychange"),a&&document.addEventListener(a,Jb,!1)}["touchstart","click"].forEach(function(a){bc.controlsLeft.forEach(function(b){b.addEventListener(a,Bb,!1)}),bc.controlsRight.forEach(function(b){b.addEventListener(a,Cb,!1)}),bc.controlsUp.forEach(function(b){b.addEventListener(a,Db,!1)}),bc.controlsDown.forEach(function(b){b.addEventListener(a,Eb,!1)}),bc.controlsPrev.forEach(function(b){b.addEventListener(a,Fb,!1)}),bc.controlsNext.forEach(function(b){b.addEventListener(a,Gb,!1)})})}function k(){hc=!1,document.removeEventListener("keydown",sb,!1),window.removeEventListener("hashchange",Hb,!1),window.removeEventListener("resize",Ib,!1),bc.wrapper.removeEventListener("touchstart",tb,!1),bc.wrapper.removeEventListener("touchmove",ub,!1),bc.wrapper.removeEventListener("touchend",vb,!1),window.navigator.msPointerEnabled&&(bc.wrapper.removeEventListener("MSPointerDown",wb,!1),bc.wrapper.removeEventListener("MSPointerMove",xb,!1),bc.wrapper.removeEventListener("MSPointerUp",yb,!1)),Zb.progress&&bc.progress&&bc.progress.removeEventListener("click",Ab,!1),["touchstart","click"].forEach(function(a){bc.controlsLeft.forEach(function(b){b.removeEventListener(a,Bb,!1)}),bc.controlsRight.forEach(function(b){b.removeEventListener(a,Cb,!1)}),bc.controlsUp.forEach(function(b){b.removeEventListener(a,Db,!1)}),bc.controlsDown.forEach(function(b){b.removeEventListener(a,Eb,!1)}),bc.controlsPrev.forEach(function(b){b.removeEventListener(a,Fb,!1)}),bc.controlsNext.forEach(function(b){b.removeEventListener(a,Gb,!1)})})}function l(a,b){for(var c in b)a[c]=b[c]}function m(a){return Array.prototype.slice.call(a)}function n(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function o(a,b){a.style.WebkitTransform=b,a.style.MozTransform=b,a.style.msTransform=b,a.style.OTransform=b,a.style.transform=b}function p(a){var b=0;if(a){var c=0;m(a.childNodes).forEach(function(a){"number"==typeof a.offsetTop&&a.style&&("absolute"===a.style.position&&(c+=1),b=Math.max(b,a.offsetTop+a.offsetHeight))}),0===c&&(b=a.offsetHeight)}return b}function q(a,b){if(b=b||0,a){var c=a.parentNode,d=c.childNodes;m(d).forEach(function(c){if("number"==typeof c.offsetHeight&&c!==a){var d=window.getComputedStyle(c),e=parseInt(d.marginTop,10),f=parseInt(d.marginBottom,10);b-=c.offsetHeight+e+f}});var e=window.getComputedStyle(a);b-=parseInt(e.marginTop,10)+parseInt(e.marginBottom,10)}return b}function r(){return/print-pdf/gi.test(window.location.search)}function s(){Zb.hideAddressBar&&Tb&&(window.addEventListener("load",t,!1),window.addEventListener("orientationchange",t,!1))}function t(){setTimeout(function(){window.scrollTo(0,1)},10)}function u(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),l(c,b),bc.wrapper.dispatchEvent(c)}function v(){if(cc.transforms3d&&!("msPerspective"in document.body.style))for(var a=document.querySelectorAll(Vb+" a:not(.image)"),b=0,c=a.length;c>b;b++){var d=a[b];if(!(!d.textContent||d.querySelector("*")||d.className&&d.classList.contains(d,"roll"))){var e=document.createElement("span");e.setAttribute("data-title",d.text),e.innerHTML=d.innerHTML,d.classList.add("roll"),d.innerHTML="",d.appendChild(e)}}}function w(){for(var a=document.querySelectorAll(Vb+" a.roll"),b=0,c=a.length;c>b;b++){var d=a[b],e=d.querySelector("span");e&&(d.classList.remove("roll"),d.innerHTML=e.innerHTML)}}function x(a){var b=m(document.querySelectorAll(a?a:"a"));b.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.addEventListener("click",Lb,!1)})}function y(){var a=m(document.querySelectorAll("a"));a.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.removeEventListener("click",Lb,!1)})}function z(a){A(),bc.preview=document.createElement("div"),bc.preview.classList.add("preview-link-overlay"),bc.wrapper.appendChild(bc.preview),bc.preview.innerHTML=["<header>",'<a class="close" href="#"><span class="icon"></span></a>','<a class="external" href="'+a+'" target="_blank"><span class="icon"></span></a>',"</header>",'<div class="spinner"></div>','<div class="viewport">','<iframe src="'+a+'"></iframe>',"</div>"].join(""),bc.preview.querySelector("iframe").addEventListener("load",function(){bc.preview.classList.add("loaded")},!1),bc.preview.querySelector(".close").addEventListener("click",function(a){A(),a.preventDefault()},!1),bc.preview.querySelector(".external").addEventListener("click",function(){A()},!1),setTimeout(function(){bc.preview.classList.add("visible")},1)}function A(){bc.preview&&(bc.preview.setAttribute("src",""),bc.preview.parentNode.removeChild(bc.preview),bc.preview=null)}function B(a){var b=m(a);return b.forEach(function(a,b){a.hasAttribute("data-fragment-index")||a.setAttribute("data-fragment-index",b)}),b.sort(function(a,b){return a.getAttribute("data-fragment-index")-b.getAttribute("data-fragment-index")}),b}function C(){if(bc.wrapper&&!r()){var a=bc.wrapper.offsetWidth,b=bc.wrapper.offsetHeight;a-=b*Zb.margin,b-=b*Zb.margin;var c=Zb.width,d=Zb.height,e=20;D(Zb.width,Zb.height,e),"string"==typeof c&&/%$/.test(c)&&(c=parseInt(c,10)/100*a),"string"==typeof d&&/%$/.test(d)&&(d=parseInt(d,10)/100*b),bc.slides.style.width=c+"px",bc.slides.style.height=d+"px",ac=Math.min(a/c,b/d),ac=Math.max(ac,Zb.minScale),ac=Math.min(ac,Zb.maxScale),"undefined"==typeof bc.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)?o(bc.slides,"translate(-50%, -50%) scale("+ac+") translate(50%, 50%)"):bc.slides.style.zoom=ac;for(var f=m(document.querySelectorAll(Vb)),g=0,h=f.length;h>g;g++){var i=f[g];"none"!==i.style.display&&(i.style.top=Zb.center||i.classList.contains("center")?i.classList.contains("stack")?0:Math.max(-(p(i)/2)-e,-d/2)+"px":"")}U(),Y()}}function D(a,b,c){m(bc.slides.querySelectorAll("section > .stretch")).forEach(function(d){var e=q(d,b-2*c);if(/(img|video)/gi.test(d.nodeName)){var f=d.naturalWidth||d.videoWidth,g=d.naturalHeight||d.videoHeight,h=Math.min(a/f,e/g);d.style.width=f*h+"px",d.style.height=g*h+"px"}else d.style.width=a+"px",d.style.height=e+"px"})}function E(a,b){"object"==typeof a&&"function"==typeof a.setAttribute&&a.setAttribute("data-previous-indexv",b||0)}function F(a){if("object"==typeof a&&"function"==typeof a.setAttribute&&a.classList.contains("stack")){var b=a.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(a.getAttribute(b)||0,10)}return 0}function G(){if(Zb.overview){ib();var a=bc.wrapper.classList.contains("overview"),b=window.innerWidth<400?1e3:2500;bc.wrapper.classList.add("overview"),bc.wrapper.classList.remove("overview-deactivating"),clearTimeout(fc),clearTimeout(gc),fc=setTimeout(function(){for(var c=document.querySelectorAll(Wb),d=0,e=c.length;e>d;d++){var f=c[d],g=Zb.rtl?-105:105;if(f.setAttribute("data-index-h",d),o(f,"translateZ(-"+b+"px) translate("+(d-Ob)*g+"%, 0%)"),f.classList.contains("stack"))for(var h=f.querySelectorAll("section"),i=0,j=h.length;j>i;i++){var k=d===Ob?Pb:F(f),l=h[i];l.setAttribute("data-index-h",d),l.setAttribute("data-index-v",i),o(l,"translate(0%, "+105*(i-k)+"%)"),l.addEventListener("click",Kb,!0)}else f.addEventListener("click",Kb,!0)}T(),C(),a||u("overviewshown",{indexh:Ob,indexv:Pb,currentSlide:Rb})},10)}}function H(){Zb.overview&&(clearTimeout(fc),clearTimeout(gc),bc.wrapper.classList.remove("overview"),bc.wrapper.classList.add("overview-deactivating"),gc=setTimeout(function(){bc.wrapper.classList.remove("overview-deactivating")},1),m(document.querySelectorAll(Vb)).forEach(function(a){o(a,""),a.removeEventListener("click",Kb,!0)}),Q(Ob,Pb),hb(),u("overviewhidden",{indexh:Ob,indexv:Pb,currentSlide:Rb}))}function I(a){"boolean"==typeof a?a?G():H():J()?H():G()}function J(){return bc.wrapper.classList.contains("overview")}function K(a){return a=a?a:Rb,a&&a.parentNode&&!!a.parentNode.nodeName.match(/section/i)}function L(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullscreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&b.apply(a)}function M(){var a=bc.wrapper.classList.contains("paused");ib(),bc.wrapper.classList.add("paused"),a===!1&&u("paused")}function N(){var a=bc.wrapper.classList.contains("paused");bc.wrapper.classList.remove("paused"),hb(),a&&u("resumed")}function O(){P()?N():M()}function P(){return bc.wrapper.classList.contains("paused")}function Q(a,b,c,d){Qb=Rb;var e=document.querySelectorAll(Wb);void 0===b&&(b=F(e[a])),Qb&&Qb.parentNode&&Qb.parentNode.classList.contains("stack")&&E(Qb.parentNode,Pb);var f=_b.concat();_b.length=0;var g=Ob||0,h=Pb||0;Ob=S(Wb,void 0===a?Ob:a),Pb=S(Xb,void 0===b?Pb:b),T(),C();a:for(var i=0,j=_b.length;j>i;i++){for(var k=0;k<f.length;k++)if(f[k]===_b[i]){f.splice(k,1);continue a}document.documentElement.classList.add(_b[i]),u(_b[i])}for(;f.length;)document.documentElement.classList.remove(f.pop());J()&&G();var l=e[Ob],n=l.querySelectorAll("section");if(Rb=n[Pb]||l,"undefined"!=typeof c){var o=B(Rb.querySelectorAll(".fragment"));m(o).forEach(function(a,b){c>b?a.classList.add("visible"):a.classList.remove("visible")})}var p=Ob!==g||Pb!==h;p?u("slidechanged",{indexh:Ob,indexv:Pb,previousSlide:Qb,currentSlide:Rb,origin:d}):Qb=null,Qb&&(Qb.classList.remove("present"),document.querySelector(Yb).classList.contains("present")&&setTimeout(function(){var a,b=m(document.querySelectorAll(Wb+".stack"));for(a in b)b[a]&&E(b[a],0)},0)),p&&(ab(Qb),_(Rb)),W(),U(),X(),Y(),V(),db(),hb()}function R(){k(),j(),C(),ic=Zb.autoSlide,hb(),h(),W(),U(),X(!0),V()}function S(a,b){var c=m(document.querySelectorAll(a)),d=c.length;if(d){Zb.loop&&(b%=d,0>b&&(b=d+b)),b=Math.max(Math.min(b,d-1),0);for(var e=0;d>e;e++){var f=c[e],g=Zb.rtl&&!K(f);if(f.classList.remove("past"),f.classList.remove("present"),f.classList.remove("future"),f.setAttribute("hidden",""),b>e){f.classList.add(g?"future":"past");for(var h=m(f.querySelectorAll(".fragment"));h.length;)h.pop().classList.add("visible")}else if(e>b){f.classList.add(g?"past":"future");for(var i=m(f.querySelectorAll(".fragment.visible"));i.length;)i.pop().classList.remove("visible")}f.querySelector("section")&&f.classList.add("stack")}c[b].classList.add("present"),c[b].removeAttribute("hidden");var j=c[b].getAttribute("data-state");j&&(_b=_b.concat(j.split(" ")))}else b=0;return b}function T(){var a,b,c=m(document.querySelectorAll(Wb)),d=c.length;if(d){var e=J()?10:Zb.viewDistance;Tb&&(e=J()?6:1);for(var f=0;d>f;f++){var g=c[f],h=m(g.querySelectorAll("section")),i=h.length;if(a=Math.abs((Ob-f)%(d-e))||0,g.style.display=a>e?"none":"block",i)for(var j=F(g),k=0;i>k;k++){var l=h[k];b=f===Ob?Math.abs(Pb-k):Math.abs(k-j),l.style.display=a+b>e?"none":"block"}}}}function U(){if(Zb.progress&&bc.progress){var a=m(document.querySelectorAll(Wb)),b=document.querySelectorAll(Vb+":not(.stack)").length,c=0;a:for(var d=0;d<a.length;d++){for(var e=a[d],f=m(e.querySelectorAll("section")),g=0;g<f.length;g++){if(f[g].classList.contains("present"))break a;c++}if(e.classList.contains("present"))break;e.classList.contains("stack")===!1&&c++}bc.progressbar.style.width=c/(b-1)*window.innerWidth+"px"}}function V(){if(Zb.slideNumber&&bc.slideNumber){var a=Ob;Pb>0&&(a+=" - "+Pb),bc.slideNumber.innerHTML=a}}function W(){var a=Z(),b=$();bc.controlsLeft.concat(bc.controlsRight).concat(bc.controlsUp).concat(bc.controlsDown).concat(bc.controlsPrev).concat(bc.controlsNext).forEach(function(a){a.classList.remove("enabled"),a.classList.remove("fragmented")}),a.left&&bc.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&bc.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&bc.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&bc.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&bc.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&bc.controlsNext.forEach(function(a){a.classList.add("enabled")}),Rb&&(b.prev&&bc.controlsPrev.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&bc.controlsNext.forEach(function(a){a.classList.add("fragmented","enabled")}),K(Rb)?(b.prev&&bc.controlsUp.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&bc.controlsDown.forEach(function(a){a.classList.add("fragmented","enabled")})):(b.prev&&bc.controlsLeft.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&bc.controlsRight.forEach(function(a){a.classList.add("fragmented","enabled")})))}function X(a){var b=null,c=Zb.rtl?"future":"past",d=Zb.rtl?"past":"future";if(m(bc.background.childNodes).forEach(function(e,f){Ob>f?e.className="slide-background "+c:f>Ob?e.className="slide-background "+d:(e.className="slide-background present",b=e),(a||f===Ob)&&m(e.childNodes).forEach(function(a,c){Pb>c?a.className="slide-background past":c>Pb?a.className="slide-background future":(a.className="slide-background present",f===Ob&&(b=a))})}),b){var e=Sb?Sb.getAttribute("data-background-hash"):null,f=b.getAttribute("data-background-hash");f&&f===e&&b!==Sb&&bc.background.classList.add("no-transition"),Sb=b}setTimeout(function(){bc.background.classList.remove("no-transition")},1)}function Y(){if(Zb.parallaxBackgroundImage){var a,b,c=document.querySelectorAll(Wb),d=document.querySelectorAll(Xb),e=bc.background.style.backgroundSize.split(" ");1===e.length?a=b=parseInt(e[0],10):(a=parseInt(e[0],10),b=parseInt(e[1],10));var f=bc.background.offsetWidth,g=c.length,h=-(a-f)/(g-1)*Ob,i=bc.background.offsetHeight,j=d.length,k=j>0?-(b-i)/(j-1)*Pb:0;bc.background.style.backgroundPosition=h+"px "+k+"px"}}function Z(){var a=document.querySelectorAll(Wb),b=document.querySelectorAll(Xb),c={left:Ob>0||Zb.loop,right:Ob<a.length-1||Zb.loop,up:Pb>0,down:Pb<b.length-1};if(Zb.rtl){var d=c.left;c.left=c.right,c.right=d}return c}function $(){if(Rb&&Zb.fragments){var a=Rb.querySelectorAll(".fragment"),b=Rb.querySelectorAll(".fragment:not(.visible)");return{prev:a.length-b.length>0,next:!!b.length}}return{prev:!1,next:!1}}function _(a){a&&!bb()&&(m(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&a.play()}),m(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:start","*")}),m(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function ab(a){a&&(m(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-ignore")||a.pause()}),m(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:stop","*")}),m(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-ignore")||"function"!=typeof a.contentWindow.postMessage||a.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function bb(){return!!window.location.search.match(/receiver/gi)}function cb(){var a=window.location.hash,b=a.slice(2).split("/"),c=a.replace(/#|\//gi,"");if(isNaN(parseInt(b[0],10))&&c.length){var d=document.querySelector("#"+c);if(d){var e=Reveal.getIndices(d);Q(e.h,e.v)}else Q(Ob||0,Pb||0)}else{var f=parseInt(b[0],10)||0,g=parseInt(b[1],10)||0;(f!==Ob||g!==Pb)&&Q(f,g)}}function db(a){if(Zb.history)if(clearTimeout(ec),"number"==typeof a)ec=setTimeout(db,a);else{var b="/";Rb&&"string"==typeof Rb.getAttribute("id")?b="/"+Rb.getAttribute("id"):((Ob>0||Pb>0)&&(b+=Ob),Pb>0&&(b+="/"+Pb)),window.location.hash=b}}function eb(a){var b,c=Ob,d=Pb;if(a){var e=K(a),f=e?a.parentNode:a,g=m(document.querySelectorAll(Wb));c=Math.max(g.indexOf(f),0),e&&(d=Math.max(m(a.parentNode.querySelectorAll("section")).indexOf(a),0))}if(!a&&Rb){var h=Rb.querySelectorAll(".fragment").length>0;if(h){var i=Rb.querySelectorAll(".fragment.visible");b=i.length}}return{h:c,v:d,f:b}}function fb(){if(Rb&&Zb.fragments){var a=B(Rb.querySelectorAll(".fragment:not(.visible)"));if(a.length){var b=a[0].getAttribute("data-fragment-index");return a=Rb.querySelectorAll('.fragment[data-fragment-index="'+b+'"]'),m(a).forEach(function(a){a.classList.add("visible")}),u("fragmentshown",{fragment:a[0],fragments:a}),W(),!0}}return!1}function gb(){if(Rb&&Zb.fragments){var a=B(Rb.querySelectorAll(".fragment.visible"));if(a.length){var b=a[a.length-1].getAttribute("data-fragment-index");return a=Rb.querySelectorAll('.fragment[data-fragment-index="'+b+'"]'),m(a).forEach(function(a){a.classList.remove("visible")}),u("fragmenthidden",{fragment:a[0],fragments:a}),W(),!0}}return!1}function hb(){if(ib(),Rb){var a=Rb.parentNode?Rb.parentNode.getAttribute("data-autoslide"):null,b=Rb.getAttribute("data-autoslide");ic=b?parseInt(b,10):a?parseInt(a,10):Zb.autoSlide,!ic||lc||P()||J()||Reveal.isLastSlide()&&Zb.loop!==!0||(jc=setTimeout(qb,ic),kc=Date.now()),Ub&&Ub.setPlaying(-1!==jc)}}function ib(){clearTimeout(jc),jc=-1}function jb(){lc=!0,clearTimeout(jc),Ub&&Ub.setPlaying(!1)}function kb(){lc=!1,hb()}function lb(){Zb.rtl?(J()||fb()===!1)&&Z().left&&Q(Ob+1):(J()||gb()===!1)&&Z().left&&Q(Ob-1)}function mb(){Zb.rtl?(J()||gb()===!1)&&Z().right&&Q(Ob-1):(J()||fb()===!1)&&Z().right&&Q(Ob+1)}function nb(){(J()||gb()===!1)&&Z().up&&Q(Ob,Pb-1)}function ob(){(J()||fb()===!1)&&Z().down&&Q(Ob,Pb+1)}function pb(){if(gb()===!1)if(Z().up)nb();else{var a=document.querySelector(Wb+".past:nth-child("+Ob+")");if(a){var b=a.querySelectorAll("section").length-1||void 0,c=Ob-1;Q(c,b)}}}function qb(){fb()===!1&&(Z().down?ob():mb()),hb()}function rb(){Zb.autoSlideStoppable&&jb()}function sb(a){rb(a),document.activeElement;var b=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(b||a.shiftKey&&32!==a.keyCode||a.altKey||a.ctrlKey||a.metaKey)){if(P()&&-1===[66,190,191].indexOf(a.keyCode))return!1;var c=!1;if("object"==typeof Zb.keyboard)for(var d in Zb.keyboard)if(parseInt(d,10)===a.keyCode){var e=Zb.keyboard[d];"function"==typeof e?e.apply(null,[a]):"string"==typeof e&&"function"==typeof Reveal[e]&&Reveal[e].call(),c=!0}if(c===!1)switch(c=!0,a.keyCode){case 80:case 33:pb();break;case 78:case 34:qb();break;case 72:case 37:lb();break;case 76:case 39:mb();break;case 75:case 38:nb();break;case 74:case 40:ob();break;case 36:Q(0);break;case 35:Q(Number.MAX_VALUE);break;case 32:J()?H():a.shiftKey?pb():qb();break;case 13:J()?H():c=!1;break;case 66:case 190:case 191:O();break;case 70:L();break;default:c=!1}c?a.preventDefault():27!==a.keyCode&&79!==a.keyCode||!cc.transforms3d||(bc.preview?A():I(),a.preventDefault()),hb()}}function tb(a){mc.startX=a.touches[0].clientX,mc.startY=a.touches[0].clientY,mc.startCount=a.touches.length,2===a.touches.length&&Zb.overview&&(mc.startSpan=n({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:mc.startX,y:mc.startY}))}function ub(a){if(mc.captured)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{rb(a);var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===mc.startCount&&Zb.overview){var d=n({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:mc.startX,y:mc.startY});Math.abs(mc.startSpan-d)>mc.threshold&&(mc.captured=!0,d<mc.startSpan?G():H()),a.preventDefault()}else if(1===a.touches.length&&2!==mc.startCount){var e=b-mc.startX,f=c-mc.startY;e>mc.threshold&&Math.abs(e)>Math.abs(f)?(mc.captured=!0,lb()):e<-mc.threshold&&Math.abs(e)>Math.abs(f)?(mc.captured=!0,mb()):f>mc.threshold?(mc.captured=!0,nb()):f<-mc.threshold&&(mc.captured=!0,ob()),Zb.embedded?(mc.captured||K(Rb))&&a.preventDefault():a.preventDefault()}}}function vb(){mc.captured=!1}function wb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],tb(a))}function xb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],ub(a))}function yb(a){a.pointerType===a.MSPOINTER_TYPE_TOUCH&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],vb(a))}function zb(a){if(Date.now()-dc>600){dc=Date.now();var b=a.detail||-a.wheelDelta;b>0?qb():pb()}}function Ab(a){rb(a),a.preventDefault();var b=m(document.querySelectorAll(Wb)).length,c=Math.floor(a.clientX/bc.wrapper.offsetWidth*b);Q(c)}function Bb(a){a.preventDefault(),rb(),lb()}function Cb(a){a.preventDefault(),rb(),mb()}function Db(a){a.preventDefault(),rb(),nb()}function Eb(a){a.preventDefault(),rb(),ob()}function Fb(a){a.preventDefault(),rb(),pb()}function Gb(a){a.preventDefault(),rb(),qb()}function Hb(){cb()}function Ib(){C()}function Jb(){var a=document.webkitHidden||document.msHidden||document.hidden;a===!1&&document.activeElement!==document.body&&(document.activeElement.blur(),document.body.focus())}function Kb(a){if(hc&&J()){a.preventDefault();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b&&!b.classList.contains("disabled")&&(H(),b.nodeName.match(/section/gi))){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);Q(c,d)}}}function Lb(a){var b=a.target.getAttribute("href");b&&(z(b),a.preventDefault())}function Mb(){Reveal.isLastSlide()&&Zb.loop===!1?(Q(0,0),kb()):lc?kb():jb()}function Nb(a,b){this.diameter=50,this.thickness=3,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=a,this.progressCheck=b,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}var Ob,Pb,Qb,Rb,Sb,Tb,Ub,Vb=".reveal .slides section",Wb=".reveal .slides>section",Xb=".reveal .slides>section.present>section",Yb=".reveal .slides>section:first-of-type",Zb={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,slideNumber:!1,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,embedded:!1,autoSlide:0,autoSlideStoppable:!0,mouseWheel:!1,rollingLinks:!1,hideAddressBar:!0,previewLinks:!1,focusBodyOnPageVisiblityChange:!0,theme:null,transition:"default",transitionSpeed:"default",backgroundTransition:"default",parallaxBackgroundImage:"",parallaxBackgroundSize:"",viewDistance:3,dependencies:[]},$b=!1,_b=[],ac=1,bc={},cc={},dc=0,ec=0,fc=0,gc=0,hc=!1,ic=0,jc=0,kc=-1,lc=!1,mc={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40};return Nb.prototype.setPlaying=function(a){var b=this.playing;this.playing=a,!b&&this.playing?this.animate():this.render()},Nb.prototype.animate=function(){var a=this.progress;this.progress=this.progressCheck(),a>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&cc.requestAnimationFrameMethod.call(window,this.animate.bind(this))},Nb.prototype.render=function(){var a=this.playing?this.progress:0,b=this.diameter/2-this.thickness,c=this.diameter/2,d=this.diameter/2,e=14;this.progressOffset+=.1*(1-this.progressOffset);var f=-Math.PI/2+a*2*Math.PI,g=-Math.PI/2+this.progressOffset*2*Math.PI;this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(c,d,b+2,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(c,d,b,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#666",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(c,d,b,g,f,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(c-e/2,d-e/2),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,e/2-2,e),this.context.fillRect(e/2+2,0,e/2-2,e)):(this.context.beginPath(),this.context.translate(2,0),this.context.moveTo(0,0),this.context.lineTo(e-2,e/2),this.context.lineTo(0,e),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()},Nb.prototype.on=function(a,b){this.canvas.addEventListener(a,b,!1)},Nb.prototype.off=function(a,b){this.canvas.removeEventListener(a,b,!1)},Nb.prototype.destroy=function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)},{initialize:a,configure:i,sync:R,slide:Q,left:lb,right:mb,up:nb,down:ob,prev:pb,next:qb,prevFragment:gb,nextFragment:fb,navigateTo:Q,navigateLeft:lb,navigateRight:mb,navigateUp:nb,navigateDown:ob,navigatePrev:pb,navigateNext:qb,layout:C,availableRoutes:Z,availableFragments:$,toggleOverview:I,togglePause:O,isOverview:J,isPaused:P,addEventListeners:j,removeEventListeners:k,getIndices:eb,getSlide:function(a,b){var c=document.querySelectorAll(Wb)[a],d=c&&c.querySelectorAll("section");return"undefined"!=typeof b?d?d[b]:void 0:c},getPreviousSlide:function(){return Qb},getCurrentSlide:function(){return Rb},getScale:function(){return ac},getConfig:function(){return Zb},getQueryHash:function(){var a={};location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(b){a[b.split("=").shift()]=b.split("=").pop()});for(var b in a){var c=a[b];"null"===c?a[b]=null:"true"===c?a[b]=!0:"false"===c?a[b]=!1:isNaN(parseFloat(c))||(a[b]=parseFloat(c))}return a},isFirstSlide:function(){return null==document.querySelector(Vb+".past")?!0:!1},isLastSlide:function(){return Rb?Rb.nextElementSibling?!1:K(Rb)&&Rb.parentNode.nextElementSibling?!1:!0:!1 +},isReady:function(){return $b},addEventListener:function(a,b,c){"addEventListener"in window&&(bc.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(bc.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)}}}();
\ No newline at end of file diff --git a/plugin/markdown/example.html b/plugin/markdown/example.html index 0b07aa5..522d8ac 100644 --- a/plugin/markdown/example.html +++ b/plugin/markdown/example.html @@ -8,6 +8,8 @@ <link rel="stylesheet" href="../../css/reveal.css"> <link rel="stylesheet" href="../../css/theme/default.css" id="theme"> + + <link rel="stylesheet" href="../../lib/css/zenburn.css"> </head> <body> @@ -66,6 +68,22 @@ </script> </section> + <!-- Code --> + <section> + <section data-markdown> + <script type="text/template"> + ```php + public function foo() + { + $foo = array( + 'bar' => 'bar' + ) + } + ``` + </script> + </section> + </section> + </div> </div> @@ -80,14 +98,12 @@ history: true, center: true, - theme: Reveal.getQueryHash().theme, - transition: Reveal.getQueryHash().transition || 'default', - // Optional libraries used to extend on reveal.js dependencies: [ { src: '../../lib/js/classList.js', condition: function() { return !document.body.classList; } }, { src: 'marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, { src: 'markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, + { src: '../highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, { src: '../notes/notes.js' } ] }); diff --git a/plugin/markdown/markdown.js b/plugin/markdown/markdown.js index c5c2358..9564208 100755 --- a/plugin/markdown/markdown.js +++ b/plugin/markdown/markdown.js @@ -9,9 +9,8 @@ } else { // Browser globals (root is window) - root.returnExports = factory( root.marked ); - root.returnExports.processSlides(); - root.returnExports.convertSlides(); + root.RevealMarkdown = factory( root.marked ); + root.RevealMarkdown.initialize(); } }( this, function( marked ) { @@ -27,6 +26,12 @@ }); } + var DEFAULT_SLIDE_SEPARATOR = '^\n---\n$', + DEFAULT_NOTES_SEPARATOR = 'note:', + DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR = '{\\\.\s*?([^}]+?)}', + DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR = '^.*?<!--\\\sslide-attributes:\\\s(.*?)-->'; + + /** * Retrieves the markdown contents of a slide section * element. Normalizes leading tabs/whitespace. @@ -68,7 +73,7 @@ value = attributes[i].value; // disregard attributes that are used for markdown loading/parsing - if( /data\-(markdown|separator|vertical|notes)/gi.test( name ) ) continue; + if( /data\-(markdown|separator|vertical|notes|attributes)/gi.test( name ) ) continue; if( value ) { result.push( name + '=' + value ); @@ -83,10 +88,28 @@ } /** + * Inspects the given options and fills out default + * values for what's not defined. + */ + function getSlidifyOptions( options ) { + + options = options || {}; + options.separator = options.separator || DEFAULT_SLIDE_SEPARATOR; + options.notesSeparator = options.notesSeparator || DEFAULT_NOTES_SEPARATOR; + options.attributes = options.attributes || ''; + options.slideAttributesSeparator = options.slideAttributesSeparator || DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR; + + return options; + + } + + /** * Helper function for constructing a markdown slide. */ function createMarkdownSlide( content, options ) { + options = getSlidifyOptions( options ); + var notesMatch = content.split( new RegExp( options.notesSeparator, 'mgi' ) ); if( notesMatch.length === 2 ) { @@ -103,20 +126,20 @@ */ function slidify( markdown, options ) { - options = options || {}; - options.separator = options.separator || '^\n---\n$'; - options.notesSeparator = options.notesSeparator || 'note:'; - options.attributes = options.attributes || ''; + options = getSlidifyOptions( options ); var separatorRegex = new RegExp( options.separator + ( options.verticalSeparator ? '|' + options.verticalSeparator : '' ), 'mg' ), - horizontalSeparatorRegex = new RegExp( options.separator ); + horizontalSeparatorRegex = new RegExp( options.separator ), + slideAttributesSeparatorRegex = new RegExp( options.slideAttributesSeparator, 'm' ); var matches, lastIndex = 0, isHorizontal, wasHorizontal = true, content, - sectionStack = []; + sectionStack = [], + matchAttributes, + slideAttributes = ""; // iterate until all blocks between separators are stacked up while( matches = separatorRegex.exec( markdown ) ) { @@ -154,20 +177,36 @@ // flatten the hierarchical stack, and insert <section data-markdown> tags for( var i = 0, len = sectionStack.length; i < len; i++ ) { // vertical - if( sectionStack[i].propertyIsEnumerable( length ) && typeof sectionStack[i].splice === 'function' ) { - markdownSections += '<section '+ options.attributes +'>'; + if( sectionStack[i] instanceof Array ) { + // The 'data-xxx' attributes of the first child must be set on the wrapping parent section to be effective + // Mainly for data-transition (otherwise, it is ignored for the first vertical slide) + firstChild = sectionStack[i][0]; + matchAttributes = slideAttributesSeparatorRegex.exec( firstChild ); + slideAttributes = matchAttributes ? matchAttributes[1] : ""; + dataAttributes = ""; + if( slideAttributes != "" ) { + // http://stackoverflow.com/questions/18025762/javascript-regex-replace-all-word-characters-except-word-characters-between-ch + // Keep only data-attributes for the parent slide section. + dataAttributes = slideAttributes.replace( /(data-\S+=\"[^\"]+?\")|\w|[\"=]/g, function(a, b) { return b || ''; }); + } + markdownSections += '<section '+ options.attributes + ' ' + dataAttributes + '>'; sectionStack[i].forEach( function( child ) { - markdownSections += '<section data-markdown>' + createMarkdownSlide( child, options ) + '</section>'; + matchAttributes = slideAttributesSeparatorRegex.exec( child ); + slideAttributes = matchAttributes ? matchAttributes[1] : ""; + child = matchAttributes ? child.replace( slideAttributesSeparatorRegex,"" ) : child + markdownSections += '<section ' + slideAttributes + ' data-markdown>' + createMarkdownSlide( child, options ) + '</section>'; } ); markdownSections += '</section>'; } else { - markdownSections += '<section '+ options.attributes +' data-markdown>' + createMarkdownSlide( sectionStack[i], options ) + '</section>'; + matchAttributes = slideAttributesSeparatorRegex.exec( sectionStack[i] ); + slideAttributes = matchAttributes ? matchAttributes[1] : ""; + content = matchAttributes ? sectionStack[i].replace( slideAttributesSeparatorRegex,"" ) : sectionStack[i] + markdownSections += '<section '+ options.attributes + ' ' + slideAttributes +' data-markdown>' + createMarkdownSlide( content, options ) + '</section>'; } } - return markdownSections; } @@ -201,12 +240,12 @@ xhr.onreadystatechange = function() { if( xhr.readyState === 4 ) { if ( xhr.status >= 200 && xhr.status < 300 ) { - section.outerHTML = slidify( xhr.responseText, { separator: section.getAttribute( 'data-separator' ), verticalSeparator: section.getAttribute( 'data-vertical' ), notesSeparator: section.getAttribute( 'data-notes' ), - attributes: getForwardedAttributes( section ) + attributes: getForwardedAttributes( section ), + slideAttributesSeparator: section.getAttribute( 'data-attributes' ), }); } @@ -232,16 +271,86 @@ } } - else if( section.getAttribute( 'data-separator' ) ) { + else if( section.getAttribute( 'data-separator' ) || section.getAttribute( 'data-vertical' ) || section.getAttribute( 'data-notes' ) ) { section.outerHTML = slidify( getMarkdownFromSlide( section ), { separator: section.getAttribute( 'data-separator' ), verticalSeparator: section.getAttribute( 'data-vertical' ), notesSeparator: section.getAttribute( 'data-notes' ), - attributes: getForwardedAttributes( section ) + attributes: getForwardedAttributes( section ), + slideAttributesSeparator: section.getAttribute( 'data-attributes' ), }); } + else { + var content = getMarkdownFromSlide( section ); + var slideAttributesSeparatorRegex = new RegExp( section.getAttribute( 'data-attributes' ) || DEFAULT_SLIDE_ATTRIBUTES_SEPARATOR, 'm' ); + var matchAttributes = slideAttributesSeparatorRegex.exec( content ); + if ( matchAttributes ) { + var slideAttributes = matchAttributes[1]; + content = content.replace( slideAttributesSeparatorRegex,"" ); + var slideAttributesRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' ); + while( matchesAttributes = slideAttributesRegex.exec( slideAttributes ) ) { + section.setAttribute( matchesAttributes[1], matchesAttributes[2] ); + } + } + section.innerHTML = createMarkdownSlide( content ); + } + } + + } + + /** + * Check if a node value has the attributes pattern. + * If yes, extract it and add that value as one or several attributes + * the the terget element. + * + * You need Cache Killer on Chrome to see the effect on any FOM transformation + * directly on refresh (F5) + * http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development/7000899#answer-11786277 + */ + function addAttributeInElement( node, elementTarget, separator ) { + + var mardownClassesInElementsRegex = new RegExp( separator, 'mg' ); + var mardownClassRegex = new RegExp( "([^\"= ]+?)=\"([^\"=]+?)\"", 'mg' ); + var nodeValue = node.nodeValue; + if( matches = mardownClassesInElementsRegex.exec( nodeValue ) ) { + + var classes = matches[1]; + nodeValue = nodeValue.substring( 0, matches.index ) + nodeValue.substring( mardownClassesInElementsRegex.lastIndex ); + node.nodeValue = nodeValue; + + while( matchesClass = mardownClassRegex.exec( classes ) ) { + elementTarget.setAttribute( matchesClass[1], matchesClass[2] ); + } + } + + } + + /** + * Add attributes to the parent element of a text node, + * or the element of an attribute node. + */ + function addAttributes( element, separator ) { + + if( element.childNodes.length > 0 ) { + for( var i = 0; i < element.childNodes.length; i++ ) { + addAttributes( element.childNodes[i], separator ); + } + } + + var nodeValue; + var elementTarget; + + // From http://stackoverflow.com/questions/9178174/find-all-text-nodes + if( element.nodeType == Node.TEXT_NODE && /\S/.test(element.nodeValue) ) { + addAttributeInElement( element, element.parentNode, separator ); + } + if( element.nodeType == Node.ELEMENT_NODE && element.attributes.length > 0 ) { + for( var j = 0; j < element.attributes.length; j++ ){ + var attr = element.attributes[j]; + addAttributeInElement( attr, element, separator ); + } } } @@ -258,25 +367,44 @@ var section = sections[i]; - var notes = section.querySelector( 'aside.notes' ); - var markdown = getMarkdownFromSlide( section ); + // Only parse the same slide once + if( !section.getAttribute( 'data-markdown-parsed' ) ) { + + section.setAttribute( 'data-markdown-parsed', true ) - section.innerHTML = marked( markdown ); + var notes = section.querySelector( 'aside.notes' ); + var markdown = getMarkdownFromSlide( section ); + + section.innerHTML = marked( markdown ); + addAttributes( section, section.getAttribute( 'data-element-attributes' ) || + section.parentNode.getAttribute( 'data-element-attributes' ) || + DEFAULT_ELEMENT_ATTRIBUTES_SEPARATOR ); + + // If there were notes, we need to re-add them after + // having overwritten the section's HTML + if( notes ) { + section.appendChild( notes ); + } - // If there were notes, we need to re-add them after - // having overwritten the section's HTML - if( notes ) { - section.appendChild( notes ); } } } + // API return { + + initialize: function() { + processSlides(); + convertSlides(); + }, + + // TODO: Do these belong in the API? processSlides: processSlides, convertSlides: convertSlides, slidify: slidify + }; })); diff --git a/plugin/multiplex/master.js b/plugin/multiplex/master.js index deb39cd..b6a7eb7 100644 --- a/plugin/multiplex/master.js +++ b/plugin/multiplex/master.js @@ -1,6 +1,7 @@ (function() { - // don't emit events from inside the previews themselves + // Don't emit events from inside of notes windows if ( window.location.search.match( /receiver/gi ) ) { return; } + var multiplex = Reveal.getConfig().multiplex; var socket = io.connect(multiplex.url); diff --git a/plugin/notes/notes.html b/plugin/notes/notes.html index 7e542e4..847499d 100644 --- a/plugin/notes/notes.html +++ b/plugin/notes/notes.html @@ -138,12 +138,20 @@ <body> + <script> + function getNotesURL( controls ) { + return window.opener.location.protocol + '//' + window.opener.location.host + window.opener.location.pathname + '?receiver&controls='+ ( controls || 'false' ) +'&progress=false&overview=false' + window.opener.location.hash; + } + var notesCurrentSlideURL = getNotesURL( true ); + var notesNextSlideURL = getNotesURL( false ); + </script> + <div id="wrap-current-slide" class="slides"> - <script>document.write( '<iframe width="1280" height="1024" id="current-slide" src="'+ window.opener.location.href +'"></iframe>' );</script> + <script>document.write( '<iframe width="1280" height="1024" id="current-slide" src="'+ notesCurrentSlideURL +'"></iframe>' );</script> </div> <div id="wrap-next-slide" class="slides"> - <script>document.write( '<iframe width="640" height="512" id="next-slide" src="'+ window.opener.location.href +'"></iframe>' );</script> + <script>document.write( '<iframe width="640" height="512" id="next-slide" src="'+ notesNextSlideURL +'"></iframe>' );</script> <span>UPCOMING:</span> </div> @@ -239,10 +247,6 @@ currentSlide.contentWindow.Reveal.addEventListener( 'fragmentshown', synchronizeMainWindow ); currentSlide.contentWindow.Reveal.addEventListener( 'fragmenthidden', synchronizeMainWindow ); - // Reconfigure the notes window to remove needless UI - currentSlide.contentWindow.Reveal.configure({ controls: false, progress: false, overview: false }); - nextSlide.contentWindow.Reveal.configure({ controls: false, progress: false, overview: false }); - } else { diff --git a/plugin/remotes/remotes.js b/plugin/remotes/remotes.js index 694e9c0..ba0dbad 100644 --- a/plugin/remotes/remotes.js +++ b/plugin/remotes/remotes.js @@ -17,11 +17,11 @@ * Detects if notes are enable and the current page is opened inside an /iframe * this prevents loading Remotes.io several times */ - var remotesAndIsNotes = (function(){ - return !(window.RevealNotes && self == top); + var isNotesAndIframe = (function(){ + return window.RevealNotes && !(self == top); })(); - if(!hasTouch && !remotesAndIsNotes){ + if(!hasTouch && !isNotesAndIframe){ head.ready( 'remotes.ne.min.js', function() { new Remotes("preview") .on("swipe-left", function(e){ Reveal.right(); }) @@ -34,6 +34,6 @@ ; } ); - head.js('https://raw.github.com/Remotes/Remotes/master/dist/remotes.ne.min.js'); + head.js('https://hakim-static.s3.amazonaws.com/reveal-js/remotes.ne.min.js'); } })(window);
\ No newline at end of file diff --git a/test/examples/barebones.html b/test/examples/barebones.html index 5c03ff3..c948d00 100644 --- a/test/examples/barebones.html +++ b/test/examples/barebones.html @@ -29,7 +29,6 @@ </div> - <script src="../../lib/js/head.min.js"></script> <script src="../../js/reveal.min.js"></script> <script> diff --git a/test/examples/slide-backgrounds.html b/test/examples/slide-backgrounds.html index 1e2da16..4f0fe62 100644 --- a/test/examples/slide-backgrounds.html +++ b/test/examples/slide-backgrounds.html @@ -75,6 +75,27 @@ <h2>Same background twice (2/2)</h2> </section> + <section> + <section data-background="#417203"> + <h2>Same background twice vertical (1/2)</h2> + </section> + <section data-background="#417203"> + <h2>Same background twice vertical (2/2)</h2> + </section> + </section> + + <section data-background="#934f4d"> + <h2>Same background from horizontal to vertical (1/3)</h2> + </section> + <section> + <section data-background="#934f4d"> + <h2>Same background from horizontal to vertical (2/3)</h2> + </section> + <section data-background="#934f4d"> + <h2>Same background from horizontal to vertical (3/3)</h2> + </section> + </section> + </div> </div> @@ -92,7 +113,7 @@ transition: 'linear', // transitionSpeed: 'slow', - // backgroundTransition: 'linear' + // backgroundTransition: 'slide' }); </script> diff --git a/test/test-element-attributes-markdown.html b/test/test-element-attributes-markdown.html new file mode 100644 index 0000000..0853801 --- /dev/null +++ b/test/test-element-attributes-markdown.html @@ -0,0 +1,82 @@ +<!doctype html> +<html lang="en"> + + <head> + <meta charset="utf-8"> + + <title>reveal.js - Test Markdown</title> + + <link rel="stylesheet" href="../css/reveal.min.css"> + <link rel="stylesheet" href="qunit-1.12.0.css"> + </head> + + <body style="overflow: auto;"> + + <div id="qunit"></div> + <div id="qunit-fixture"></div> + + <div class="reveal" style="display: none;"> + + <div class="slides"> + + <!-- <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n"></section> --> + + <!-- Slides are separated by newline + three dashes + newline, vertical slides identical but two dashes --> + <section data-markdown data-separator="^\n---\n$" data-vertical="^\n--\n$" data-element-attributes="{_\s*?([^}]+?)}">> + <script type="text/template"> + ## Slide 1.1 {_class="fragment fade-out" data-fragment-index="1"} + + -- + + ## Slide 1.2 {_class="fragment shrink"} + + Paragraph 1 {_class="fragment grow"} + + Paragraph 2 {_class="fragment grow"} + + - list item 1 {_class="fragment roll-in"} + - list item 2 {_class="fragment roll-in"} + - list item 3 {_class="fragment roll-in"} + + + --- + + ## Slide 2 + + + Paragraph 1.2 + multi-line {_class="fragment highlight-red"} + + Paragraph 2.2 {_class="fragment highlight-red"} + + Paragraph 2.3 {_class="fragment highlight-red"} + + Paragraph 2.4 {_class="fragment highlight-red"} + + - list item 1 {_class="fragment highlight-green"} + - list item 2 {_class="fragment highlight-green"} + - list item 3 {_class="fragment highlight-green"} + - list item 4 {_class="fragment highlight-green"} + - list item 5 {_class="fragment highlight-green"} + + Test + +  + + </script> + </section> + + </div> + + </div> + + <script src="../lib/js/head.min.js"></script> + <script src="../js/reveal.min.js"></script> + <script src="../plugin/markdown/marked.js"></script> + <script src="../plugin/markdown/markdown.js"></script> + <script src="qunit-1.12.0.js"></script> + + <script src="test-element-attributes-markdown.js"></script> + + </body> +</html> diff --git a/test/test-element-attributes-markdown.js b/test/test-element-attributes-markdown.js new file mode 100644 index 0000000..e79806c --- /dev/null +++ b/test/test-element-attributes-markdown.js @@ -0,0 +1,38 @@ + + +Reveal.addEventListener( 'ready', function() { + + QUnit.module( 'Markdown' ); + + test( 'Vertical separator', function() { + strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' ); + }); + + + test( 'Attributes on vertical slides header', function() { + strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.fade-out' ).length, 1, 'found one vertical slide with class fragment.fade-out on header' ); + strictEqual( document.querySelectorAll( '.reveal .slides section>section h2.fragment.shrink' ).length, 1, 'found one vertical slide with class fragment.shrink on header' ); + }); + + test( 'Attributes on vertical slides paragraphs', function() { + strictEqual( document.querySelectorAll( '.reveal .slides section>section p.fragment.grow' ).length, 2, 'found a vertical slide with two paragraphs with class fragment.grow' ); + }); + + test( 'Attributes on vertical slides list items', function() { + strictEqual( document.querySelectorAll( '.reveal .slides section>section li.fragment.roll-in' ).length, 3, 'found a vertical slide with three list items with class fragment.roll-in' ); + }); + + test( 'Attributes on horizontal slides paragraphs', function() { + strictEqual( document.querySelectorAll( '.reveal .slides section p.fragment.highlight-red' ).length, 4, 'found a horizontal slide with four paragraphs with class fragment.grow' ); + }); + test( 'Attributes on horizontal slides list items', function() { + strictEqual( document.querySelectorAll( '.reveal .slides section li.fragment.highlight-green' ).length, 5, 'found a horizontal slide with five list items with class fragment.roll-in' ); + }); + test( 'Attributes on horizontal slides list items', function() { + strictEqual( document.querySelectorAll( '.reveal .slides section img.reveal.stretch' ).length, 1, 'found a horizontal slide with stretched image, class img.reveal.stretch' ); + }); + +} ); + +Reveal.initialize(); + diff --git a/test/test-markdown-attributes.html b/test/test-markdown-attributes.html new file mode 100644 index 0000000..cc03177 --- /dev/null +++ b/test/test-markdown-attributes.html @@ -0,0 +1,128 @@ +<!doctype html> +<html lang="en"> + + <head> + <meta charset="utf-8"> + + <title>reveal.js - Test Markdown Attributes</title> + + <link rel="stylesheet" href="../css/reveal.min.css"> + <link rel="stylesheet" href="qunit-1.12.0.css"> + </head> + + <body style="overflow: auto;"> + + <div id="qunit"></div> + <div id="qunit-fixture"></div> + + <div class="reveal" style="display: none;"> + + <div class="slides"> + + <!-- <section data-markdown="example.md" data-separator="^\n\n\n" data-vertical="^\n\n"></section> --> + + <!-- Slides are separated by three lines, vertical slides by two lines, attributes are one any line starting with (spaces and) two dashes --> + <section data-markdown data-separator="^\n\n\n" + data-vertical="^\n\n" + data-notes="^Note:" + data-attributes="^\s*?--\s(.*?)$" + data-charset="utf-8"> + <script type="text/template"> + # Test attributes in Markdown + ## Slide 1 + + + + ## Slide 2 + -- id="slide2" data-transition="zoom" data-background="#A0C66B" + + + ## Slide 2.1 + -- data-background="#ff0000" data-transition="fade" + + + ## Slide 2.2 + [Link to Slide2](#/slide2) + + + + ## Slide 3 + -- data-transition="zoom" data-background="#C6916B" + + + + ## Slide 4 + </script> + </section> + + <section data-markdown data-separator="^\n\n\n" + data-vertical="^\n\n" + data-notes="^Note:" + data-charset="utf-8"> + <script type="text/template"> + # Test attributes in Markdown with default separator + ## Slide 1 Def + + + + ## Slide 2 Def + <!-- slide-attributes: id="slide2def" data-transition="concave" data-background="#A7C66B" --> + + + ## Slide 2.1 Def + <!-- slide-attributes: data-background="#f70000" data-transition="page" --> + + + ## Slide 2.2 Def + [Link to Slide2](#/slide2def) + + + + ## Slide 3 Def + <!-- slide-attributes: data-transition="concave" data-background="#C7916B" --> + + + + ## Slide 4 + </script> + </section> + + <section data-markdown> + <script type="text/template"> + <!-- slide-attributes: data-background="#ff0000" --> + ## Hello world + </script> + </section> + + <section data-markdown> + <script type="text/template"> + ## Hello world + <!-- slide-attributes: data-background="#ff0000" --> + </script> + </section> + + <section data-markdown> + <script type="text/template"> + ## Hello world + + Test + <!-- slide-attributes: data-background="#ff0000" --> + + More Test + </script> + </section> + + </div> + + </div> + + <script src="../lib/js/head.min.js"></script> + <script src="../js/reveal.min.js"></script> + <script src="../plugin/markdown/marked.js"></script> + <script src="../plugin/markdown/markdown.js"></script> + <script src="qunit-1.12.0.js"></script> + + <script src="test-markdown-attributes.js"></script> + + </body> +</html> diff --git a/test/test-markdown-attributes.js b/test/test-markdown-attributes.js new file mode 100644 index 0000000..a11f63b --- /dev/null +++ b/test/test-markdown-attributes.js @@ -0,0 +1,47 @@ + + +Reveal.addEventListener( 'ready', function() { + + QUnit.module( 'Markdown' ); + + test( 'Vertical separator', function() { + strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 6, 'found six vertical slides' ); + }); + + test( 'Id on slide', function() { + strictEqual( document.querySelectorAll( '.reveal .slides>section>section#slide2' ).length, 1, 'found one slide with id slide2' ); + strictEqual( document.querySelectorAll( '.reveal .slides>section>section a[href="#/slide2"]' ).length, 1, 'found one slide with a link to slide2' ); + }); + + test( 'data-background attributes', function() { + strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A0C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' ); + strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#ff0000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' ); + strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C6916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' ); + }); + + test( 'data-transition attributes', function() { + strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="zoom"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' ); + strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="fade"]' ).length, 1, 'found one vertical slide with data-transition="fade"' ); + strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="zoom"]' ).length, 1, 'found one slide with data-transition="zoom"' ); + }); + + test( 'data-background attributes with default separator', function() { + strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#A7C66B"]' ).length, 1, 'found one vertical slide with data-background="#A0C66B"' ); + strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-background="#f70000"]' ).length, 1, 'found one vertical slide with data-background="#ff0000"' ); + strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#C7916B"]' ).length, 1, 'found one slide with data-background="#C6916B"' ); + }); + + test( 'data-transition attributes with default separator', function() { + strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="concave"]' ).length, 1, 'found one vertical slide with data-transition="zoom"' ); + strictEqual( document.querySelectorAll( '.reveal .slides>section>section[data-transition="page"]' ).length, 1, 'found one vertical slide with data-transition="fade"' ); + strictEqual( document.querySelectorAll( '.reveal .slides section [data-transition="concave"]' ).length, 1, 'found one slide with data-transition="zoom"' ); + }); + + test( 'data-transition attributes with inline content', function() { + strictEqual( document.querySelectorAll( '.reveal .slides>section[data-background="#ff0000"]' ).length, 3, 'found three horizontal slides with data-background="#ff0000"' ); + }); + +} ); + +Reveal.initialize(); + diff --git a/test/test.js b/test/test.js index 00c9622..bd5cad1 100644 --- a/test/test.js +++ b/test/test.js @@ -204,6 +204,16 @@ Reveal.addEventListener( 'ready', function() { deepEqual( Reveal.getIndices(), { h: 2, v: 0, f: 0 }, 'left() goes to prev fragment' ); }); + test( 'Stepping past fragments', function() { + var fragmentSlide = document.querySelector( '.reveal .slides>section:nth-child(3)' ); + + Reveal.slide( 0, 0, 0 ); + equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 0, 'no fragments visible when on previous slide' ); + + Reveal.slide( 3, 0, 0 ); + equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 3, 'all fragments visible when on future slide' ); + }); + asyncTest( 'fragmentshown event', function() { expect( 2 ); |