From c4502335ec412de759c27c66787293b580c0bd59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Pelletier?= Date: Wed, 29 Nov 2023 16:40:43 -0500 Subject: [PATCH] simplifier --- bg-cover.jpg | Bin 10027 -> 0 bytes bg-slide.jpg | Bin 195611 -> 0 bytes compile-pdf.sh | 11 +- reveal.js/.github/CONTRIBUTING.md | 21 - reveal.js/.github/FUNDING.yml | 1 - reveal.js/.github/workflows/js.yml | 31 - reveal.js/.gitignore | 11 - reveal.js/.npmignore | 5 - reveal.js/LICENSE | 19 - reveal.js/README.md | 50 - reveal.js/css/layout.scss | 69 - reveal.js/css/print/paper.scss | 166 - reveal.js/css/print/pdf.scss | 159 - reveal.js/css/reveal.scss | 2104 --- reveal.js/css/theme/README.md | 21 - reveal.js/css/theme/source/beige.scss | 44 - .../css/theme/source/black-contrast.scss | 49 - reveal.js/css/theme/source/black.scss | 46 - reveal.js/css/theme/source/blood.scss | 87 - reveal.js/css/theme/source/dracula.scss | 106 - reveal.js/css/theme/source/league.scss | 36 - reveal.js/css/theme/source/moon.scss | 54 - reveal.js/css/theme/source/night.scss | 37 - reveal.js/css/theme/source/serif.scss | 41 - reveal.js/css/theme/source/simple.scss | 43 - reveal.js/css/theme/source/sky.scss | 52 - reveal.js/css/theme/source/solarized.scss | 66 - .../css/theme/source/white-contrast.scss | 52 - reveal.js/css/theme/source/white.scss | 49 - reveal.js/css/theme/template/exposer.scss | 30 - reveal.js/css/theme/template/mixins.scss | 45 - reveal.js/css/theme/template/settings.scss | 50 - reveal.js/css/theme/template/theme.scss | 331 - reveal.js/demo.html | 481 - reveal.js/dist/reset.css | 30 - reveal.js/dist/reveal.css | 8 - reveal.js/dist/reveal.esm.js | 9 - reveal.js/dist/reveal.esm.js.map | 1 - reveal.js/dist/reveal.js | 9 - reveal.js/dist/reveal.js.map | 1 - reveal.js/dist/theme/beige.css | 366 - reveal.js/dist/theme/black-contrast.css | 362 - reveal.js/dist/theme/black.css | 359 - reveal.js/dist/theme/blood.css | 392 - reveal.js/dist/theme/dracula.css | 385 - .../dist/theme/fonts/league-gothic/LICENSE | 2 - .../fonts/league-gothic/league-gothic.css | 10 - .../fonts/league-gothic/league-gothic.eot | Bin 25696 -> 0 bytes .../fonts/league-gothic/league-gothic.ttf | Bin 64256 -> 0 bytes .../fonts/league-gothic/league-gothic.woff | Bin 30764 -> 0 bytes .../dist/theme/fonts/source-sans-pro/LICENSE | 45 - .../source-sans-pro-italic.eot | Bin 75720 -> 0 bytes .../source-sans-pro-italic.ttf | Bin 238084 -> 0 bytes .../source-sans-pro-italic.woff | Bin 98556 -> 0 bytes .../source-sans-pro-regular.eot | Bin 88070 -> 0 bytes .../source-sans-pro-regular.ttf | Bin 288008 -> 0 bytes .../source-sans-pro-regular.woff | Bin 114324 -> 0 bytes .../source-sans-pro-semibold.eot | Bin 89897 -> 0 bytes .../source-sans-pro-semibold.ttf | Bin 284640 -> 0 bytes .../source-sans-pro-semibold.woff | Bin 115648 -> 0 bytes .../source-sans-pro-semibolditalic.eot | Bin 75706 -> 0 bytes .../source-sans-pro-semibolditalic.ttf | Bin 240944 -> 0 bytes .../source-sans-pro-semibolditalic.woff | Bin 98816 -> 0 bytes .../fonts/source-sans-pro/source-sans-pro.css | 39 - reveal.js/dist/theme/league.css | 368 - reveal.js/dist/theme/moon.css | 362 - reveal.js/dist/theme/night.css | 360 - reveal.js/dist/theme/serif.css | 363 - reveal.js/dist/theme/simple.css | 362 - reveal.js/dist/theme/sky.css | 370 - reveal.js/dist/theme/solarized.css | 363 - reveal.js/dist/theme/white-contrast.css | 362 - reveal.js/dist/theme/white.css | 359 - ...hite_contrast_compact_verbatim_headers.css | 360 - reveal.js/examples/500-slides.html | 526 - reveal.js/examples/assets/beeping.txt | 2 - reveal.js/examples/assets/beeping.wav | Bin 422472 -> 0 bytes reveal.js/examples/assets/image1.png | Bin 21991 -> 0 bytes reveal.js/examples/assets/image2.png | Bin 10237 -> 0 bytes reveal.js/examples/auto-animate.html | 225 - reveal.js/examples/backgrounds.html | 141 - reveal.js/examples/barebones.html | 32 - reveal.js/examples/layout-helpers.html | 160 - reveal.js/examples/markdown.html | 161 - reveal.js/examples/markdown.md | 41 - reveal.js/examples/math.html | 206 - reveal.js/examples/media.html | 75 - .../examples/multiple-presentations.html | 102 - reveal.js/examples/scroll.html | 118 - reveal.js/examples/transitions.html | 97 - reveal.js/gulpfile.js | 321 - reveal.js/index.html | 40 - reveal.js/js/components/playback.js | 165 - reveal.js/js/config.js | 330 - reveal.js/js/controllers/autoanimate.js | 640 - reveal.js/js/controllers/backgrounds.js | 439 - reveal.js/js/controllers/controls.js | 266 - reveal.js/js/controllers/focus.js | 103 - reveal.js/js/controllers/fragments.js | 375 - reveal.js/js/controllers/jumptoslide.js | 197 - reveal.js/js/controllers/keyboard.js | 386 - reveal.js/js/controllers/location.js | 247 - reveal.js/js/controllers/notes.js | 126 - reveal.js/js/controllers/overview.js | 255 - reveal.js/js/controllers/plugins.js | 254 - reveal.js/js/controllers/pointer.js | 126 - reveal.js/js/controllers/printview.js | 239 - reveal.js/js/controllers/progress.js | 110 - reveal.js/js/controllers/scrollview.js | 888 -- reveal.js/js/controllers/slidecontent.js | 484 - reveal.js/js/controllers/slidenumber.js | 139 - reveal.js/js/controllers/touch.js | 263 - reveal.js/js/index.js | 58 - reveal.js/js/reveal.js | 3018 ----- reveal.js/js/utils/color.js | 77 - reveal.js/js/utils/constants.js | 16 - reveal.js/js/utils/device.js | 8 - reveal.js/js/utils/loader.js | 46 - reveal.js/js/utils/util.js | 313 - reveal.js/package-lock.json | 10781 ---------------- reveal.js/package.json | 104 - reveal.js/plugin/highlight/highlight.esm.js | 5 - reveal.js/plugin/highlight/highlight.js | 5 - reveal.js/plugin/highlight/monokai.css | 71 - reveal.js/plugin/highlight/plugin.js | 439 - reveal.js/plugin/highlight/zenburn.css | 80 - reveal.js/plugin/markdown/markdown.esm.js | 7 - reveal.js/plugin/markdown/markdown.js | 7 - reveal.js/plugin/markdown/plugin.js | 491 - reveal.js/plugin/math/katex.js | 96 - reveal.js/plugin/math/math.esm.js | 6 - reveal.js/plugin/math/math.js | 1 - reveal.js/plugin/math/mathjax2.js | 89 - reveal.js/plugin/math/mathjax3.js | 77 - reveal.js/plugin/math/plugin.js | 15 - reveal.js/plugin/notes/notes.esm.js | 1 - reveal.js/plugin/notes/notes.js | 1 - reveal.js/plugin/notes/plugin.js | 265 - reveal.js/plugin/notes/speaker-view.html | 891 -- reveal.js/plugin/search/plugin.js | 243 - reveal.js/plugin/search/search.esm.js | 7 - reveal.js/plugin/search/search.js | 7 - reveal.js/plugin/zoom/plugin.js | 264 - reveal.js/plugin/zoom/zoom.esm.js | 11 - reveal.js/plugin/zoom/zoom.js | 11 - reveal.js/test/assets/external-script-a.js | 1 - reveal.js/test/assets/external-script-b.js | 1 - reveal.js/test/assets/external-script-c.js | 1 - reveal.js/test/assets/external-script-d.js | 1 - reveal.js/test/simple.md | 12 - reveal.js/test/test-auto-animate.html | 167 - reveal.js/test/test-dependencies-async.html | 78 - reveal.js/test/test-dependencies.html | 55 - reveal.js/test/test-grid-navigation.html | 75 - reveal.js/test/test-iframe-backgrounds.html | 100 - reveal.js/test/test-iframes.html | 104 - reveal.js/test/test-markdown.html | 516 - .../test/test-multiple-instances-es5.html | 86 - reveal.js/test/test-multiple-instances.html | 104 - reveal.js/test/test-pdf.html | 97 - reveal.js/test/test-plugins.html | 108 - reveal.js/test/test-scroll.html | 115 - reveal.js/test/test-state.html | 134 - reveal.js/test/test.html | 900 -- ulaval-ppr-principes-fair.html | 687 - README.md => ulaval-ppr-principes-fair.md | 0 ulaval-ppr-principes-fair.pdf | Bin 832743 -> 833032 bytes 167 files changed, 7 insertions(+), 39139 deletions(-) delete mode 100644 bg-cover.jpg delete mode 100644 bg-slide.jpg delete mode 100644 reveal.js/.github/CONTRIBUTING.md delete mode 100644 reveal.js/.github/FUNDING.yml delete mode 100644 reveal.js/.github/workflows/js.yml delete mode 100644 reveal.js/.gitignore delete mode 100644 reveal.js/.npmignore delete mode 100644 reveal.js/LICENSE delete mode 100644 reveal.js/README.md delete mode 100644 reveal.js/css/layout.scss delete mode 100644 reveal.js/css/print/paper.scss delete mode 100644 reveal.js/css/print/pdf.scss delete mode 100644 reveal.js/css/reveal.scss delete mode 100644 reveal.js/css/theme/README.md delete mode 100644 reveal.js/css/theme/source/beige.scss delete mode 100644 reveal.js/css/theme/source/black-contrast.scss delete mode 100644 reveal.js/css/theme/source/black.scss delete mode 100644 reveal.js/css/theme/source/blood.scss delete mode 100644 reveal.js/css/theme/source/dracula.scss delete mode 100644 reveal.js/css/theme/source/league.scss delete mode 100644 reveal.js/css/theme/source/moon.scss delete mode 100644 reveal.js/css/theme/source/night.scss delete mode 100644 reveal.js/css/theme/source/serif.scss delete mode 100644 reveal.js/css/theme/source/simple.scss delete mode 100644 reveal.js/css/theme/source/sky.scss delete mode 100644 reveal.js/css/theme/source/solarized.scss delete mode 100644 reveal.js/css/theme/source/white-contrast.scss delete mode 100644 reveal.js/css/theme/source/white.scss delete mode 100644 reveal.js/css/theme/template/exposer.scss delete mode 100644 reveal.js/css/theme/template/mixins.scss delete mode 100644 reveal.js/css/theme/template/settings.scss delete mode 100644 reveal.js/css/theme/template/theme.scss delete mode 100644 reveal.js/demo.html delete mode 100644 reveal.js/dist/reset.css delete mode 100644 reveal.js/dist/reveal.css delete mode 100644 reveal.js/dist/reveal.esm.js delete mode 100644 reveal.js/dist/reveal.esm.js.map delete mode 100644 reveal.js/dist/reveal.js delete mode 100644 reveal.js/dist/reveal.js.map delete mode 100644 reveal.js/dist/theme/beige.css delete mode 100644 reveal.js/dist/theme/black-contrast.css delete mode 100644 reveal.js/dist/theme/black.css delete mode 100644 reveal.js/dist/theme/blood.css delete mode 100644 reveal.js/dist/theme/dracula.css delete mode 100644 reveal.js/dist/theme/fonts/league-gothic/LICENSE delete mode 100644 reveal.js/dist/theme/fonts/league-gothic/league-gothic.css delete mode 100755 reveal.js/dist/theme/fonts/league-gothic/league-gothic.eot delete mode 100755 reveal.js/dist/theme/fonts/league-gothic/league-gothic.ttf delete mode 100755 reveal.js/dist/theme/fonts/league-gothic/league-gothic.woff delete mode 100644 reveal.js/dist/theme/fonts/source-sans-pro/LICENSE delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf delete mode 100755 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff delete mode 100644 reveal.js/dist/theme/fonts/source-sans-pro/source-sans-pro.css delete mode 100644 reveal.js/dist/theme/league.css delete mode 100644 reveal.js/dist/theme/moon.css delete mode 100644 reveal.js/dist/theme/night.css delete mode 100644 reveal.js/dist/theme/serif.css delete mode 100644 reveal.js/dist/theme/simple.css delete mode 100644 reveal.js/dist/theme/sky.css delete mode 100644 reveal.js/dist/theme/solarized.css delete mode 100644 reveal.js/dist/theme/white-contrast.css delete mode 100644 reveal.js/dist/theme/white.css delete mode 100644 reveal.js/dist/theme/white_contrast_compact_verbatim_headers.css delete mode 100644 reveal.js/examples/500-slides.html delete mode 100644 reveal.js/examples/assets/beeping.txt delete mode 100644 reveal.js/examples/assets/beeping.wav delete mode 100644 reveal.js/examples/assets/image1.png delete mode 100644 reveal.js/examples/assets/image2.png delete mode 100644 reveal.js/examples/auto-animate.html delete mode 100644 reveal.js/examples/backgrounds.html delete mode 100644 reveal.js/examples/barebones.html delete mode 100644 reveal.js/examples/layout-helpers.html delete mode 100644 reveal.js/examples/markdown.html delete mode 100644 reveal.js/examples/markdown.md delete mode 100644 reveal.js/examples/math.html delete mode 100644 reveal.js/examples/media.html delete mode 100644 reveal.js/examples/multiple-presentations.html delete mode 100644 reveal.js/examples/scroll.html delete mode 100644 reveal.js/examples/transitions.html delete mode 100644 reveal.js/gulpfile.js delete mode 100644 reveal.js/index.html delete mode 100644 reveal.js/js/components/playback.js delete mode 100644 reveal.js/js/config.js delete mode 100644 reveal.js/js/controllers/autoanimate.js delete mode 100644 reveal.js/js/controllers/backgrounds.js delete mode 100644 reveal.js/js/controllers/controls.js delete mode 100644 reveal.js/js/controllers/focus.js delete mode 100644 reveal.js/js/controllers/fragments.js delete mode 100644 reveal.js/js/controllers/jumptoslide.js delete mode 100644 reveal.js/js/controllers/keyboard.js delete mode 100644 reveal.js/js/controllers/location.js delete mode 100644 reveal.js/js/controllers/notes.js delete mode 100644 reveal.js/js/controllers/overview.js delete mode 100644 reveal.js/js/controllers/plugins.js delete mode 100644 reveal.js/js/controllers/pointer.js delete mode 100644 reveal.js/js/controllers/printview.js delete mode 100644 reveal.js/js/controllers/progress.js delete mode 100644 reveal.js/js/controllers/scrollview.js delete mode 100644 reveal.js/js/controllers/slidecontent.js delete mode 100644 reveal.js/js/controllers/slidenumber.js delete mode 100644 reveal.js/js/controllers/touch.js delete mode 100644 reveal.js/js/index.js delete mode 100644 reveal.js/js/reveal.js delete mode 100644 reveal.js/js/utils/color.js delete mode 100644 reveal.js/js/utils/constants.js delete mode 100644 reveal.js/js/utils/device.js delete mode 100644 reveal.js/js/utils/loader.js delete mode 100644 reveal.js/js/utils/util.js delete mode 100644 reveal.js/package-lock.json delete mode 100644 reveal.js/package.json delete mode 100644 reveal.js/plugin/highlight/highlight.esm.js delete mode 100644 reveal.js/plugin/highlight/highlight.js delete mode 100644 reveal.js/plugin/highlight/monokai.css delete mode 100644 reveal.js/plugin/highlight/plugin.js delete mode 100644 reveal.js/plugin/highlight/zenburn.css delete mode 100644 reveal.js/plugin/markdown/markdown.esm.js delete mode 100644 reveal.js/plugin/markdown/markdown.js delete mode 100755 reveal.js/plugin/markdown/plugin.js delete mode 100755 reveal.js/plugin/math/katex.js delete mode 100644 reveal.js/plugin/math/math.esm.js delete mode 100644 reveal.js/plugin/math/math.js delete mode 100644 reveal.js/plugin/math/mathjax2.js delete mode 100644 reveal.js/plugin/math/mathjax3.js delete mode 100644 reveal.js/plugin/math/plugin.js delete mode 100644 reveal.js/plugin/notes/notes.esm.js delete mode 100644 reveal.js/plugin/notes/notes.js delete mode 100644 reveal.js/plugin/notes/plugin.js delete mode 100644 reveal.js/plugin/notes/speaker-view.html delete mode 100644 reveal.js/plugin/search/plugin.js delete mode 100644 reveal.js/plugin/search/search.esm.js delete mode 100644 reveal.js/plugin/search/search.js delete mode 100644 reveal.js/plugin/zoom/plugin.js delete mode 100644 reveal.js/plugin/zoom/zoom.esm.js delete mode 100644 reveal.js/plugin/zoom/zoom.js delete mode 100644 reveal.js/test/assets/external-script-a.js delete mode 100644 reveal.js/test/assets/external-script-b.js delete mode 100644 reveal.js/test/assets/external-script-c.js delete mode 100644 reveal.js/test/assets/external-script-d.js delete mode 100644 reveal.js/test/simple.md delete mode 100644 reveal.js/test/test-auto-animate.html delete mode 100644 reveal.js/test/test-dependencies-async.html delete mode 100644 reveal.js/test/test-dependencies.html delete mode 100644 reveal.js/test/test-grid-navigation.html delete mode 100644 reveal.js/test/test-iframe-backgrounds.html delete mode 100644 reveal.js/test/test-iframes.html delete mode 100644 reveal.js/test/test-markdown.html delete mode 100644 reveal.js/test/test-multiple-instances-es5.html delete mode 100644 reveal.js/test/test-multiple-instances.html delete mode 100644 reveal.js/test/test-pdf.html delete mode 100644 reveal.js/test/test-plugins.html delete mode 100644 reveal.js/test/test-scroll.html delete mode 100644 reveal.js/test/test-state.html delete mode 100644 reveal.js/test/test.html delete mode 100644 ulaval-ppr-principes-fair.html rename README.md => ulaval-ppr-principes-fair.md (100%) diff --git a/bg-cover.jpg b/bg-cover.jpg deleted file mode 100644 index 2c717677a60c27d53cb0b92820824dde346f023d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10027 zcmeHM2|SeB`+sM~GWHoJA=@yPDY6&BFqXo#%&2T3St2dgt6UmHM)tj2(Gc1Y5>b>T zvTr3zAyoFgXfVIgcJJr@?)`D^@7~|NpZ~vep3nPy&pFTgyl0+s&ig*kGnD6)0RX0_ zqpJgeKp?=DS^-Kgpb0?f=;-Naq4f0h3=B|4W&{f}6B9ExI|mzrk4J!?kB6665VccG zP)I_Umsfl@T0&YzUS3{6Oi5KyR%NH0yzIIX5Ca1PGZQlx3k#Plk{2oay9=cffJ4DT zka`G62mr%D5IBfZ4QvBI0E9YQ5b(7?Xy|F_Kw#=1&-%c6`8o!GK@b{RI!X_~3;_XP z7z73Ypus4%3H6^uHbgY7O@+|<4aI&Yz@fRTQCR$E9UDRe=3eRWD;tXaBmk0^J6h8Ml&O1-Z8S{) z?Bv)T>lElD0^j zt|#6K@xKB-6D{ywLpQ$s>hEjey}Wyme}%fG1!Ack{1r);?mYSjQp$&y4J}pS6D96L zdxXO$BIODco9n*9{vQCfyp&BDAG&nLI-qK``JFW(Q@`r)rtbMD#HjQvY@mevI&CuQ za(~q5X|;22JtjRI3;SPJUUvM#t{<6gHGk%} z>s(MgiX_4yu8Y-UH;(QtcZ;?NBPLoFnlfabGX9a4LJ{(IRdG(LE>JD!GptvF^WQP-}T|(wzd} zx(!Nt-C<({H6amMTonaSsxE8j|8OAheCv>*Yi%b5*f!VR$;#2vvXrCn)K4m(Y-!)$ zUSu{|o{2%O9jIl?3t5v|DMnW-tY|NY2;r5M=l8cXQ-A__1tk%@qC2584SZxsFYyvf zmgj*ymosJNmK?Ai*_{c?*L7bVW%GUB5Lx-$;U$jmd?)^C%C4UM=YKr4d_;$XQ+Z3V zbfs|7S_Of6u(!hjYM4L`6~Odg-VPuz2V{#e9)W|?AZ6I4g=IBd10D^2JlWLn0|RQ_ zqdYNQnA=?TTdce)C1P1DyIWQ5$>=*HqXHklQ1h^fuqf~69=Lv#{0C%q8;cszc|p^N zgqBg`;QyI66jtj`BMp~)wf)2G6TeC}IQ@dLRsEZbJM%hAEAW3iyg6=#^S!|vti_LD<4-HyuQ*DfH+ZD%htU2+S9&8p0d;oQ;*JLQ$7(^H5Hbw zX$>QhN@r_$$OxASTwcCTITbP)7A@U;h-L3Vdhwmra zJ~<;%6+34hA~Iaas{iC9bvPb>0jG!77SBYa{}-_Aty|AXVWw@}sF}O+LEgxO5aC}m z8b(ls+@T`AFZ*KOJN}^H6Wo6jRFaN!y*siUH7!Y1Rr!dT65G6lG{eD`X@ z=t0ZG?sx1_Gh3_l?We;80z>5FW76B;GVC0(G)N&05-skqt(&_h zJ^+TmdiV#%3Lm*r@bL3jlMVx>05y90!iMK}tG|GFvb6r3v5N3`F8dzR)lCeZ+m=8# zqH)joM&19A4%9D~z6 zAMqkaBX*{MLn_KEX45?kylGwPFLPXDwh~-VC3bVeClKX2YZmk+VVbX)M9CV+nj|03 zPO-Vna_clC`5xv*XtOFC;fjI>Q*!z!qtWh%J`?~dBE5Xta=^63NP0ALAxFQ%M3=6! zm|=SdR_e4xXbWRPwL{gcU7EUb zom-0t9G7ZVGYZMtc>`(`;EJiUWQmtxJi?nWVS9CrF#77 z6XW2~{9vgNg5di;Zp#a(?4)~ZB)+&p{{q3hK$7;AGvPn8(;swQKe^IY`t zTXpyAidb@9_vyhbld(!@eCOpQedCkvd{1pA=^Mw*$Lvgbuu(6sjwwbrIAhL;z4K6V z8d~Y`K8Hi1GWzO@=^qAVTP;Xp?8|HhG(#nJ=~&yxE>$E(RAf_tb${h!AVU3!L1;gx zIza$j<}h+r183V75JQ5w;d$@?I5%A zYdo>E8$1yed{>S0`O>dIj&|N|(;$p(HS8=&4;A@m;=Q)>1|dGp6FV1Mo{t&-s1Bm(D)OU054F-MMqv;(Kv77Y0u zYiYZNt*O_8c_E*9dV>s!ZGuA_0j4vZlGOOGI!?e=W@ z=*5j3?H}1|(}oC1`#syC6Tc_=pq09=FA!cEtvKxE;z;mKi>Ftq>sbmMHn)ccs@rnK z4@^}G*k(T95H{m$WZ)-04=+knJZ)BnBQ~va(g&%mWGPEom`_DMr*Y+l9WKkN23@0@ z2=@~u;33{xBh$xsNom_#j*1JjfUc&jaYOGZE}D!hpDJKGv!rQU3&%##MC(=#5AMn+;l#?~VlhEm z6jN@&2(5Ny;=^gZ)1FeHeQ(3dROTTsijif z1Gfy$69xpKhoE6@zz`NuHKlxAlgk z=H4Jt&>&GL-(j!`^80j($~M-!{@{L_4IlrLz^ruysg~DcbDHNHb87=pg+@Q!{vUs; z8tah6?M-U_gJSEcVlir(0YnQ>a}1!bE}AXeEr!&Fl+iGr!BH~|`Gd0`-Lv&{5{&8= z4*)=Fo|cAS^ga|k7MnNunJ%0eoq1pandRnuPT zi{VL&FnXLlWHNhwsdMGnSp|Ly(9L8o8GRS~7ceQoYgi(V5ve5}3`<8~%R71_>oW}Y z=3I=;K^yq>h*@NfzV*zmkTtQ`KezqniD%IiAbsmO^nn=)(DkBi_=MQ&R6eb1Z196O zYtH)lO4;Sz=~zDFb!w{b0BX&b0_=EGg~g|5j-@*9wOHwTv#bIvEZRg__pSx3rwB#X z^G54QLTdW|a{<9^jY(~@NEuv=w3~+OXK#BwX9R1O7;C=u8(_MI;yOv)~*i3kRN^6V3@@)g-yXrbiF6>xOKsiAh?e z^)4SYTFLL43Y$e-R;v5U#k%F53D1vT$rtUJ*?B>@z`Q6VG*eL}uXR2DCJy_Uf1{x$ z;l5ZB1fNA7Cdp7^7q@_zeDy~#|2FBbfeY;A=`f#HlHimR_8zGzBl4J>#7+E!j*syAx2BhxcCp}lk+ig+Q|Q*wUTVi%&*qb)7E2z>gxhg_ zy2wrH4Cx2IH8K&1TZ?0NI&$b}U9d-$*BMnp+*;HepNGjYZ#yj7e7l1%_r(FXrfNS! z*$;LCLQ4`WS;-4EDQMj)FGI08bzM=-^clqdVv}Zz?~>W=XR_9Cr;2fiBT5b}&lSWQ zSY^|O1Y(GK^=&41ew@5$6YDG`BhJH?A%=b*5)kEE!h@gR?gzc0HXjf&Ey~28Tz|-L z+w#STdM8tZ92B`p;mX9=IcVMSm>A8q zpeXH>>$0bYqGQ7}#K8PdP%Qz4*v7q)*X|by1RBdkUU%#ro9GYNyQNect*Dh&@7B%a z!*rd&ph0q3rsDj3Zd$;`FN#2@FlP+7gH2P{U>;WR3gxq?f!5gEKl+BFWrb!B~aEby4COX)YBhb2j@{P-g zvWMZ}KZ?^lHsasMoEqti?u9*L+joKm_kFTavF0+FlLG8~KG4mT0!vOwcVTaL6Zgm4 zNwH;FOi%zVRAsTMblm%41Jj4$)*{&flIW{Fu5(W(Fh0s%1K zKj8QsP^oeS=Li63v>-qR001dK3n2s`AawF!fe`=bu^`O)8|(tY{J-H4fG`q508oLw zH~2w;Fg@6ZfFE2m(GS`*5I$+3xF6qt?=PdZblFj&NQCHl36K(jIxmexN~12YqfpXf z7o-vAL2O9=-*h?Qar}<*7iV8zPiZ*Z-A5E-?}2p?we!HkuV6gkNKphFkiB%p6JzJ< z;LDD6aKgFEac;MEaI)j<{sw^?mp62aJVK^uI4-{WlIZjhhZ6yzH2X--0F;RpFXg+@wC&6qNx=~)I0_{KVu<(zy8B|Th`9T3{mwzz z!N<-U=jn^{aA!Z^h{1aJ`O0yE@_$tf@2REr2jhQg13dmj+aK6IzAFA8@&CzUK8Asw z4sd-39}hooI|mhi2X|kt-^uOm{-E{r^LG0&0ed^RgPQ{$MDqbHj{HN^$=mz``((mS zIK1Z%3ed8DV1e)-NdHv%6Vc!drIkJG{7!_RmE|~3I7!=k*x~G@e+3;8VhDTj^CA*< z2ni7}dz6$2MjU%yM9LnEydWWgavO`#9^`Z09$}A=l&}Y- zqwGLE91$W|grmKPJ@$l!gxCcKB$AWe-cDN8!yAtQ-vbVhadLpWcse+7vY*&XT0s{r z$B7a}{PtDX4dd$w;>vMq;@thN{5EQc!#f!GVoofFynsL=#m=Kp=TQjB3l~5wf3Puj z@b&@M%L%I=-tM;s;n;tyM`?`R$?BHl^uhQ$ z*mM3iXy=S^cX9yz6kIF6qT&9@s}r-czaWKhM2a9$NP7`6$qSAm7&{4sh@Avh;yg;s z(a})~G|I2^J|2#~0T^!w1t)MFfffK)(U0who&Se*1%Ag1aCSH`9cTj)BvJ%*;U8@P z2la=axZ+y0IY?gb~{A6v^s_W!j1Sl~Yv_>TqtV}buz;6E1l|DOf^ zmYg`agON@En0g$~6I7#>lx%eMbyU%sDqv;?00jANc6c8mc>ut>`+DnNR%ACdGiN7V z0iXaIKnU;yLKr(APX%3F&6AYqpSOdFAGsDVE^@-_pX2>!4`ou{`i z2-||NM1Zg737iGO^kBed55f;YSlAm>5QL{r#<9P`n2e}e6tz40K97>L7dk9P<86PW%A+n>PKPGG#7AE?`pc9Nk|I=CAdfIT<(VFNA$ zXg~|l1=s;B;0NFUH^3JV0eg3F#0Ss^pDX@1^ejKj^z@ z@(w^8u>H-pK91*6KZYQbiU2_T`uKQ{2TY+;0pMHG@$r{}$Z-#F=2zta!V_2ewGluFiHJ!^$;iRSOh3f_ z{^UmwAs{@S0VoL}00E2;2Cn1dllT3)Sw08%RH@|s2f5HnM#4$u&+6X7C90Srya zi(cKBu`;s6`v3vw>Q7IUFs+S|t35?85*8#po=}T>F4nTE<)V0Gw%F#d?N9=1_OXtQ z$_uRWujw=8e+MreA{AfFGAoDjW`yVLWHzK=XY}~&Te{_cR$zE;vwyWc-X2fEiS(1G zA5}vkmfLC9)wxw!$SqXtjRGCpnZz(OsuPUL*mVbAsXmb@6k?`G0crTN5@^^mH8jQM z+tsxyWXC=dvoq;?WsDhXhl_B8yv=m|OJK z*UBTAer_gG8ogLKCKO2X?Dc@uRV!3erAG%WO4Ta@HIm~d(h%a zS-`p<6~GM1Uv@Kc2D;Jwgj7Un0AduAPk2(j`-w*FwVX4vo<%9#T@jv8kGZG8zc(0B zvFS%0|Yli4H%+h;~^j$V9k00tT=e@JJtL3Xu%8V`zry$846yX0UtwBB5Mo%c1@I)5${R zg52v_4&`EJ_?4}GVmcrSA+;AaWJ#oCbj&X2W(F>Qi3KNwYbaJ_GNl4m7>v~-aWq0a z1gY8@I6s(~%yblu@Y#4ow4?0Yeo>PkJOP>;M;X4L7Ys4i< z&FJB)`O8doi0a}MxQ3iDB>!K_hj6RHEl5}}`Qzkq6#z3Osnk_7_ChW2y(b$Y#&e5G zQdyPI!l~>=nwYWbF*{dHMArRrB0MgNP>Y06{$KMa;0jxNP9b%MO0>t@LR)CHT5rJG zc0G5J`kB!P4<6B5+!C|cu7A@tk|n9xGqdClp*gLzNEi$l z-VRZGoHyY zUa6~Wq#}X&82VPm4iye@kEa}+9*>*m&hg6G_UW^zD_E`mIe{>*%u^~^TrPH66^JEp zC8(yGDjR81yS_xU#B|c9sqw?wg<}KH-j*Cx&F_8D`yz77kw&y+BDdr@7STJJV}+yf z{V72N+TLsEki~Y|Ra``8`i5hcXGWZwxrpGSzB7WhcxUh=(qqOM(ZmncsVfY7cDLA? zN}DCeA^1*i6Mn8qX{==Es0>xGq|^q~>4=pSkJlOnI@B*u7UXGk*;tJ*=)p5A9!lRc z+!+oME+Pjv)VzqrHl7XREVEue_I*Cyask;rBL_JD{mnH0+MiwqkO_ zBjDTsuOvXfqsB_>0^rbJYCboqTzob4NacO&xZiJlpIkk+g)EmdW> z98igRrb?)-vHEC5n4XHqPlVVgwhr4d4N`>S6HpfZ5z=)s2$X(;+`mmm*i>m*%+l|sUMc?TkhEC z`^cE&S-ZaEt|f=!l<%Z${N%CqyCj%TCiMhm;={xOR4QXinKSokW*_SVbZIWnYL1mM zj>k9;SNTbHseV*2k*HVqcdDQ23Aj?$a8bD?<>-1&OL4Iol^3}V_35bv=mwZ*A@NIE zpEUovg!-(OEcF>HuZ#q7F*c^rO!=Q;{VUR+V~7#&CpaNK{gjP}!dRjVeeAPgdzK)x zy$0Mp<=x?cNAUCIJ=Hj#;)fx6uZO_x>Zcoq#z>xq#fY3AfbfRPbC2SpLcnB00XY`Z zg zVbw5o?pjE+RM7N@Rb9gWn(4I*I?T z=II}Ol)7yG4lcf#WEL$Rv+YD4G)*A-Fg%}qe;Q0Pf4cn<0uZLPyRkq*I(@)koI-MN z?1^#?CjTAWRjd;ip)ocDjA;NrADx5ZW8Sv-D&D-Tq*22*NkL}qWZ#k+(dfgUuU8&5 zDd5}{#+1EQmr#TTk2v$6R`yrKB{(P3=ul;8RlRc^@{{f%573+^!r?#-ma z)ZfMoa-O}EtWwhdOE2|@h$SXN$O!*^!d%~ih~80JJ@!I%ZhA^y(GUQ_cRHAnl2@YC zIs+4u|5p@Wf)jV&$CT2eUk}Uf?q!yw1SpKP?Y=8z#$7gCEYuXo<%#%dPiSHfmu6PM z5Gc1@IJHIb(BbfmBUvW79HaAJkoC7?{XX}KX#ScR!{3heF)e*eX*i>nru77R#7e>F zvH)JJLl5i>nSmpRP8V#FqtPGzxtsY4ZB^Z0t9tkf9 zXQcQ_R&kACdN$>`>(FA|n$j$H`2Q+zWgk7X5%M1KCi=M)T)DeM)7wTRmnWsm3`(j* z&R-n4Wv>huudg4cw9;<)%je-A%0NQEX?M$mS=#@$hM|d5=LyW6EX2e=m#k`B<}}IX z^DQD1x2+%3e%Z$_%B&ZAnRwl~238MiNvicFSNTitm;0Rvv#wO`(wcomaWcHsY=Nb1 zBo_Ky@R7z!W<%~|E%gDl{*Jk}{y|+uDuE#;l8{_F(<#H1tK<%K|Hb0m`9Fr( z7XH#!|6kbr-#!586IbCK9al>bee@*AY{a?|T}sFaCe~b9<%z{;qteqXKGLJzoW`4E z-7YtgrTp}Fgc926Tp=UUlaeiDGc4r%Z1WFtTdZ=(E*nx1vFI&<>5c6;c={pE7>vBU$FtAJ5VP$ggnL#Q8&cPB_uQRpQFVRR zeDXLRdNuCFdWB7=xVLhQo|!oZYQiw@%o2UQD0*_qD*N$4c_AYp(d{&Sm^;);1&on<18wKVm*PKs}`8`(?m^V zak=LD<#UQg5mHGFjtz6OU`kmiX&R!!BibMK&-}=+JDm}P3L)c=J`3#zUdDg42SC6T zx6cj+hDIa0y>8V5IIHdQUy;J~I_jSO^%@3;=BN8}b0H-iT;DK+aFA7jan~P~%St0kZT3LufUP zbfx;@vd%bzWig^&6UjAsvbYKomOo^jl5NICvFN>&;!lM_WF}ABkH>w|l!E)FDCF;f z(e)}=+3@~Yr=6i(s3u1))Med>adMSXE@SbLGxkZ~2xbf{8KaUj4lEfxB|CXF`SpNo z$~1IZifw7%a?iTaJ5yam^wHBi*9vfNq|!X8=50HjzEZ(nZLWT}w2k4Y(9z1n`G)Hl z<(c`8>xgx5Jp7OemH~ojnZgd7n5g6!ec}q_|Iihz@Rf%S2bD7Eu}zFxX*whB?`j2^ zjhQIoLhi4KMzpN(7mH38KNVjOC%4W}1{bbGL?5`UW8fN`2xh->6avJ`$+7ZDup-Jb z$MM27BnMZkePXRMG%2k#&A1E4OO(~1g(K0DksJ1%Zzn64xggQzA@X-@(0Oj#6+DxY-RcZUB)1JI zB{fvIMHtg9-!d6cA(k666>W=|^IdQamj!T$aWejvZZ0MR95b191`Y{*J))neQIP+~ z)c+9xUz-_w%Alqhd)P=h^rh6pGX{g=tJPjMifZiRg@KMOFZo<02Z)mVrONs18uHBW zQVpw4DIYQ?eIgA9hlo9oAPXQ*;nS|TI#=Pn0y*0Q`|{VsS7N?Ex-^%41h$1Q~fwWAT)j<Gk) zaEq>E&umw*lve7Ja77)JT!+y#A1f{EMzX{z*?Lpy=`OuUTJ&>h)ET;zBk*dV{p3>c zr<$^rn%Jl^MFp?~IwWtFE)a84+$M|9C*=oySW;tb5M;w08#K+{KUPM`iP$iu0#l-& zU`?85D%=gZY#7-^Ewl_MvmWYtch5d@vGGpII#}F{HjG@)^3DGVnQFX5a98d^ZSQ>rBV=K%U|XGa zd=4T@faHvz9Tmw0+tQi?4TBj$nNOyHCSsJ_T+>{|-nSe@Y}m(S4&m-K>;!L*uZR(YV;pN|<@^_5~l-%}z-tmkIl_qLLmMlR)SIZ1gp zpsXIC&9zZS!YLX8;%d^P3v81uKGw7cb%m5>QWd4)aYxzUX{RGRc~u1Qwp~l{9Z%`Q z;wnWjLZ_5w%$?AV9o9fQSx9M2bpA5~p;ZYf5QG!}ftJ`3Ttkf67EEcQLMTa8PMomQ z-bmRBom`?zYi|V*<=~>|DS0$# z5nu=*HR$ilJ`SecT|-hixRuOFNBTRizlhSdPcK%t)7{5=r$KmfnPz?ZEJ?vEU*E?X zbfLIaer`Bu!TRMEU!-9307-^|GK;h9*cbP}hiQSa`Mysp`UQ_8B zX{x^!tB<75`R!7q&jLY^N}tm1)}P*8k>i!ArKzv@JX(Vn={YuvzARouhIpTD?h_i1 z<|ApR3^hUu3V>H^sg%My4eO2x9De*=hUVnZQa*9;*2i3kW#IfMj92X=ySI)Yw8h?vVehID8yXT$4Y?1 zcgyxq)BXbl{aqTo+%QbU99XC-<5DzW|2uxqi!}TV{ba%Gw)AN8R9O|J~^2FWh3X5s>sQm zM9UP5OeZh77Gg$M^Bh}wc-bav(L&{_Y!itZ-090^_sD}8^)bCcIhmFYjFCO*t7u|o zOtk%SzPF7MqA-Re%MWecX!~<%I9mSiw1R+@u#*g#;Gf&$?{NP=@Z}um|8NqJPl$hy z!YI?L4eA8z2+V-l+B`dj_4^1}qPD5T7je<$L&hBm2d;)(G@$a=u zOcU3`o$_qfa^H0NT_nHg{5^T(7?7*mLhi)h^PR_jAm6f(;hQr2_qYSVQGKq^lHI!T zx6el$YfkSszHU41yG<@MT~vCvaRj}vgV)Kr_0VL)tmDqw7g6VbSIQ;2i5nN{?2ZDY zzh9lW-WDA3JqMgcPUVfF(hmBG>-66UtYrDRrWbU^eX2@v|3g7yj~1`D-@Kc*ad%SW zi}DSvl^X*W&RuKTdcJdyZa2~CAlLPY4Wc7^daOgcdmI1nPU&3c^r6aA=#5fjRcFJk zD4V9ck5{e}70nd&r&H{!PR4ZoVjl8u@+O>5s9QsSBHlR1*)IQY^7wxl*(LCYP+~BE zfB-^3Oh`yTLh$3qQYXKnq9x=Yg3)s#iP=#Kinb(5bXezdLUF37+pmlhEuAM@kAAt4ajsQeyw zXa>iEsSBlbFH9bSq^^g(IID~Y^vGjEAjne`U62SufZ$40rO4M_WLZ>x@1s+{qCd^x zcxT$Ah-EK>5pM#g24j^t_h8d(jRU&1Uur2Cd7x4n%<3V{(8bQEaRCiFloYE+l6*5X z1Ca)~N#Gsa*FQe*A2#Adl|~$*Uf?8PN3P3s&L7LlspD$I2!5qX3sk={q~y>~TaIUdht$=SRiQcUgL!@9JZb-A@YJCJZhp(k->7pbfbXj1 zX{&p;&s5C6oXPONH}En~_#$l{)Hq{~Hd67d>!-VCeSaBfuN~_%8TOBbD(3a<|UT+(6b^PnZ`1)3CplQxPiUZ{KiYv>L zx1Y;>u6>dqnkgtxu788tDvcW_mcd%`P$WhzW#C_>ClEbxUvaSYhBKBC7r}k7I}(PB zBGc}8taACaJ2i05B@5QP1*+Cs$;AhA)Rzf%g%vmSupCOSwVR#h zb~CPz9)xz%cZqHcG!p>)t}Q}mA~m{1=h-wNI6dU4B)l_ot@b-PyD4nx8$p(|G~&s@ zW|QWsrP<*U!+Uw3TRVM&8!Eqk{VuN*a@xGonOg0f%ehf`WgeGD{7N*`YCekWf%#IV z%z}^XOe5rb<|#OkcZ!z|FSw;J~%Fc2L zOH{rjbxY{y64hlyn4TNjq6z0RdK2_WPmmriMCi;?ZP%PjS$#YIMXx-y>D_nHf<32M zGDX^CC?XJu7pbvE6r>15Dj;4?^71`zfmUzS{zbu_o-U{{gG&P$)*(FOwW;(cy3h<* zLWzs~)8rf3l+4iS)JrxPe%kh7Z{p7OTizyZN$l)<;-t6VNO#+E0SMb_L^@SS0=wna zT@1mu#H)9gjF%qs+@6j#;pcnf?Ml-5xom1%BXRSk?IQjWObc0Eb>sGA&?$zw!$#8# z1@7$Br3~JOae=qz%^sy6n)u+C4{wn^eYHHhqPuqQL**jLwdouDZjiiFw@p=DNOXJy zqDInRLp=@^C?V~*+PP>zmzc`32LTJmghWUxh42GxJ2dWsr84vH!>k_jC}xF$3kC^P z><}$fQvjs|B3o|>Wi>e-WJSg(-Z$iTnV+SXm8TbXqPZoEc@T$Xzn?{(&_f<$8FM2w zrBv0))QzZLIIJQ&cu3xIhdJBmHbn61wcQ<*aYMQ{Mbm(jsTy0T*EWO%@%n3ay0C(+ zqhC~~yd_cA;7~VqcdOhlc=~kS{IY32D%;rpVb?&Jd8vb`JES7?T;@!$Y4<1i@_mCR zf}h^ASF6)+i7*nEf2*0tDxbSFLv&h^i}|!&<4Xos_juAZ9rk#wm(}TV8Sjf28?Lpv zo!UJpaZ$LW82MmU-4tU3gV@bG7!V8;lU=;wKDe$?aofU>=Gpe4Qx-u8$MCHqfMf8N zM;(DA08`U1D-$we-nHC|Zmz_+MRx-m5#rcrf7_`+hm2KmluxS+t?!qN+h%4=14$lk z5AXV4hAqincDn1zE+gY^<|i2Xq&>>)_V!(z1Yka7nu?9?ff61L=f4KDO#H$_2O`OY zCplTFF=n9{Ve;Dr^H}yXQwOAiWFd6=Y>gj2LjdyoaJmE_yw&*1mTlki%eY@?Ta(DR zl8Fmd!kM#NH21J<0JTNOaPR%#{JM|dQ|Hpy;Zx9CHykt$@;QWN)Q`R+m(vUqK7 zQ_1Eotdn&jOr)O#AW~-uhlL2(t_u=%Rfh!MXAdF3o^h6fy`xkgRnm3j%HYT!R*3Ot zm?K8|_s9bw5Wu<<_`08lf+MMt2i;1b@K*LGwrRxKBdh{Rw>)ili6pYsO|z5xXZ>Nq z7dM!pVV$YAPxq0xMU}{o7464s3)o= z!o6-pr<(25N}6X)QX0x=1v?1J`y>8Sdqy!t*Zv*^y8dT>?N1Uo_(?w11zZZ79=hdhj zCI6n3E9&q?4K~_SuFoBB;qNZcTnG1Yl}ZLo+bUy04|R0tST_Cu@HSuqU~fH%$=)!k zc1AINd_Z*ZO7txpHLvgohF9*b57{_Em2X5-owj<=;1M-=O`_U};SG5#&d5J5gCIjb zE>{iX4jwSCG;JBP@Uda3XF>>*Pwk!i(>W6Jv{hsaqnDIkU2m5qDmS&*<8GM3MVLy0 zB-e{MIc*ZWYZPMCm!V&m=NdbsuMQ-xUHo!LZu2(1vFp2kU%A#>;LSl;nueQjNgQFl zK0e&!TY~`eRi`ihXWAbH)^3wFt)@42yFCq;xQ@TUeLr6i<(YIzf}@kN!bFUe`&46t z&F?1xZG#?JG`AFcAgKCcgi;FKnRyyAg2m_+<$u`rp-jn9vv=c-oG!F+lVjIKnk5GM zrdb8jh_XJ_$h$$NOxqG9=DwOgkm|sL?!Boe4y=~Vi3qCc;Zh0+}?~%|H^!v>|6Q&`ivxi2z#7{ex5B_co@6y%Uxp>{& zkBnM%HkoLgmEzN3dqDn<)i1X#bGrFo@qV7JneR0uzR=T1QFf-D?wZcsj62{;-HzZG zz7!cC#q!-<3Ggs?YvSmnhbWmKDT&xAY z7j&mu2cF|MB}i3*l@SFEIIcV>G;D$)gf&)NBAc(H&#EgecyK-zc)R7nSeLe^ zRWS306;$^e4S)XO<&GoWs7tHZOP}-`J?9AA0MHpuqO768Mu#?AZ`(c&LGuB*T;e{y zm;)^G?4~!CU;&nLikFh-B*g0DHArGZ?l-Ly-k2^Vr2=&33qL2lXI ziKEn9AMO;^k&QLz0h!!#SLq|=rNq(}@H#bKg?c2@^$cR1P*Su-gm=*F(@OZ>P)hYF zb0j(YE*AM+xnA}pzWUB+>h>KqV45$Z5^$PcMfZ*7G2qc8ad!Iqt7s2*YrKa<+Mb#2 znWhUm8}i66lQ(ATAI?GtJ9+#s;yo^es6*nWhFZzY{Yc!aMA{$JpVq0I{#F9{v=wf0 zZYKC{u)M!y8c=B&yOlA(5NA9q6WEe|Xrv?2xcucDa?xAJWpL9aV9F}G@kSG7b~f|2 z=^(&4`~HyC-D5e=_0b-_j+NrQD;QJ{H4ExVrtK~K&dScb_J;Gntw8{Aa$R#M9o16YIT-cZRFUN$TL~lY4cJgq$R_!D zFn)Bi2gycQxl%&H2RTlUOh^U@vTD9-JO&gNhAS3luYIv3%KmiQgtl<fzveurLxG^l()pVsG=sKz^e1i!HlW;rl`?1 z^PX0LS1~eB!gB%N9tNm{zB1;WpIwG9%o!I@4Da=XK+2d%9{ zdWQFtPM+(MY07ZgGYa)(x|7Y5E<`Rp#=QZV#PUmVA#635x~Yv~P~z2|vH=WbignEv zbcx}>3{%G2mvJz>^}GxHoT-NfsV)?Ze0xI8pP0wSMli(!1U#l$##Tw*=*i~vIadQJ zTO#!uYGcOo5HpHU2w#RwVdwh?bYA#9^#&sOC8yh_jG%T!f`eq14=}xMCc&X0nYvND zFl%l~Q=mQSxpDjkW6Z#E*X9MIj`hg^$&`Wm{dzBCU#zj?J% z=Y}VIZYd3*cI;H8BQrgHC%D4~S9`Hb{up@t4`FuG?J%c_B9FO@U5Rv7rpR}DJ0YMY z&rD!R1tnfFF*CfbSAXAQR*O|E^5_^IIkHvP+S#+!7Oz{1$;{ZZ5zC`&O8iijjd_JR zU3OZ^>rpsPuW@yob?hvc(2}Ft=a8$9pYMLFsz3Yo^p%+k^=ko7hi@J^HFmIGUl|xm zZVP1fZo0EUqVr_W6#=B(#h0|z>86)N`$ahB+k=~U&!d?reUFHyr0p&oclODN3fdxvKvPSn6TbS+8gYyq12$Oin5-%>;@+#QFs?Q77*>bUc z)l9E&uneo%&7PnoWw#8THfDvOpzM*M*-@HaF~XDs)l+16z4H$l%TJONX8G_zkc?M> zfHL^Wq9!*P83J4)m};7cCt;m~3@Br)+#9c2RIhsGxq!P}R2oOO(#aB_)o`2et*X%W zET#`6%Xb+o)ib6Nmo9QAP%qD(OJgLV+QKL1>vx>0FCdo;iPYq=dN9Kfdnl$o`Nf57 zDHe9^7;uI;kR{kU+?+Ku=~biq1YcSGlEu{4_)eNgON}OO%KPYB_%b5{ccAd@AMtmTKSvwUSo^k(HI!`+>`BggVN#`**299iBt72?t0u> zrzQO;uatQg!+zt1D8(^g@KlHtX8nt7|Bdh^Xvhq%9yL76Zl$Dj)xvu#LtAd$&FQ@c z0|Zst$7*I;uoF^-%9xuKu5h!h3z-_)qG~!as*rg6#UcIiDVF%{lqK6I6zN^TGa(xH zv~BF*a;-^?Z<9^tUf-P&X|1`{dex8^awCH!9EqS>CyQBnY%BO)kbvR#N~}Dy1QA<& z1_@w0Wfpf>LxQy(FgB$l3`7}jmv=h>{otoq7O+HD>Eta_|9!xao2P?AQ6R=Kf5@tURi3_g7FGk6?ehOr zzw3dO(Xn*vI*MmS!ay`-MSg;;R*rt-LXnePY6tO9oCM3uX=fG_l|Q5?zQsU*0jq*N z!miKwT__bam3rXVxfjd;%#eH`J<28t!BIb;-!pVmb+$Sb^U1Uuzf1GPiFAZEzbqAvGD!v~Sp z_Y%q;#EpzjQeef95oY#u4&UBXG-Wnaz;Bu}E)tnL;t1&nUGvpY(xoAm?bdUGcv-6l zFXI}_BZMBgtcI{v^=x??HYK-#y;6JCJ35{82eZ(A1dk%wqP0A|LiCc=pvh&{Xx+Q7 zFMDrY6xva{=0-%&72IFa!n_@wV!q?*L3d8b*xcR0^%ipP@@LyeTK95hNaKyl6kBf- zCe1YLO31ub&)B_?{`pQ>K*M96`HPobgFo$@WQERPu@U0ADT0H~ zi=B&eJXgII-?Hys-R0kNo%&>vLRvp{YBkr6CN}9j$M&_}&|`ohW2tjFi=XhWS2gzw zu?u`x?el9KdlwJw^XCkP{CnEs)7{+Nh%Q~aH~wB`>g)O$vG0UFb535D>Lmy|`>dBI zd^mxcKr1?`I|6MF5~?B9HGMzw)K9FA#ws3nr(Q<6G!AB{j$a#W%n{P0-%5s4uO8ft5!>Xiw7j~ddrkPL%r?Y)=q(9Crfwh(d`m_#rDU};dnPiVEULAb7;hdD zLcy|q%ZUptp03*g_1$io^daoY;=EXE8B#zuapE&Ro;fqrM3p6c=mm4r(|Sn=ZG&w% z({KE_0eZD}WS-H)wq)j_^UNFx8eD#_Y?r@I@aDJ_6mMpS3#HO&1Zc*tZ~=4bfZ-J zGs~=mtK=b%HC4H2Vm|f9;2&Rgs%~5?!#`GH$vC^I${U;xPo)VZPdv#C$kc&muuex5}3gRUH0i?W7I?+t$hDN#xbyrPn|iHPCF~t5o@y*naFpWR$)iB4~
icHWIFpw`b!|61(fH^w&sx6j?VNdH;ikhD?hi;Y6s=ixemERqeUj+__%lUTy4 zH~aT;bP{F}HISKM#j88RN+YaWS0PkAc%yBa zhFsp_T0%XKWH5=A;N6HYp(w$Uqv!0klIzy^q^}7fSWc{GU35$1 zl>k}=?nn4{Q-&O&QN_9HWxA3TiMcW_#PuF;1yCHIgmlB+i@z`1JjJqQDRhC9E|EYS z%fbK_A&S{luEswLNTRGJxYP4O0CNHHvJ(#-yw-b_ra^u#3|*nwU^@f2sH!&7c4o`R z*v@;3zgKnVQDlCsO47m2aSX(OAB7vr#K%CNb*i;*&R+549p1Jz@fCEHv{vAl>&Slw z|JNAg7(lOYtU7CVgxsjs5h+)v>HFX>(Jmm;=b6^fT*(qO(_&a6 z`IyN-r{Zn;mB+N>Q47&DRo^qe*{aD}HIElP(7xCvF5a9ge)Q(+EwU>uJ9)8IE=Rwx z9s{SIAACbTU40Y#_#Ue}++s`;)8~~--O#RK5&5pZ;hWN}#=Oi5gK=@cZ;Wjwryi^| zy}RQ2J$vm6{@nQ4?5;K3-TjXBdDrU~UTpQOx*Xjsy+_)440KH_;GYCNC0)PpuDMEW zLi+n79|bMA)?2^jd-t4Oc4R$B*X||kztMi%Y~@aocc-N47>FKcnHbxDf9|F%DbyxtEB0jsi|~`hGeFG(a~vaZ@w;M60@$=a4EdYW&PvD zf@5IQx}p8XWt-1!ZXdUgfsPk9G+k$-=7Wvze!gp2@gV3Z?@qAB$5ZS0YxV6c6Z=)> zA6-lg#xGqy23)@(k2-WdH!jFAU5-vY z$qstSH;UiReXH7kxyr~sYwnk#_rC=F zvVN8|{+*=9`1RY?=U!gY@f3f1L(6N%(uBPHUeAYIo$`&fqYK4BCTrg*zEXFrb!ax; zD)#Eu2>m9v-gfRD?n6hJr09is&{*F~-+inoc^Xvlx$>OJi>>m`59dDk1uGSNya|0N z(!G-xUedGk`ku5ki|?G|iWL;j=tfU$ER^+GXT$ptk}J|JwL z>w3Q1kta}08bj%abcN;D{Bx(|JI zg+ldvboSN3m*3pC*W=rR8 zDx*>Sgn2iW!$bZTnD!UZPvFWA$^C8;m|Z!~K|GY$!(03{UMuI$dzj5LBA6(5)+HC! z`2drUbbaf(atcq_NUJ-Y7W$RS(5xR_3(YamZzU$-dT{Anb*x5pbusykWTRK*^f`5Q z=)z2l(IwwK+V|0e9wk$Op-{AF4PRC!W|_gcwhG?k(J*i>YyVI`D3zdHmIuQ)219#pk$iFJ^ZmcizY0RFB7l z&fW6nvy;tgKcHED&Ksv%82I?U_ML=H_pjq$%1XAY75Lkst*dt926fj}zK*>=((|ID zWjMgvtIVXTDIkO7)`g*?c^(DzsdSh~19}c$&gL^mbjzw(D8ctn6NcGL$e`dIPj1MvbMSF?-5Ii{7RDb%k9>y{m;lSiDyHl*Ei9N7Cy(CE3BeSX0_<&L)p@ zD;DrOXOHIg)jLLt4y&&PI>T?Tf_E@EDQN#A1)2MM{VyNN?iT8AEqvYBj{hEa!0b|| z*M1OnHP*3oMt~(Y*f3*{qAJn&JW5YZ5tbuB=zEE+@BIb!3+lr97N0a<^c&#VH1|<2 z5@BJI@iEPD_6px#zI&aWRnx7c+Z0t3T+{aP+t5vR>Gm zlKVk&nbiwZ*DEEzZ#fhNQ6ieBF#Khxqj*(jSE|0mEA{S#dT`OxszsDV@V3;N=dnRN zmxx^W?uy%7)M1O5?zeOuxC^d<%tAelj)Sk~it4-;049h6+c(i6l|wn;HAGUa#eo; z&%|)g8#XV#)a~mN6Ls;+sHOjme<2f-S+Mh`c9S!WCTHqzvp#*C)Nsu|)BJjZRnwb_ zfAFZ-L<#1db*%uKWy2f+VIGs=#hMkxYXf~`I@!$krLtL%V9{JWi1`!O2@ahXJR+0a zSQDH!s{d#-vwx#{PPMv)1`}1}UE2*+{m7W8`oP4tTknxx+s1apMe-mXTaB`;$us0{ zJRAP-nCDtKv7bl3dZSj#*~;!F^4Dj6d(LwnMSm9s`pO)y_*2DzIknPrpOw>Ep%n6& zhYZcFP#M|INIF`LvOARM)eDzdA5f*ci>+u5HD=N+8=70SB)4U7w>-+m%YwC1J8e4~ zUZtz!A&q%mN92k3&gCDRy{WFZdC^4gf@E`r?}N9_mrU5M1#eDVIodiflR3TEyIp-t zB34XaoNjnuk-q(ae0kTkbx-GgVdmo}M1}kC;IzA_!ZG5fLlHfXKXIm%DhtTSAg^-V z%|3lPiSPEa4t*WbPh(ZZ4^GUoZ*#rz%_eoYsXoaA(-bC+)0B#*pFiAW=}BrasVnu=quf?tg@Y2;)VJa2fV8+-?mhEI-ID`g{jL%mMT)dpZW@` ziotVE>%E4@%Pq-cpyiV4gYTOipMw>d6z3UJRo^Hl+hxsu6yS|?OiWs$LEGoYGL4YO0BlDqA~))$ zug8VN&?)B?W0oaJGyDtiZ?JS5`Ler|)4NxYevQq3t zi%-Xj8GO4b`9u!=!oabQHb8(vL}HUYeJ?N&8vDFlRsb5C9J};!K^euNriA3JW{zXptt_pbj*RQFu?M+pP&M5Xoz!a{lu!ou4>hDPX;Ce<)3vGkqAm(#&JWs20 zl=*u34cl9-H-x0VfaQ1kHQyEG07F@t7rX9FcksMRTsd& z^P^YMu%)F29yAj?<+X{ovf}r&(%i1~*yNO;B%S#(^@tA(z3E0l`l2AJdUa89)dlVJ zY1OAgnhn)chp`#;+D6trM#?>jPdg*3f-da&pdRuzO2Bf)g~-ihV(hK5YX^^kBOiV1 zOeZZJHgl_6LO=G{d5@afRE;|J#IE@tn``+{;G#=+{N+5=hf)hK1>kB`w=@ze934!x z(Ea9aGO-qQwAuQbfqIl>;4U1^wxVU~HRAA64}VdtXG`tKr)oTP1HXUp`_41U!{H1q7`vxP$iP7rn?=M z>{~2?w2Mlg5#}$Ajb{_*ZS}usZKF9%&B7|%m8#8hnr1N`T;RT`bo2%zX}>u6aFM>{ zeqV@A?pBJv3Z0r>CeU8T_W4GZ3VV(vmxaZ%K1LU6(I?{WFx3e6VbAin1fPDd0rw7) zm3jHJ{+ng+ORv>~vy0UyZjpa*Zv1+sT=b)8Hm|4E`x>XdRPTEs4;hKUZc{FD>}xxp z#B<)km&V;wHu-{-;u#OjFd4TKqKb^7EHuTLF%PTL3{Sh&K96E{r9>ql22cq_rVd5s zn5gO(b`9naHmlf%B3@Yb&neQWaAlJ@DpIJxEMfZAr$$q5yl~*k3e%!L2JB=iyqrIT+vU*wA^;zyW+vZB4)bNVx%o3ubr@95gU`yn&hAG{4DmkBITh8lq4RRE z@iu-=F0)NZ`bnGj1|3EybGq~+>uWj9-bnfgj$flOGNnr>4siyT6jAcB`x^3j9+kXE=Nl@!@5>>v$K#7Se`z{_ocA^*Y#6P6k%&$u zu}AhWaM}253jc%m0kz-bx5m1gH!hzW4QfBzUG~xI`(?JPPtROt3+kxMdxwcEGIMFj zVCklmSdgx#Y6g!Zqnq?Dh;FK&Y)XlBuy1xjW=&k@pM0*m&lr=z?DBy*Zj;%ix`$GW z*+q*P6IJze!kV&Q!H3I>yj;w{v6#1hpbJWl_G#~;{l6%C>#(Szzh4xj8>Er$Zlpm{ zx@G`rL>i=F=*|I@lx`VjhEhOjkW#uskOpaomc~2i@7(h~=iKu?_x#1fp0)Q{d+oi} z`hMcOw)Nc`vdmK!RZOU~qeCo`xp~1&?+a1r##x{CkEQ4L@LrPOFOchCLphdRo?zSBiEeME_!~f95 z*`RCJ`N3-8mzV)@OJ|)V!MNKZGIV)f=2P0o-&64PqymxJJEp{^w)&j;A$BQhQ9Zq> z+OlgneSA=!ESVgf_-K;UzzD4Jgp`?5QH{Uysc0^j-y_f3gEvY(rC-X&whUj8wW3Pl zB->=CStvuyG~@Z%3tuVkXul*9VzuZ_?N3%Fd$Dw)aR#whvuJ9X%E?L1*;dlA&9Zgq z+4abs_dI4Gh?+Q%r`^d{NhFjn-dH}Ltc@tXGxt2M$p{j7&S0JHbQlOL&-(D&@AQoH zi9l?RhN6oFfvf}l#fK|%xk1@ar6F{&_agXWrbAY@pU-}bZ`?jT)90LPoW1^q45XRx z=5b2T81J0@+y_=Vu=Y(uKT#HcRG*)ZKXpvcNomK&UU#TqL3V%wtxB)C%8sof-X9e1 z<1bMnEHb|G-!~F?wzCu8toceDFl$Y}AlryQuc52_A1k=nc&>mV(QN4%1x9l3?gA1c zM5cdGKu-EJsap#Vt42xz><@~;iI{*btCrUBG;(dRVQ2T>v*oapBi0YZdlEl$`8dq$ z(173%N>Q!+k=3q7N9*AdePkff!EdTzt=C-3)j-YR-mjy0FM6l*@cBjcKTm2qQKTgg zPe**t=KD-F3Kyd?f1HdkIpv11eQnW42FOxxx4Mph7I(OpkN&0%nsxPJHT}8{H1+=$ zxE(;Qr3uaGZxzPYRu>c#n`{A_pB?wTzeg@B$#$Lns+K&Kn3)# z2@&rgzG@WSrfEvYB!o()m5J=&L*t2k|@$RbMysogg>g4vLpxLB+Emx zY%JnSt=Vl8m3t1x&hcm35hRORj*-wFY)vZcD8{HVqOAEW`uI}L?7NCr+~SwyNH`}% zf=pCF!@$Huf-}^AesEM`1xEcN62XXxH722F9;qK+dWM&D9Y4~uPEjoW3*;XC19H6H zG+z|DVDkCCi^9aSn?=J8Cuxd+=R~OT`D~b$@vp;6_$5jkZx+9Hmbi=wpP23lnl(9_>8U(c%f!W&iSB5I!1@0GZ zY7WZjKz98Bb{w9TGkVJyY#D>t*84X|(YJAS@55WeS(-0K%=M<-PffdNx@meQ*gp^l z4KR7o3pujIPxvTCe2CS|s?z%U!I_q37Cdh3v1I%rH12y%<=Imf)`_fLbs6X0;d|?v z-QuxT!^oCvX2uKT9g+71K^h7AU;AsnoQtY;SCLG%W?UUd@HE*nRY`#nPZ%<0T$b3- zuNWLSUxznqXV0!)3VgHx{E}NeGJ$j?#mlZO+Ifo3o@izP-MpXHCi19oA-zWhFk(I<-H8hQ7zRyYH#B%#J zHukCLXnTN@noJg03;iKH*;QHP*6chj&NPkhqxT)NB*czTDzj8u=2aDL>$u0^$kuyIdu4m|%z! zT-;L4F3bTXxS(<6W|xUai946LW|x(d1HB|uFrNSr+dlqIu{DmGhgKvarD$|5;?ZVb zep%WN56`)Vr}q)HErIa%MNY-7Io z_Z4TlkFjwJ$jU6~& zPJQ$w?&m;JFL{(bS6z35t6+aGb_|41&_-3faKb53i~4l~{ZjX+7I9sdjfoT9Q?&0! zUWF5N`DXWcVaO@Th!_RA_boaG4kr2|EObod=7y-qU1FJp9xLd-L?agVj6i2jEh+uj zH8DxbsOS}WWMFNxhH*^BBBAY8NzSUI>>Zxc1AG;G`$jax@)?3p4QEj3S6{21CDNuW02{IxKem8paze zmj52Q;(I}8UtcDZedEa%G{GH0<7ev-IlaF`$WTgt-863@RgEeK%B~ z{L4{{&UQ&njGF2rWKCBrLw-+Ash#AyXxFLCw^SpEdSaBH%u2|pgX0g%h_+s0VkZU_ z8Cpqq^m2DF3HU;O&t8$%rO9}JHo{J`Mz3G-P!ZACvmQ4X)SZQz>sCZgISj~cUhN}x zLyZF?v>e`?{Sr@Xm&Up^f=IQbgmnjXKiU_%WT)I&lhGUzd&g%CGEurO+mxOz6}a?k zsoBMS`F5MShw%8e4cNPQF~oW?p{)tLzb0KThaKt+I<b%41Nnh)P;gmR?= zj7@{{BGGUS)n)gNquiv8IlClF20XI9kA;g1$g=YtlSYv18dE6WwiHP&A zCV~3pmb(Ef`H|E5CLlM3Ur?k|OG&|884FLX@+myjV#atX#yO8e7h346JJbS?3sT3O z)&h}>DT`NdRwW7)X8WKm5}aN}uF@m0L^=w)0vYNZIx(3hyjh1pRnO*7 zWq<0`*DsQ4Pc>LF$?W!to&?R{4C_DCPbQ*T_5>_1bZGopoZUvpG|7;NQSc@=TYOa8 zFbMheq?Y%_=PW6qRB)1Z6mDI^-P+qxLK1Y0qJ&?X^cgQ-34@Hu|TLJj)MZQ zTm7rjL!Gb5T+4Ylqo=V4Ml^3nCQO3*bR3F4k?~TFl7+H*lU{Kiq#E*9XEe<0Y*+;@`Um$9D>z=b#l@IMw z)z5C4ubyK{#lWG1x{XK;4U;0E8p7Mw&h)k%P@BX zao+Iz9>gD%V7sfi09)*s=HWv#NRqCi?F?Z!)>>!-+RWB6D)BaFRb!yYWoZxD7<=fa zcww~j0CLF;(@Likd#w|PedR~Pb25XYA)HHUl--GA`VceTqHhsy?I-hsi#N5y1JlWLJ3|Wyc6ObYy3u zqy5IYjA4~?%(czM=_piYC*p9RKT%)#|X{Y^>jo*MtSfdYnFIOdNlYQwz zD6XgaQeK|~Zy<0c&DemwTf4%&^KPYuMq4-J5Avi^OaZ#&9>^cY2+`{Y! zUyH2Sp9}AHxw@MH`ceZHko!2m*p*GwTgAz)guj5vlvP$D^L4u@Ve$jApnZ{mvry*} zqUVNmQUyQ3AOdg|pQKeg(7&@;uO>hf3{u-1ESa*PG?j3Ul^M;y*8xd#POMsj@3Dt)30)Hf&W1nj@rW3 zT4>af@P~eE0JRPfWn9D%pm>|g_K%XPqlY@S&P}bC8|8&E$Phc5zxheH+G$uL;OtD4 z_oXa~ar(9Sh4kk@^qXlbUOAo!W8P){lhUsf%ZIFdHctXaqXNuQIo1)au%||H@1G3{ zlvgZ9TY={+$Glh@r7QrIYZU1bF@K#rE1X%QQ`BKdh$i(TpR&FWCDqh|ZBn4^<*JON(7><>e6GPr^7TcFp7|3%Tax43U?nn~e5@8U(dt6R@#~damBQ+tufb53i zl~o{1o{S?!>iqj(8eD55VLjV#FkVtXRhLT4!>^1;hjp`}9ac_w)4I>^ zi0rrzyFwJ!#GVF>14Quhz2-mgd?ML>BK{P)D&lh1%_5 zdl$MYff%+5hYJ#dr$h$EGe*YNlOX(IWa^YTod)GIK}8rcJZtUN1v(U|PHSGl)tt;u zY0_`1#B4lB^#uczLeDnvO)@z;e*-9UI-Cv$zGsc#$lQ-se9fzQj{RI+H?v$)8y>$R zJENW6Q875#prvRm({ZY>S0IFcmdl6t(HVkz$hDK;Jql6W{F2Vq_5;Id=$GwmP7bh9 zR09A$qs?0?PXiy}g9oWSb)mR>PdrGSa_xsN#hCnZShZ8hdk5w#x4`|YRr|=l9)pB@{ zDvb0@X1a+lT`G&-c__rHd`W`v*Cb~+XzQNM;m9>AMq+ zL*O8l`E_hO%G@GDjA|?ti#(@tL^9{5RnOI-^)#cZL+gHDXvNE|wSCUQ@@UMA;7)FX z>*my8PM*%S@}gZ^%9j}eDcoFp+G@;A(z!@|vjVzzc2&cDJRac`E9U+o$tW?>J<~DV z3nP8GB-)h!4~n=33Lp(1iFvV*~{ODl-BiVL=aalw@0R+3wVzThh$w1S-J@{MC0Z+Bc^4byc2 zPKSRPC2CVZ#@ycpS|wmf*`LSwiIzB^T$W}iu6L{iRR^R-xvQQJ6bI+VnB#HRehmDf{7TvHcp0h_J3X=LpX=kk zUEMqF<9eiq*xt$Ex&wINMeH*Mpc>XQrWzIKeL9LR(nxX8nSq;fHO~L`JGBV zj|`=2bT-{oOBG*%UD9#PbL=%Uu7uH!pq++#5|~DHwpYTa{dOJi%W`~!q(2Ru*o95$ zl|dV3YR-n7`DTzj_%0tUUh1~bA!_F&J2xC*^k}H&7eze zIdUbr4mZmXK*se@j-Xq^9l7pm@H_7&I1DlE5y0MrC5JPeZb|Cwvp!_ML+h&szkpR> z*BhxP>f)ylw9L;>VYW2oqOTeqj7vZULvcDd+*iCg3!}Q*ccgWA*dA9nL_vHklVkvG z=`HZu+j0yQth*KYKp}Ns5kWW9ZtIz~@_u?ULp1_O zD4X-ESZ70|v6?iuPvqw~(wb4W0cNygcxJyoNL33S|AQh%5|m3H?UmMf|Mm@6X)8i~ zls0r;MEkigOm)`wQN1o%M-U)VSRGV;#)vf{6gvUb(z1DXX>_ zNA~>b;k!-BhP^wgON4&#;WRR-X{&ENX@!iJTKh=Lc{?$aVkg)rX&kE%JI|;B>pJUp zVX7SZT>;Y`}}6(_ip2Pk!PWQ*q5jG^>;}Xhy9IM z3Xo~}RaUrdlv$-@iP8Hn$8hUuAG-WAX2}`>GSxhN3n@sZ#Eedsdr$J9uQJr4gPQ|? zEJPzVGfU;vZV>>;5*Dos@Il@^75ps#cHK06w8cOkecL^S{?! zOIZm^`^1iwtWSkHyF;t#TemI#uy&u5;Azz6V!)rd@g^iRaVj{qi!%|CB1iQzC&QZz z0t3h*iF~Y5$h`(%u9D}N=oq$pZv<7NnLzAT^-t~3Rp-*Ru`0R9j0QXrrnX`f&)GJC z+ta2N6lLnA+CI_j^bRDqsp%Vy4eirz;%7a}Sc6Uh%6}Z60N_lIOm(%UFkSbEnTwY{ zNb>q>=CuyS=Re!?bqLJ!&}J{Zf}}qN&EPcLcRyNpXuU9i+fLf(TvreXPU$6K%eq4+ z5;!DlCzl+vO?`tiSRN6XWhh4UcjUnn#AN4~m2~OP2?ftso;Rm+5IhA9NI1=mL&jw> zJn2+I{F+1rVn1~rf(L2bx!=2;8qjoV`re1UhaSdiqnm2n|ini`G1l}=_OGju;axJ)11`1i? zxHeBK{1p5#b=Puutjg=u1Q?;JMgMHR_b>>Gui~yVQjvIOhIDactK=&BzMMQq{n`A5 zp&iln+mu6nIkY}Sni*4nS%1#8aw_SMdOz`wg-`!CRD6jl@p4%{3!I%-cx797%>{EV zT2TxJrc!frb1flSTr%1KcW3%q+GD|W)55v00i@n5yctt3Wp%?=&@U#m_?BrR>g@_I zZt$upAHQ7BfvK>XUe$DZ8IPTw9U#bYV+smabKRg0zB~Pc`x7#IMOnUvXKSXAfvJiv zBmkXA<%@JG=nsW63qEIFfRr%Jk5RKAu`&SjY5<;8+KOW=I;=im+FT&z5?*)`PR;>8 z^Wu%~LItlcyirLlc*m=i+KKk2a(*76Ew1wwWSMLSekfRroX7v-Sk){ydZ&u?<)j2x zQZ0nixjt=PHSUV<3c=v>vC}3AWnzj@j!(RS`Y}lZOXhl4y8e1O1G^?=oE;U%4-=C# zjc7%nD~I&xlaDVr8#!%Na?eCR>IW~QD!<5b)`_V~u|3$L;e^BH}*!2eOR(L`+xb&mtwYnL$HzMs@ph#vvKAmxOWZ<1hZhZZtVd+66 zXyoppEL$>dVcQPK-IYDoLl*Sg3;$l$ZArnq)ARWvP!0s;P-wf zmT_UI#VkfR~P1;?N)o$_G#^E*5YRi<#TNtXNCK;sLm71`lm0L27jAa0s9&{XV_2pFR5Dn^;jQ2^1!LR^k zi=SyRLkojhwUg5$f>j0#0T?MbheBwS46Ng`Q$D;0rsjK1bW9V=W*%uAthDVFt3yuP zn!+{mEsPW?t$~pnq+`Com)qDLAgFnJ6)cb)Ng&ygQluPPftdBs+pC~JfV~7Ws{NzA zv}%>2K#ui=o5iTChFfYK_5vDZ_pv~0lkj~#9XE$B&}Bc9rV?SRvwFVT$Qg_wr*Z|n z5<&WQzOB+%L?`b=jkLXr4ri`L4N0x2@;*MkS+8W)d?QgYkkSMu7rv$TY&DNX0a3+gN`hJhZSJxjqNl!xFG~WPZf2@N?pNYRaTY9HGjRdF2{7lq1$T{=q z7%!Q8`E5{v_`!QIoQ6Lrl6rAv@HYiICwH!szXb1Xm5jOMt__Q#-1il=Wb0+?Kgf6V$k8C?7eeMfJfHfKvlp7{)iU3JyzF6)ubkRb@!U|)l-M@^wBba|zOG%bJQSrbO7VbSh znAdYzF`&5ixi&-#?UQ}K3Yaz4bqVFA!w9x#&Z6AB_E(V46_Vp8ion3En=Lr3EW-ol ztc~jWzT3y9@N0IRzZqc2zNkRmTygvGsOYH-*z60qw`l@uqbYms&B&~^} zntjl*Re8&~Jtt6M*`Vo)(<^lI0D*<6m-UyC%LJ+Z$fOhfR_F%IF5W&#{U9$|(LH z8c``dJoPChfHV(ZD~c_EZ)a`<%%?Wkd(J)DUqR=bc}|TM+fDZ-vc8=Sw5Dg3+;HEs zP2`Q0@oDSMkV}M#p&yE@0`;0(uEs=9tBeQBRU}|Uz23@__GHpCoH&z;c0&IF&osHlnI)NDrVKM*PB*Uw|$ z(3OJg?tE4&6M5apyy?Ncih)nSg8c+p?)S8*60xg!#*YIH4-j)4UP3N2c@=YTTpALu`xav>)E!#PLVCDQ$ zjk&^(5}qnc=hYsPm1{3p*hHuz@r%#(6#C$GtND(t1u(fkT=z*jm$U84o%>+e>PK!$ zcW^?F$cjNpx!pwYY=~OB35uzWIl1)`GTxYc914nzoO^=M7cFW2+3BHmly%EluhuXv zTGb*B+jEHST$@(r0r{Du6xaBkNW&m;Ai)FU^!X>{|my<`L#8WyQ(Lt&*1wCMqs#-4~^(YXX;UD!D3< zheow4{u2JyMT-@J+_H-r`|)I;eYS{$UIaPjdBlK8K)s}1KAp+dVJCHMOub%c5vyYK zsqG0a?|SGaHdGu|O2(1Lkut5tC)J@r65}0MHq%Ta#JVkd=qsZy*synHS>hhuai;Dd z`;4=rh^%|a0eIA~hs#17&v()DKsfY2M7QsfaGMcq%I66%Z+)FH3<^(qFLdCOiGYBr zJx~F1z#%=F&0*&gisF@j^?_z&_+&aD#E;-o-(ocSm}_%ozl}vc2rf3Eg=M_ z>4txgJOq6#nSHuPiM4qZTM-^&+@~CA)YWqgV-hgax)n-*%+$v+4NxgE(6X)1d3|b^ z=Uc+et+}qGZenvI;F|?fRgSV9q5=w+H8E5UD4S}bP=3G`WF+dnL!EgiP)XlDe|q zSTTypOErPee<7ciaxmT7NVWuYT%AOJtzJQL?Ar-Y#Vgf}L*m$3jkLyf7IE|8aqp?WuF9&a{;j^5%}@be8k zMt>6WY=-1@;b$|Z4)=MJ{n6@iDB@Z5c4RC-Ae5FQoy5YZrH$;nGdvYT8_Bu(%J8kg zmC5y|5cP4hIvTKiix9oXyQNTrnYIr)A9xSo6$pn&8|qzg2<+VqvcAT5xO$yr*q6}6 z!I99@hgIhfiroXNtP>4!Qw31UgI^K)hGDdQ0Pw-L0ljacz1-@Cv$32;Efp zJUWuckM-M1?QR->T69l4@Gn0cW*WCeM^Qdq>dLPtVx>hbJKpc!IiPUrPmY~MgF(k% zPNsBD&M>k{9G9>tGZ^s)g)(wdjLPSu9s+OoSl^AFNA)b=ye^$HZjYPyH67waFSw@( z$~hL?vsku`lhBYSRV>*6J=XOResXxC=YGVEE3)#uSw%>*2@3KTxKfessaH#3{{0du ziE7YpXsDaIgMYOB@cT(Lh8y|%lN>J7vEgx-)|H`_J8+}?O)I{T!&?1KvJ9OWF!s%7P-rXwI?jCzG{bC`( zwMQcPLWx&M--1(ZakwF%kK|DQ2w~D@@iVky!)cm95W$UARxmngY9^W~)Cqew5+Z1K zaGY?TTiDF+2%cqDN*rqU9{sHVyIWI{RmLQQ7DOSYg|*>1$3Qw7C^?oYEZn!bj{3KE zr}??GE}bqoPJn$*@H$6BeZe1AKN>U&ak7Szh0{QC$|H+s6yos7u@tFY>=edf8ZJT8 zU!D$`Q;AI@r6C=>@OK#ExAVPOJrcUhh*;4ylq7ewgVeXlb)D``CnR%7xOyXeJSHg zEb7y;w7)9jWpmCP5F`pQk=QwU!CR6=x*07oj9_rh#_FglxwFtJz2o$@^*&PR#6FaY z*_@yjirti~le}bh9iqHRLoA0c$h%oM;bcm`8}d}7wFeP>*89*&GvxI+r}aV=fc->x zW%YCD6T_CXFEWMI(68=Ac*ue(C4PLsFLENbtMUMr|Iv~PH#a%HNc#Y(Y#H`J(~lB3 z&}^BK&Opyt-of;h8?MCR717_e2bx>iSm`tApQitp#v;dgBAJ##p12ubpTS=HSfn)_ zJkqCEWYV#LzYm^`)mBjo=5@;K8No>x!3ll_GRp6m)pp9s)bv&^m#Edd(>=Q?6(_!= z`~Nyld&~OdI|MyPd+WP%Ms(v0FnLh2Rj;TOe7SuI^*0a4G zC8KGb>vWHA8T+fLT;dIprjWXSotu>1<3&49drKCTWYw(1K`79UBgridTY~+_dz)yT zQ}{6bg^?+Vh@1Xby#wavm{CE##{j!85~EmEy02wr*BWL!MqL3&qUEx2^##W5g;k8G zG$Fah%7OoMiGh%*r$vzforO|h{A0g(P;Qk0sh8FW@zcbnjV`J}eiAae$7IYCPYcU0 zi>FCYJL#i0`+5%B70eIvGpebFY0hi$uF3O@?)iG(E)CKqAoOWXL@XV?l}k%UbY*DK zEA@$;?s9wc&9+{YQHU2sBV zAC$zNGJACnkfdd=?;!)E;)Hsq>lUEQy!Kkyhtl*%!#TAg8+PeAIjP5^;{N}Y$3tN@OFT(k=foI|Lzx% zTdE4dru4Qmw5bxap9`g`apu}$Djc!I41UrN8l3^ERItbSQVbMmz7?w@MLBD;dCy}K zhe~BSN_M2zWFNHWScKBkr-e>saFG08%8JgKi8G8S_YNDpU}Olc*sSk`7H+`)j}Ij8 z#hccN7B9jBB+Jy_mn=@yXri#t`C;tD?qVlo)cFFXXl{)<3rOorP1j;!0qo8!QIuc&Q5|dH@;ne~h zylqbd9~%CF@#b##M1a9lwHT4M9LElwZPK!aBU3 z+1y#4`Ys{4;Sa7q5_0d}rcuAEKqh;BT#gOh>{(({9a{3^0R3hFIV1mc&Qzb*lXNcG zUdQ*W+#pw_aB-N6`=g-r#loNb8=IBWA+!6f%cx0*txK!As0jI6Gr+lu4#S9o^zbD) z8NXYH_lV3s`3X#4hg<2Gc7o6(hVa~6>0F95_*j)6&Eu4-Ce|Tj`Jb*86@c~B_x;*p z32W{vZkCfbr*M+zq2*K{>kaA{9M&mneX458y-FT=u(^OjV zI-(>ZlF+4u9nf)Q4>Yt-pLwM2_Z4WSA6Ea#tot&jgEnYt)`Ca+A`^dL0UqkTq$!;< z*Jsy3>)rkgb)n;$MWh$1&YnF8zRRll*BY;rP!XrfYyGQa!@p3^Rw;!F0LGkhF9B|N zF2PPeO%E~@l4G7OB0*1d?GP3lm zYX4=7bUQQkqr!5-W!2FUp}$of+K!Z*-5Zj0Y<2clOP7ei(xt~Q)Cpi6lVE#&^*0KX zB{A3B6{crRiWEWo3yH5j9vDNKQ-SsOuh8F;f!NM;o>g-wobYZcSv}?C8o+D z%;D>ym-7qN5PyCw@-4f=FsEd1Yis_ezmMV>2cRS7d60;lHGH?KS-s@wDq`jdnh-C(rq)k8uCJLAya;w z4#U!@ts`z?dUuTh6;tomHXR(!Dr=Pyblm1-`+rbq|4(Y5Gb_79G3T^uJsb@kp)i1- zShN1dSG-tI8I^2os`Ic!PD{pUzgxWB0$4TR)o5Ld+$})ZitM|(=x^5}!+1Bn#JCtz z4lgru1LT)Zk_SFOG~OQ~g-C^g2Vl-UGWh;bXWMu1H^?Pb;*u%o6#_qA7TXqy-lYrX zxbsbZR_9;2>1-a(w4(E{h8Y^#>`n{ww}K_7kzOtK!jVGU_cn8o))8RAbv1{VID2;v zGY;GFvu0KsxXDtDt`L&V*&J0Hd9;}dmdtu4RM|dqv+tJtpW1lD*;xyA7xU>ik++3p z3UCMCIg_b^jLK6*y>5xc3Gd8mu~(dHDk(K!eTC{e?@)|cVR7?{V%=4oiwombvPP^0ijyH8SE)p9}rm`qFH;- z&ezw9=TOx?pu!7OY4Wse4TyE?Ba)uAqq`aeuP^8$X<3H=77LyNjuha!rvOd|WiL3K zX<64#3Q}NbD22&Jf!dmp;+%dvPA4qEF=J?XF5i)?y8Gc&Wm{N^+^x*FB^Q(iDhEhC zsHc^tK{3PG;-;bCiX%Bq$wfopg|mcAx}7}wC{mF>)K+$DDyFN5>M&vNqlLc*NaYw- z&4doZ9d1@sfQM{+NJ=(n2U7TxbzZlN_>iNO46We^G{h!rzzugo%&^iRbL2#kBC6hK z!owv|deOe=ITzI>F2$@)JVhOg%-W1wV2B?2y{o4VvHJqOFZ}se3=NPVm`z-jF%-(u zN}mLFNmc>m1JHG7CpI>bM}g=QV<;By(mfD*2%M3l%aR;BoF?fr&i)cQUNY%O!CT!w zC^<{mp=E1xizVV%`*<32jb2%**!hxW-v$)ju)aWT0(4#~zc$Uvjr)mruciLWjF*Xf2Z6m`KtfL* zdZ*YUo*dsWnqmHuvucDeK=P^a0NwVT(=QXgsf)Bo7G5up(rv18`46OMj^c_OgpS82 z4`LfyM1#1j6vXmV} z$r#wM&%G80#omQ_UrYM{3F4O~=J6kth#a)A-_@N}H>Zs5e^8=R-5M<2t$yYFAe#%- zb2#Q14}fzVJ;2((u&xwMj~eRDN>8*| zIy8XBF3Wja*0zTNgho`!Vp9w4sxpqu8TsavBx^BX7=Q=b##W5j|sYOeIdpq2)Pgqx1l3I8Kj#;@`j( z$eB=OfsK!%N{Rmm1vo;XHx=*ZVnf7~DOO8l=4B%5*;xli zQ%9;R=bL7dxVKG<#>OqZqJ_1HR;+J;o8nhLVNEwnmis6dGwqjQ1}vES_X9^-z1G)- zw}4g1lSH`qQphsO8Pa}L8B|?RSaI7EEfM|)WvE0!oY1`=y4GT_`rz7zzULwWCmhjp z2aIuDGEUpte9eoInbrG)0=*(UCtZ~>db^d__bxro>#srk>UqEnc2nz-e#A2=T2Ac) zjxMTN?|XTsBZ_ma+uRjm-d$jsIaf`-C+opL#a+6GpcOZu z*5NvDcL9+mGiML8D+|{3G}Q-X>wQ98RUtRS&_AKuFX&_97 zRaM4l0yj}4cuja_hJn)_eaT_{2L(L+&DbCTVLv2RhRk#4IO-<6dUM9g1S$bpog}Pt z>ZkBxXnH=gc08w&N)i!MjHm^T8X86O$yOAEZtg^R;L897!8*Frd(u(*OOLcUyHroN z{n2glL?mrr1JQEJfk>ZvDAq5dv9|^pDt}N2=M0yaw1j55npl{g1r9#k7}w}?*xb}= ziTH;ijK0eWLT}v)fnn+N^`gVlgb7b}dafF6Z41YybRx15woataoa_PynW?u*xc)(p zbIGplm7+5+ZxA2BG2?vAVJlog<_)LjZ!lMn123(?3w93y+R^6|T1=S|WqfcrsD{Gd z*;bhu4hB2bD2usRm~BCFf9VFgw9mCmv*U%{y$bQT?GnQw9Q7ZdrnU%taBTza$iHhe zLu_<3W`=jC%+W70P++pg5C1dFD0?ZYf)?Yw>rMqi>oZk$)JAVoEAbFIC72cM3{$`d zD|v||n47funF`Ks+LEWX2kEk5?RI2|bjoOa&S2@;)WG30-1M2i2WNUy8S@izMZusM zmhvBa4$4y;tQRcIPsmsuLI!_--JFv6G)Tybz~x23Y8N4CH{h1#@3RCkdO|qgF{SHr zv?KlL>^YJ=+rB#u@qLOypdD4^&)BblfF{`f_0gs46%=mEDp5hCvDWTdSSu#zo}UYU zFckb{q^BTFIES1MmUyHyesqX}U2S< z`pgj7gumQ#OHZH>jYU%cq)_+4HLv7cTF{3-(G0)frjH4cFoI>Lr+H}O5U_4zJlq+9 z$%6XK<|jMWP2%rxlBmC40-;LJW|_T_AfzE)?2B%Il_di~k(e~n_rmwzJKFzO55Pa4 z`!mz%H1W>dH>$2nxO8386insP$Ns)0Lsua?Q${AE25oyG!Nx~cK z4YKP^DKcTEf)#IJdoj_+{J>vgv%zM4j+?fc=g_j^m*x-V0PUmp&L0qGzubK}zV!yL z5`o!r&gh1^CaKUx2C_$2Ys|LIv6JuZcl5+ZVSFb-76!O=ZPfZMryJ~xPk5*=GR&uNzMDD*# zZSo4>QwbLQm?K>YzFhhbXaB$3CKS5z(s>=kNbE7PK^aQay_yXzhIwo&IEG6&GSfna z1((nvkyxsJP7wObR~>up|FQsU^n#8`HfEQ>b z9f_16LdR_+IYUHWC+a^iV;SlJjTUrsicGFt5puZ@TQ74OQL ziN7VK{O!X;q@(Qi=#qK$SD(i8h_dE~vKf1OP=TVZToUsA0Nq4ytRbuuzV$5Uf0{&t5|mTM&<;72mtSD%H{nk zd>0Bd0ag~aKKm;Ip0#ie1`K%yU&Jor{;RFcDAF<>^wEIv*pN={{_gc^SW6Z7EaXT} zfANBxOh7ficF(YbOY?E*HjR?U80#}$DvNdpxm>Ops*co+xy8Q*`-!mLo}>v5hx`={ z0v(q-m2{%sCGu&jW5EqkZF|=a1ATMLtdIhuWviH)V9#f0N1djzlsWB9&vl#dSntT;*~?KmddI^^dQ2$6?K3u|=6}_e<_UFC z@Y&VC4Bean0zCs(u9P@j|@bdVgGxliRIK? zsXzDZ!2vR#I>s9nDo^p4hEuLIE8{QR?L2lXVAX;lX^7AT`5|dA21DI)JyD6V-3(wgM zIi0?|m_}w#zGFj;lei3k%Zt8z<7na7a6Lh86Ua>#CV8Y6+v&1*gL@wdB(Yy)&I;n( zSe4NHmzE*ju=xbvXv&r;Osq`28Nn@hirS^Ob=QxKE2|;>iucZ>0gS$NGTY*6oMw2> zdup4#^ZZXve0YzS?gj*7pNI4#L7NdE{Z+1q8MRbGqM8G^E|->yU1d-A1Zk(e(2J|E zl;!67<;!Rp(dl#OOCk|_H~xs*4yf78IkG*TbJgT8hjU_!7*Q-^b{ls3{m8C?<2uY| z_0!igl+0W*OFwvimNWA?#}x-gjW{H_(bOTBbs%-P#lvK;YI9+mtYE$k5c#cKNy-=6 z3Gn6Wy(N|Z@^ZIbt-gK;gJ?I5ep{=O<*7Tl#CycZdIE{aW|YPV88T0#w=iS%V>#Vl zQx2F+f&WT`QA=l@=V^Is-?ZTJUEcIH|J;VsWI`|Mcoi&bb+9f!k9NjZ-SZncXI@mL zq_CrhHF7f|`2o^+_azi&h@o<8+Cx2Lv*kvvOE?YVc_fNSi+zD;DE-~cop$x#@TOMT z*5iBGpJf-+>EO}mPi^)i4MU}i5o`-ZAf#(}w!~X2!wU9V9{r(N%6;$ogAI$CA#9hz z$Q+V?DJ)+!`-JN>kN#cZ6^9PqtH6aq-sDaApqH!nLw6%>$b>|EJEA)6!kkTRiO{OsB=YdhpfR}K3sfQVVhoYVEn1#Ed9+Ua!Kz5Hy z4jqp&7%`muxdwC>>5o!JwqB*AgvEsrTN81%DoN&r~0uv1&~(G{dBKY`p5=wcWBW3pmdEtcoMB|>E4$)YxbGm0@l19QdQ9H ze~@^P>xG0=*wHJZ-kU=0Pr>~71BeG_uG+|F=2h-E`Z~RTHmT>Q{up$S;u?mL5H?K= zVJUgv|LCTPtGu12QCPBlPG)EKJ354@g=TZNr5(gyB*AXQ_(TVq=jfU!hcaNaJdL;H zFO-Lx@(z6*2+&L^EvNdFupJ>+g1h=?r#@v!heZcfMB<)TFqu(qL=oQgG(V0=-RQw3 z?C9H@nxKLovX4Uc9;~fjD&M(N2K=*ofnqZf5$X#@PH6;;gL6m-pT2}2dvlwL_9U3b z*}*a0sB<9WnU+Ra`ySIZ_|B-Q9R`EazX>$eRGU6_f`ZVkoJKD`{hW@L(OKI9nt{s) zAEZ!$ioS;^=s)M#C`%Cq z6+$KIL%q52BZ&k72m?B8Yb0vVRn4p98(GW{{EF7M7eA0GJztdHF*XAB+`YY4th}Pk zJ_P$(e2s6v)Q?#}3W2yU&-aPt@Im)Y%R|vvwIoBaapz(HVFIsm zOA#;}NQd)XZu4?41y#?-rC8g~@+X!eGOOs@4FWKV$W%8Kxz6Af_*%CJ^VwEbCmZ{% z&?75{FnH_-I#Se?uZJB&_EWn_CILU4bO6q!;$yx5+e3I-;Bl8?_pJ+Ge^VYk&JjIs za^E>ITEkuuv*MF?dP4~(fM_+m(`xSb42c{LnOyB2M@o4tMX?an1vmxK^g{*`xllmf zRt0|JCI7E|YD$6G&w&I0;xYA>hnytz;S*m;W{q(#+C$#{&g0-BOSWXwb$wGa7GKMee|9IMy(YxLoF`Rwv5bQ znqPUUg|_ijA$sIT<#<_3LH`<&iJXR)drN!N)EglH&5{ea*8;^o&@a#P-1qx_<2&b!^W%(jew^{;Z`R&x?zPt5Yt4CG^O`MYn5T2U z4i>R_L=@e5!96N!1G8AkKII=2!S*d?9zwqVM!A3qYeZwu) zdaxMRI&{G2FiTa^;0ua%miVk}M>7Nu`#m=mMUr1dTv^uD$mu$Ed0INY70OjTYd9Hq zOq3XJ{mAgOq|0d_*T1-S1-r24QNq7CNwEaL#yQS^vF-4&h!5phU%N1`(wFh6H`1+M z%zEd)ILTR8t5?a*8`Ol(tsDi*xlKDh|6F~88xIWqh$THj&oLY^mKhVI3xarv2A*%*fJD(%XnX zfOC&;`zpVlFjXq(*ftZsb$d~CCXoDvxx9WM;>&wE!@$fz7xD-HyUG6^m;XO3hAIpd z^LM?Hsf8fLIRruSXR+oIraU>LorJ@)~5vvBAwi%xvdU0N3rB+OFk68~X03 z`0U-qBH|Cgf9m>c5)1G8wbnRmgkEVp`$shjr4^yWj~2v6K9v@kIFlS?dR@;RCFsiN zM`+nnMicD^X?}LLK2O#1h2yC^>6MOEu|2V2UHS*E)twbg}9r)l4+WVl=tI zQ>=|HKZJ&D64HFMN)pgcZ1LPJijn;gO?40qjhC)FEMd`sQ$FqET{^QFq@-VYYH#kr|i*vfS zJVuwEeIFVGZ1U=NV8btBi%d|}zX!|2waWqEBls42%TNN4$);#&T~gxMq&l}D6v=wO z(_r&-N48=@A^BN}`l;_$H1yJeRvhT)Ae~f zZVFpEn}RIc{H~UrCRtiJDXEg3I`hWcl-3NY|?Hj6XFE0%WZJLf3Fo6?!>D+8_+ z^-=->&U8}AWC7-6Fi1p`Hhv5WK)}MfmWvavEjgU}D-AwOiyPi?>%C3v%g|sp#u`X$ zld6-|WW4v2W=)YR(Er%*YOq6v9q<)S}jqnp^-ja(_i0;aCz z$jgVrA$9JI^bEqZe%{?yL8hmnle)UBO_?nsPF`VfE~g^#)B$nfg~aw+yFE%9`Pms} zqeJG9qTe&?rSr#W<#!3ijG28#H?$hbwDg=Y8rCyNZIra`qr^mt?d%{vqvL(SXo9;& zE%8^$L~O!IFhhB^`XI>wqA;hHaw0#`&pqZ=1LAf_;|cJBE6r`DFqK0UIweD5()~x`X(ckVFv%IMc@yIv7pOk_|5grG1$sMoCa)FM~QlnxC%l4?tH2D~Yh^ z6CJfN$i*1im1`NR;OFP1|#x}A^?qk{>>+!H8 z27U9CqnNlQLX!-A-KA?pMg95Rr3gk;+7)NRh$L1%Ek#GrprpAXc>+Z%KDCoO*%X7= zCqQdVxYPAGlQ&{3lji;+)0q^GC>L>BB`>{upD8m=B1;gqt)4}}#M4Z~AHZ_^82tyZ zqT1r8?958x+;pf(6FZ;G?Ux#>mRZ=a#A_=?IQzu+?JbgKTE&rT2}{Y+yd69mk$xl_N)W z_Qfj}w*6XZZDRCB{Q8{qJj z{jirN_D0apTsl(3JYk+t$g0g^L8>w0GKG6RP{_@%Re^Pbo|`oi`;cEFAi}Xt#@?lz z#rtyTQH_*W1!iR%txOVt=05m`LpJ5pNKj{mb+v+ z31%0|8ZEst-{_=S8qHlqktO7+fy2B=yCRGRQaH15A+xv2-iql@43be5PC9C3=qWV_ zOr1nookZ2D$AL%+#oZ#rf%m!yMea$%cK>r9GZIuccK(CT7>y*ICN}qYTpnIbW1-5{ z2rO~`_yg1<6E#F^fRWSEn%+q?=XSRQZ~26zK62g^pmbJeJ_AAl zz-exE>xWKb6m@ZH5t>#CXcw@lIk=C0YBODgzVl8P`3}u}+N$P2%1EI}*F&p@o@((t z(l;xgb}F4wcT@p-n+x|KLGmj$0C5|Y6^<}UbCy+$1Ra7@b($0e6N*-oTnd4oIxU$F zIAV$2Vattq<)q$N3_ebxbE*kqg3??yK$~Neik4OFesP~p%Uhsmqtk=e00aVzqlB@( ztiFdaQnh9nV_l`{4Rh1turxWznjO-fF(Xq~C}G(8Lg>>GzgB5+#+>E##W~u5R9b5> z7UtX_kzBk+?8k)t^Y-dYm-0-IbS_s|N3s+tg%UC9FjkYyXawH=?(p{m85p55y)Z=YD8k^aw*c)5bQWHGOTEVr*IhS{crw3=k4p)u+c zjeuw-ev1;^YooH1>mm}yZUrvBnQhisxcJd0dBa`?HAXMQptSPzQ$|2si8wT0p2AFc zM92}s_06rHTR)yVI#KCHIyPEE2OZ>O6V2`+%;wGAXCzI4VnZ-2naFw=LsW@cfb^^m zR1{76(R{T|xFo!L4>zgJ$Gf~ zRZ5~d_ypZ;Ngg+;`*f~&QHFG6k^&8T$j_3>D4g`tk95J-WcHA_m%_(-6p_v)(?O)* znB0J+{ibo3scIu!HkdOTfiIs**+wpLUy~W;zHQ+6npG3h|(o6I9pw&-Vz*YD5Gl> zQJ$dbFh-z|;IV&#U%H-4~$n&iau&@$a;oGfvNoNcC` zQCY^x<{Z1I<9pbqiB0h$(uSK9KkJm$m%0njh(mWY(x(#5s$0;T^NoDgU*t1da25EU zjbS$qJgs#ckO0vX10gzAQ|x+#D9j?|u4?!X;IP=DRa#eBy=(*APm|0hKnjDZE^7K?qDyKRRiF1-xefx;q)-EvMC7UHUgDmHQlzG6lZ6%5EO}nkQZb0 za_SX?&5jLytWL)LP=A|d6k_<|GG4R*3TEl(Oz`Fpu?Va>+``s(@_7g?CmO z_$FgbOVz+AW}PA@HNxrG6e_B8Z&*t^vh^5w!!4g7jNQ73pfuJf0BbZDyJ2eKV5tau zJXonbK`;&g_g_D3Ee1Tmza%_yC|Cg^SfM=c@U&tuwiW|)+G^zptBj`{mio5@9*z?0 zAHW?R4}QL3p*G&p9dDZUF=ujafg?u+@O#cmy9G9Bv3jCU&~B|Ka1Ar8K5g*g55QEn ziSxrXPWp?i^}@l+9;u9Az`=J7oJ=!ihKILGR=~S$>j{_%E>#|N&bO$sJbwcVy9`dY z<|d`WV^fal045@*mlV?QOD1Ngl*t_dY0e*$q`$V#fS{&=``Krc|9urQ460Xl*fv-j zyiCXC9E!joQ|at8aGEWzUQGZLKd^|NOI7*p#An5dOo4)tV< z*Q+N0f!+()W+!S#8X7Xc082a*KE%Nd)=C5vC0Gi{zm!&?v^qUV3GBf`buLYu_?<)o zz!WT|?4g)OC|)JrRiCN4m-(2?lnv0NH&CXNu0a=k9-1ypu6lnfyU`j)$@6rT5@ann zWP2%`O-kvtybR&W&S5dzdzASoqIXU#dB{m0JTlxXyJjZFj}&EEObLJtqwc?xY1ulg z+DG!=P4r#|^o&F&`#(SuEkDX3NfQzF&?8_*V3oo34AoUAOqH<{cowf$m+2YPwHupf zxWH%`V!zZ_Vh#NRsP)n@XPt*Bk$B6fPD+pO{Nh#0Q~Qush@mh#$t^$+6Q?7c8GAXtU&rf|tb=;FA|$u(`kpCU(dr z_N~c!=&E&^n6fDF1~cMP7cLjQ`y4u)yf+j`bJ)1+fQPGxxmX!C^?XrvTopD`Zuu$; zYF)#YvcMQ_?RDSJ8#w@oXR1VCyuT;i1s z?-479P%+DNysIFv7#n~Urq4)IE(WEbI;*TBO z47^1YU#8Y&TkmySAvz2C>d#Qn@WtOjFK(9sqyXk5yHj>HzrLTZSV--7*pTjSCBxrOc<`d+T z_qo0aV{!hzy~ z*e_s~Kb^k1h#Rti|5aKgk!I`jcHis|0Hg&k-@wkpQ}{O7Y{bTpa$a4P!<#3ZO`b9> zaQ^I17<7Xz0GbA+67CDys@wwO$VaU;Huva){0m$_w#2=+s+A7vfP5W05pKedE?LsRZ0Z*pZPhVwfbQ3a#PVb(b_ zY6q92=1w_=dr?i{n0zIp;4cyiU4z?}h7= zEu#1mnEs<@DId(cA%?V6x>ph`xp|c%hWPJ{4#(EXi&*b8SGxc5c;NGVjq)kOL)EXh z!Rt$^$&2J!;Dxp?9!!3hvyw@CP}Q~0>O@G6itl5c)}Pj#4<&3I0ep(4)$~MEz;5gS z!8=5%{(Ac%$Q#FmX1N5xNfeV1n(af0&#fY|6}X%0ietoPm@W7GtdrKxZvw-Ev8`q| z)aCVG*q^PZm2iiWfFn>*3jEUm&vch4G92b0eii^;=p)y=N&?vrUdZHP%@D*9c3Rkcd>(j18uyNaFzG06Ed@OA4CO zvARPgAkt0D1ndz5=Z~(VXBfxwGC27LW&qYI`Bzlc_0@PO6Mdm^XUdg=K2Wh)F)r_n zboZX)2sQ~}41$PeE!pr_{~S2v5RF^F)%bCk7F;GCHha*a`t`xHgft zn4vtSEOwdFkv36oieCP~GGP81W*BZS$ufW^09<==i??e@%Z(;cQy)1@cypFIPJ%CQ z;OLD~YYNG(CL`kgmeM^ypk>t=?^&(&q)8N)T~^9BDw0^sgLDw98z7$ zT`*mHo~00NU4pKNJ;37<%}kQ}#+8-`+*Rhph*)a%D|NNKyv&*a0GyzG!+887s^|)7 zI+=_n=f!UML_4$pbQ^BNB)d_3GQh>F%kD9oaFkv(l>R_&Je!BSm*>dWgTPdEzmFJ9ZM0hD9*0aEp}(&fT0~>zkCoNj_FZ`6w56R zv%r&G2)-ZXwXhu(f@^XYQyq81(!TDeP)UlFWbhXSm7%vVUEOj|jxDz^u+;RYjP)PS zu8a9v3)w7}uvx_6yoBy7$Fp4|9D)_jo1F41K%R}r5hi)wM*6&61>EQ-Ex*_wFLFU3 z*|gz~`_Fw*`VaZO2|e1AU>xugp+p2hRnz8Vyv3(!?0u+|62Tc6aOw)+?W))|t~8R% z6s%MK^$*~A99WB1&ZfbBoMwxqIKtwl8-#$Xn0py4@;em(=O=Mawm8M%{0-U zO<(S!%aWJYZt6*7jPXKA(pm;fp8+(NSdT4I{?LJ$3U~% zb2Adte9Xp2w{5mx$*MAr^nJ-ug4t=ec}HKlJJec8;VxUe{I95oKM4j;9CMK2mlyfR zUW@n$q%^V|;E=R;v4Ea$I)ch_Q@kH7$bL_J1h2Pxm~mg_shz8#DSp@CaNLl?mF+u0 zc+tqDNo==;n!thlb8Vs2-)ctmE&X;nH27vJe$=z(Sv<0>bnn|}w|R-+-^E}mmEU}? zz4`R$dq=Y767{)xghg;C7k+I~pmwX2civ9Vi6m4LW8vTN&kD<0rC2iNSf8QMGk1-GhY&AccO`vZ7_`r9IGRgcN+4t{Dv|u_i8?Lt}-zQ|PV>&txBjkzTz=KTlemKA# zSNE5G@OtDWDS`N2U*QTiwtkkhp|4%>CPIw0cS z!HT*`@3zgc@@%|4`Y)q;6UQMo6Brxy^|QL*dc}sVhse&PW$=`SA%dFXjq1W>p>%qo zavAMsO0!#0-JCM4{#`T0y9v{n&o3=8p}vk(+p204r;|wzzttV&Rtu9hR#@4odPE^9IAS9>(x`cWd)7^jbLv1MplPxY50 zzO1q&&ZheuK^;hWmF>nJqv5gs$hL#$a*>Nf%~0(jNB#t~!I^z=ODnL8>o5%a>I-tj zBe-HLm#PaDHp_m8YEqo!a#fH!jbZGd58k3|(kIY?7wLK##OlNb_JLb~Xp~q^&Mk}x zW1}5{n`*0za6BDR(U@{v?IhEn=HO)ygRZhqC>y88>hZPM=AI>JldI?+zvha+`1`K* zL20bLm=sQfDI9}GH;XvjjBrc0&e%SV21|mN?(`v@IITc>#ZHrY1nhA4=Ijr)#x$Qw z+r5YhAo0hAlt|IT`e~3&)fRYxS~BY8E_dlS&Bcb4I*ND8z^WQU=IR3kPh-74)K}gUo*G!REedn7G z{)2sQl%;Pvin!#D76ICXwp?p4!+UP&1`Y@j*l(HSH3^T#Nv5^IesT1#91JbokLy$t z=s}TEZD8$f8xnMs9Hw6m>Smymw`-g!|G?l+@F8y*Of{4)GN3R2+_-~KNNf$p)7zDg zFWP@}AZ{$K>+17EQ*NX$4cE~w^;o7FT`%i&AvN3Bkqq0W|qbtTPZ()*yEJC!fE?cj}pk3%kno{A2it$y6 zOKM}@KIqecdCQWhN~Y#l!I5bf)v0l+PREy{J%ezLc-t)o(ri0=-HLqgw$gQ2O1nKI z0KpPC%$@#}>H6SQ$C{!^>RpG3@+-XNcWr<)s(Li2M3PEgdS!GFgWmn{yHg~cza?&p z`jCx1>t%uDo3{H(a}&U-=%ZUkFuI7dCR~0n@7qvamz1+W=Kv))^5=+jI!2prQu6oj ztq+p{zu58}Hc)C2+7`Xj~6cDZ|pq9>77} zo77<=6m>_E`j)zKl9G9^&0Wu55cw{zmS@$w`|LK+KB?16X=wnUkKg&~&g+=(`b+46 zYhE*BsNH1gN&1n5ixVIyl#ZWi;JF~OqS|9hC#i6P1R8ARxqbdRl!)5ZFHF{vNLG z9xSf(c;815K{nt!SJnTGsPXst%1Jd`QU1L2wo{rWSF$r}V?v}deM09J4-${?IFprs z9pDPAEO>B7fUl5l({bO@A81u#mGth}JciGOj722OML{~wNWL6HQj|)m6aH503LRjJ z|Mo}8?JETho|MP$mo&gdrjw$N*~J(}Fvjsve(P0c89%e+2O`A`Z_0l$f0myQowJN_ z>eE35Pai-X2s_6cRjB12g46Y$r-&ESR*8=okuN?sgNzzjfA#*JdZf5}_XZdw1VO{tMlYwc37MI>iQ6SEZ6+zhM zrx$BQL3lUoz#^U2A1}ioIKMjej8saw>~p?@hG%hO{(Rmam z=SxCYQ6bCERS*%EUN)P?ISz*IcJ%TV{DO4+-1$5-d|Lr8Xo%A)-$3NcU2G9mS>X~J zN><{MWq`*4rt&uMkU9g-UditJ?&Sd(4BUZXHdvI|cg-$)_2{qHpw_C*Yjc)mRKhwR za%UeNf;DFw;^m`NZSf78LRE0Nu!>W+6LsWICDE*XyDZM0cxVNN;mz9;q z$;f9F1Egg4)nv8&{nv1#vM*pFxZsg4TcUc9;01g&T-DH2=IA6& zH60P-m@>@?`h^rE&luu2h7+BC+NEG|exl&=^Vn*bOG^f`bGk-G_I05|+^OAeW!jJ$ zoSGmZn<66pg$E~@@SJ7tG}~fP)BJOsz(u-Au8}a0)OJL+#dhnPRj#`?qKx6&dnhjt zAJaNW<|ZRAS6j>d#Z{{dDc=Ep;*T_P|CmJw0$cZ>yII5sGN;;+)Mt^SDyfi-;_Rm9 zBtaKwE+0d21YH%6p^RPTCRwtOR@ z&}^!Qs-C#ON;8M^@3X3F5GE(Q_O@DhUzC(K=R<=Pv4oQM*2vd zt;|mbFuTvyqtCly0%S!gj0P?Obl}sDNQsuDSy2(5Lj;JBaU+kCL|6Dogwrsi=dQtd)Ph?e{i3K#r9p?I6O_0vWmG@R5glRx$~_s>!N;Qq=|R? zB3oKr0Q8PgD_pcJ{l{U-{WXpSSb=?TM$qs*(I|dwe%!(S2OvU<$SFeeS-W%{&4Ox}dn_FbZiYk_=UkR19>cYtXn*{1RCy9xv>DpF zaWtTdmm#Ea*B`tt_VDS$!uLSA;px=)WT{Uh=9~#~S2bfE^=WYiC@n4NEhbn)o^lMZ zu3@aW-YvdbY;#C?C9HTEIHIIpmW=bi2D`x$cJ?T!OGlS z^^Lxli3Nnl`qNZPB6F8$9+boe`4&k6e;sL6cQqX+Rd3@jWIxfPGw3np3~l| zp~vz4Cr{fO@4&#C40(pLlQ0ey&5>?w?peXtPU1`aZhHgfLe9zAu~5xD^hp>H0%0k` z;j1=~v*;$?^kCYG>i0>U}>& z{LXhrhSXC!+g+lJs&|uDk1E_w5BAu%1R_+3U?0AokbjrwtpM!#D*C})`2iZVE2mdK z5Sj2eHp7n@FWbArO&(an(gG9m*M0J}9=H!wOdP(^rH7!WoG$y7uh2vo@|A8Jei`@R zt#u_gdw~e1yyTGIo_L&AInIFPzuG5d_{LYX$WYG5&j7}#2cymb*_+<6sFlX;r-O1K zE6F#=50=cGn&LOhYYYkwp;LJUbB-|- z@x6UC`*$~Q^Yo@{SKsaFKQ309KPjO319*SKVw8m3%MS%z+ok8)oN9O`JR;$Ep_v1i z#_7j{)_@{Kbjf^lx%5wS0wXndU~jV9DPFIBO{EG_1@x5tm3shV;nnDI@>Wm0x#bL5 zb10LQnArNS5s6}thBp&1cD$rxRp#M|yMKLP{7kUneXY5T{Wiv_EvB zA6J<(=l`E(Y2jrQAAYKx#Yn$;5NC<${>$ybc)S1T#kZF^vlreXYpj!^hfyr8J#5+y za!iF2x3-Z^gq2Z@?x-eL0ANbxD3X)F%wzYW`;k_9iGD6}DbKu1RqdWEa`CE*-=})y zorMdVu*nDzA-r9>pEaTCFjZi=4E^uciL`nTLQI$Uz42Kh36bvsI7Ja_xN+YuaGvoI z^uQ3{le?kdbq1#^wWFa)?bl32zQN2ZopZ1F7-F<22S7NQrb)fJiTs=p|mVNavN(2|UWXtWcd)=G9+Lo`O)zK=lCJa+Ih~g4Ro_@n=Lj!eeKZ;Y0=E~O%{rw@Yrb_=hHs^>6 zRWyWEr7vvcJSeJ0MLqFlP75=1b{;KIy+*Z+(wXY)c4B4$1o>{aN6NKHCpY#eH^lZ< z_knzmt*(Jd+*RKyVQ}+zdigrL^2>*33RYn>lA-Y+LpfJArfBphaf4?hv>#w!$v@7G zSjA6yhFmrtS_kLh;wNZj|2+7g>`HBjQ`x_zcd7dwB{V9Mbo<)PkA3D-b-FBkGHIou z?6mNs)lhq+Qkz}f;p19wtH&xr0|+KI$AP0K_OKs!(^n&stRe|CQ#MEJ?Hn(( z5bJ%Me%9q6Ci?bWDtzKV^WV|r0#+bc!07-{ACJt(@@H>s$Yi?4wz-E^*!UJtsyu2P zJ)f-A`Z$`8wLp{Cf}dyco3pTb0un!t!Q*P|vTZ<0f-xJx_PW@bZ*B_#3@gG$8Z?xM zu#v^IlQ_2YZV9TYpU7F`MuLV#^3O++qJ`E&2-{0{;_l_X9?ICDe9Zt~ z>zz7m5 zWhpy)%5|-%gb-HvdUlhRX|T6U9doA>{mnL16p#1nb>lC_e{8T#`BgZ0o!uuH>R5=f zOgu#rjTY{a21D)UgbC!`ka+yx=w)ERsGw0C(V>8m%LrI?#`pEA6ZTY;TMPT5o-e?5 zVDM1H`>m?jyU|%FM_F^R$cb)4bfioi?e&CeYZ?LNiM;>#q|)FGqw4N+DiQ0=O_>3L zgcYHEj?2ky^E-=N24%-w<^VIMuS9O4i59zpw0!JtDVb2F^rd?$X(kxGm8cuN=~Ft_ zFQr+Y&K11^_W;Ry&(M%GE0{NP7zFgDIW1mRv@CuxXAR$Vu02wJ-C*nVg(L)m=S)CR z%gILv(xL_wQvhTzot?~Tu52-!oG1tP;e$$=?Erw#GZAIyQ<9gwlW%=qbWdlTKIkM& znUViIZ6wlp<$^=0>0jl%j1&>dl0r1k4q~In#N6jpXKm>=h`40ikGuawkFiqFoY*L| z)VsrK@KYz$M3JPglaMfA$U&6q04;Lxr+HQF=eM=&i96F&oZ}+;vP|T_chl=8u&5^s6Fx zO~ZtOZL4pR1U<`;JAZFx^Z8n>ml=DWnzrhw!cpQ|?$4pY+{R6=GNRJ^Qz2X3MWZF} zYOl734aM*)tzD9B^1jr+it){-nkbdpNm!A0pPMj@RP8mse#wj+S?ZpIwob1YE(PE! zTbNl6ZN8L#8u*cgqXR8tU?};!%pkD^)Geq2lCG__o~{3t#J`)43}yV+(Iz}+Z39=j2j-)Bj=p+LQZngY(JBa2}of>0aoednlWQl;c|Rk5`%!0=7IRKl*c21mMMK zOa=k>h@ohwAWn&JKm$>hXW{gZuRjf53stLtG{@#|me*$t5mk=|9^dre_QLjZ>0a=| zH5Jx&%r9_#7%e=G!cE|(!_%kNK`ibouNe)8iV;#9 zw&%0zrvm#MSKidp09c%)@&(FwSv80o&Me)RU`@eF`RMX4JB^|NLw=O07rYeJa(R-3 z29R);3i}-?K1?0S2!5}GAN;Y6i-YSTM8jFFW65Kw@N?hAJ$Sur@7Q=IdVg}(# z7b(u}7LcbB1*#q1kW0Xhvi%7AR zyDmxpUtpq~&=CZ$JsBN4*%b4Z1fBh&cgxKAij`IIm_7?bN?Hh)y z(;a_$Vj1u^59ORshfif?H|G}r2Z`R`tMtRT#RG{k>^JR)FVlc>Em6e-oqhSEEcfhW zLuhCnBW%92)9xT(@MO{P>Rs>z($V@>epSFj>F3d)aRdijYL^CwZw1K#`0+h3D~#WV z#B2R~Tw&4?i`&2XF1?gn;pBM)F_k%Y*I7$D>}58Efsx@O{rxrcp%=YL)p5f*iA0&vjan+dAnxyEq024`wW>RB zRI^GPf`C0!p0X=2F*8W_`~8ocgu`U2J@%aEp}8d~UvN=VEbzf(FWvx(_JaT&p;w{1 zwEwUsQvc~RJEG1yJ?LOj%YgSqAB$y&t~M-AcIzk{NY4k=UupfRC2IRgM1=CyM60c1 zbVE8MOh;?@>J}Oq^~rj5_(S#tmyZ8v0F!RHUk_rXx{@t5y7==`+c$4=4+bZ^mEGBz z@asUkv+7AB70r&6uTf(3^;*XUWW4wCC^gF>hyCDPzgLlxi^mypI!hO*27Zr+3ROxg zJVY67ohRQb^KllYf?J5FGO69ZjM~j6ZAo!Qq3$yajL>i zHY>UtZur{fFT@<tul`4RaWW#Y@IrU0Qgx^Pjj%gf)S}gsJl);4CZYADdp^rUHS#e;+0NLB$jFI8mVBLVl*3H~*6Riv?!u$}=0mM^n3nO9d z?yaxKIsK6O!v@}k!T0=}*_isqJ5S?q@*0B@M+LROo}A-oER7kT(mK|u zaAX|C$1Jp)=cr=RDuC3m5+}JPY-Rv z)qUickvm&TB9SL62w+oio{6=FosI$LkbIe8(;_1sk~b1<4dDZ6J#Bvg zze$-z_o0|YZ8A#bgVHVfrEM1Te^?MAh9rjm+AQ3(R|8HD3Rbk+op)t2@)H>D`&vq5 z)km2e_GKYpfx{l^tz)~3yg2dXAhiuV7U|zIUFm!pS4rMcb$0P}(|vycRB<+`*eK2b z{AM7@%+EDxLQPy4a-@(ypi2~;`W~FRDGG_jCzbQ=Ioth@0V5#YX_AwhB)N z>MP0Ktlc?%!-*{avM=8^mR5V9kBAiE{Vnaeg-tLk`!qD+rPH7ysmX@meY$=7#rK`&%Gf7heR5GY+7 zEs#pB?T;<9ZHVa4NhA7>;~>?3NW&BH`i*CO#% zMbKG_wWQVZU%F{VGE7^2Z+Cwj(GP;>BBeQu)F)ucCFe@12eiEKY*-g0EQ5YiVS+zR zQzKXXCF8L~0-ox2!)z9COG?-oPU3hGK!K+Pb-C%Rr!^2sxyOh%lP|nVejQ6 zJHg&MA-$uP0g0a}O)2|no8v*IO2M=*(~5B<7^Ob-7{ZIyr}_^=8e98g=`!42b~9S$ z>CmGOJ5OW-saO1hp_kp9fHGjwoXBslTtwvswR>sJ$Ny#}fLP#HrE^>Sao=LI(^x;x zDnm!?Us1B->tR_8#7rHIq|RFfr9wh#wjrM_P0vNbe$!D7Njd}$47>HI{Ur|;xrkCD ze-LvWoPsJS8 zrzFvADP>j~6ioQd`1t>T()$lPr$g8`g#fY3e*n{Ydid2q1Z7*v$G^ie0h~`&e(&GV zrUfXtvG5yIug1d8w$>B?MjtlxT8IovF|F_a0B9-mm6V2r6D8AhvMN6HHzM3vvJ1E9 zMvh(*UG~45X5|>>|EAc!Lf1-^BDCm(QlTN+gy)Mf3>(*p&_nUU`ligg;Awm#e2M0U zf%hCU=H(x^*^RS@8*ha?-y%*o-VplzdUVK7zEJTPH!lNQIDM3Hu6ok}iNIB&8!BSP z5n;a1aF!UN{j;x=HSR3SPL<1l;&H-9&4K@BFyx7ls*svwzLb&B&1_xg8aU$PYfW(gco?83tP5BLG1z2EiE zYQ50-xZTw)vMD*k|K=-QpkT52nKt2kIHT1R$~<-I3L7i7C6xV-ClEZa*D_pf>6}`> zT|NYS;=i?$2K3w9&`4LSus?tXEB*2^*7{DQ&{AeEON@&?X=~&6Q#JkTs-Lu&pK9qD z7NR|^B-!)asabS|?dj(#jGtBi-D3FPE^2j=U39e8QG@PU!kpsdRZ(ry)xqle-- z;J?99deZlv9{cYPk@SaIRZ9{-?W!Xkl$@ndhLCS;1=m9x+BhP77bQ>a($f)*=|SC; zaQ#uS$p0AGi1nPW_ix^f*(C_t_~8c=#curEN_zVafAZ`koOh)SsR@K_gQ~0yM7AVF z`GrXrbUcqD<5@0zl3|^c(Z1uKKDF$hEC$9_m|Z2pp**!kcUNmJuHC-anEpyor%zDu zMWGUCcO;i>*|>3JFB?p} zt;{nw_|B$2<9O;fR1z^weYEPkveYzrr0CUoi|*`Zal;c4x>=B?!oQX$xJE?!f&x({yAN3_8ZzIY0JCerR9|O z0UutzROkrmrlDaT36Z?+^Fm2K3>AEI*v*W0r+gQ)gTtLk?uq&K{}7a}2S%o?%&O>8 zx(-(V7obhkEx34l@o&t!2b9h6ecTmF1dxrt?o~d;J0DdHGgv&t2OEJ@n95GBS&iov z$_%c%)GLrh_n;+|C^^IyBHSq@om+2C$cn&-O%|1q#}8+dyF&BmT? zk157&urM@&Yu1h18QNF@Fu~miSpIYUH;(U19mg9K9Jp}-$rl%QL~;alTpd_C(ReQE zA>K&0qD-(|RHq8Zwxk@kKnyxYUD-rcmH*2x`My<9n(CUarDkDlo8hZ_cJ%ETRB<|g$EQW!$%3?8ny?7Nfy3mlei8Kd}9DKnm^I<$9_$Yi;6{^ zR|B2~qsWj#gsk(zSlPX0c*_8G>O0n~jd@exdmA3+TFq;6xjt8#;cB}hSXL9 zUN}~}*Xw^nwtoN<5^|0eNNW}uH+mu!j*fTPq4O&br3r0wPDqO_dcyXb$iaj%8~uBgu$B)}yXllv)k{ zgS7XIYjSz}eG__zByLDT3IL zuJjUmcW14ouK#|X=j?sX=kS6TVVKO!J;^=ybzR@zFTnalTvoqK;PSl5qQAr@hZN7~ zQ(u|y*krh2`o;~#TM`1iHy~gK{TJ0?FL>%>Ak|{iZu_hAAD4azld*b(>@ZoS2RIa&Ts>}$P*>6 z&guPW+ZC~zv$UEHl&&d#wrEoO`33%+l>yV_Hq@$F<<-7nnA}Bm`zAtI5OSSI_UWEc zZcQyVjUNO8K~`CdIw@|pp3XBptF9jUVTWQ@K-&$sIFH9@G)*pK1n^$P2Ay8Edm@T^ zfu+9`pQu*Lcu#b*w>r_Jib}6>{Afz|r01QMw^RO*tTmjHkxxEz_*(pc)!`z zsIZpvY}cxS@K1otzEbIB1>JLz!V#<)Thh&g)m?fgf|3W}Wk#bJ)MRks&b?wRdRyEe zk(*U$JlAsYLZN}eLXNaVl%Fy333NiO;PxyP$|r^`g$tk!lMLv$@! zCOPx*I~!r1*n-BBq@ll4l0uWRN)8DdbGAMIL>iYEdD zpj1db`CPXFx+H`{A;CbZp9lU**4E>kilmzSQrpouA;WjKol<$t?lh$C%7YrEwqJ$x z!GsuR5<-*n6@AO0B%Ak@y=g@@K{BfsG{Q!MCOMhn&o;bD{KxIj#Db6sua4enUyiOI zM$mNHS?g}Riq~|YQFjuXnwww8Cj8*@1=(6m%k}9R>i{&4VK?xp2s4U7E%E3r(?-NZ z>c+Rc!wEX*ruLGb@7I-j`v(f(?~bUZALQf*j%b(U%19-ei0goO{BmaEczj#>4%75=7U6^ zNOA0F^gA`bV#?fFarum_xFJuR>nGOy_HDIAmU$voIe_NP#UYF7NzK6@$BimV-`$Pw zf1)U1&GccFiF|#rcy`+DQFmNfdV>{jFDgDo)rjUj&1xCpo7@IwwacYSsl+7Mp zIGwnas{BJTMQ+dH<~dFZL%9*5nTV2UOdOm7pH6CgYM4Qgk2jjTT9b`}ICiQt7fh;$ zARnN7uSxtqAN7%farS*f&6bg?6srlk{xtp;UYsLGN&9c?FwurAh77%)HbGW!QU`G0 zDhQhnpHSY@;;~(fS=@Dkb*zvcRbw7$8F+&gJdV1vN_EOplsNX%!0B><9L-K7vFNV? zp@0yN>iguCEI;ZZuH)2Tas@ltjCyyO(O*4!M2DsuQ7s{P+urK`+?r3Fyg#kAlK|u> zP~4{sSD0$J+PbxpZH;LNH^#H)MTFdPsiH6p8Y=QbG)*w4Rw9h4Q0OXE3A#8-;qzV_ z+oM*p8T^#;aI)g7!Ur@~U_-2OLTPh#MZ_{%q%f_9b&*KJDt*gRuX|zCQ!7imbfp6N zN~IX=tok@>mF(pt5TxLK)Fx{{`aaeYg}jAQlPHUs#wUk~iNg#yj;G^G<8q9(c*?nR z<-~Ad#1z8UMYI(sh(-`39govdc`7=jpn!be2x?`6`iZ)G7m2j18HBrX!8SKjCcAb( zaTji8Y9dBf-)2zyMGV(m*c$>+)8-(rD(uV3GllbArC>gfmGAl>*n4w>E}+L#yB+9^ zwDbqI6g|MZpUq%NQn7&5gGR60%5T_TO%D1~?1WVjS?O}tg&$<{c;s+Aea}l)X{e|D z8hhaPKL(1ak_qGd%FpfB#darRS^~69i18ZX8U`H?s>$m;idFRAIR(xBi_8&1#%iMe z^{XLbVqe_3kd{e-eeR$VW-+9_VT=Bt^wK3*<0|Vc>`TmC`z;E;yaeUguq;l!m>xXO zSNDhocD;9+uV;r+3`g>g2#4@R(e&hKwL&(*b$Et?l4k60tjel30@0=R(W^RK<29w$ zX(>40j9n&iYG5aATZQ&(PS(6vj}~hO8!jwJDqts7N<_%Ui*q@bTr#TI zsR0*5i?P4K1pO3ot-3Ik!gX@Im!klsT!v}dt6yax+vn^Q+X1Dvit0s-)b#A)!}@8| z6!dX_B8~zW1+JXXykd%|=!#2$G;h?A2B0YxN$hKq%InX;LppqqN9zp^KIqy}rJEL| zkGm1_3cty=rZov##(V|M(CQAv!X2cY<@o$MJs0iipk5DTI0_CP-S#jFPs`TP$X|o> z^;iHfU^YU{-zLX0oabAL-vS&+uuAq`jsM>Pxp+#LQ3j9u5T2(!mz!G$H)*9kn*Zp% zOD7Gf2x4MqNc-s?J~}D^oO6huP;nR5uqHRi{lA7PE~pv`mp{|$ z_M0N&!glV7>?C7A@;N7c_xboOQo7F9eqjr7q<0A!_XXB0OUS(XYb$JQer%z?yICq& z+f}Xl4~F3(jMW&KYCY_S*(Dx!P%^Bc|Ly2kSY_yJBe{zef!DA_FoHO+ zq0WDTCzm-y`y{gs3oJ2e3KT4xZ9TJQtyAV zWb%C!MDYs|bwB;2meS8@jj zT40|L?#F4@Y(iRM4w@k#9(&(pxZ^fK2h=))T&IyQ=c#CgkbYn(CIu?06iVC ztq2C67eEM1{RD*6W?nuE`w0kT1t#^7^UgxW`eNQqmCYdhL~K@V#$$ z4CgAx<784Vm|VTrd*uX)igHnT^Ft!#y=_m(xV|uQJq5NbaV%$Nq_Pxuh?m{k{BnoD zdi@G6K~(ZPNhcshD^KPICo%#`-iYdqE9u65kZXZvtTMz(3l%QQ&bS@B746B+alUwN zFa#hAn(^$Cj!V`WY92l;x1kf`Bbj%R~{kRm@@{6B4}OYpHrOJ+1vVC#(CX^ z>HP)RbZaE(v>@uh4Nk(+d?>}gm|6nCTes(A%t{fnol8t?)5iJ3Q4If%GwKoNQoC3<}4 z@Yh1cd@`wA_jqzTf0w^pO)?;qRqv6B>6Is$KFEr{qJgdfr!#OOetr}hU`qq5* zpRH0i+VD_Wp)vCfdFW+&Pm2FAnG z+a*6K+$#v^%LNjn;YpZiJ3-(w+xb?q3V0spa`IR7_Qqc5I^kZCmxyakn&z#VJmSty zl36XDd04yrduy)~jPZT~Ku6Ym3n(GN-F}c(ygalmDgHBpM6vKJ3PiC&F}eEfq>BV7 zhe62zlz}7HCcp}G6v#nV(y*IF)SE4B3p}X6Glr_Qg7?TXE7(}u*uOLl_XuTJemi8d zgF&L>?HxDpyx-#&mJov3gdll>{N%-0{hD<=cf+BthP_CUipXgv4=t_ z-(!y2*@@#|32e8yB0>(5Apjkb2Mt32iz1~2GJQdCX7{zIW-L&@iA$IhdVB z<&$W?g5pWvO|FEK%|#wvFvHcvBrb_x7mM8L4g6rbGw*`4q|2i+%Ny%UbJp- z!*h{^0sdXkUNry;Sb}z zt;$_d=GOzoiL59a-hTa?p7JMFMtA$VeQoikw+ao4sC?o#_o`1g;^ymK|G#lB^If8l zgIG8;|MKm>fhd47U2IJ$R885_K~U!4^+JUfCgS!LYNwCOa8;p2OIb!4)Cp&9uy6oN z{A#ZoicDh4%3ts&e+dtTmlHAHY&H|q&^N722Bogz%zH_2g!XggHb-0aTS*rEt zdD0tJyRLT{HQ(aUC1nEAmf+s6Y!b@uJcS&qZJ=;R=LaJ-3-Oa0k+1s|uPq`>1=2CM znDq<>H9%qMPxnJII$&fk99w{?kOe*ktt5l$Y{Q2}e17IqC^6O|alw1M5YRvcKGoqh z-3RWx%y*98I`|*9E%kMlzgtZT5vQ{9k2p=SbmarbC6|2*(&2Un81a8}L8R&QsnZ77$kzO?uPgsD?0-+ZrD~?Ya%wlM8U3S?sxJ7nx6cK^mWC{6X7?fR}jJ zLcRSs%a1G~vbe0;;MczX3qZlk3432o_5pqo!Teq|6(T+jH=P0YE;Y0J%=d`StlxaZ zt8stADR^$tV_UW`UPYYW!r}hX4xS~I$RT^o)n+r`Es0VaIty8K+Nfj#t<_`T{jyn& z4lZ}zd+ggE3D1Wv?o^D$%gA4Ij2$ic-*X8pj}a7R%lS6txCV!$)Bop%2b;{?C0Y7$ z?RXAK1x>_QA90CW10iK?o10TAy7Z!!sTbEfo^?+UGW?g0x-u9{vHFoOFI}7pq2Hbr zAF(5qy=yPbsm67-&_9_@OMe63>x-)ow?YqI80dLCrPecsrwV0boN&HL9<#mSMu5)I zBau~gRDVFOcr1|3lg*dpY8^TM%k-`va>-60J3}O2w6%Xs+xtWy$?8^4)8sr4K*J*X zW(QMs_<(S^m~3Jhd(U!;0MwpuQdI|wBjxkfzNz+E4LCd7nZmvrm(daOS6>ut` zK7w)TTE?!ed`T}c4|nBFLp-iJsjpLNKO7S-NZ6oYOvaI^^he)yUNHenuraFzNA2;WTi1~9Ed@ie4mI?ym zn`oNjp4ibDxd`9}eV`M}Qc=z+#r_Zc+QSAASWdm}L$`_?CY7#Ap zqm0zU${gnBB}otwa?D#gd*QLwK)bX%MCDI3w!(=h!?^hU+i@3}tLwhHB0h1f%!N>Q z#8W&_PFB#HcqIl&5%RqKz>auwFU9cWndYOjtbVpuSn7R-)vQiNhG%I{rzLyM(b8X9 z`#crWMvXRq0#zY`lVHJY$U=9& zX)GSS?R&HZJEOiY7*$$G@2Zlx-+cAl^H+kSU$Ga?m0LMU$R+E*!@4#|SHY$r9^Nv| zwjNSp>KUI1W}<{m zgwkbQIK5;(jw$Vh7_=}r$ZEqGI>$3wVwhuVW21T(@v#wHGX`PJJ8ZX`G~X+IKDJ7} zoJ|rZ=#+OoBfZ%EV--|iJS&?)4Uyl??FSd~5T?z4ypf0)dZxU7Vnpk%h* zdJt+UFeIDBCD)}w?~ZK0c@(eCYqhO%DqGnn$9N5k9O6}_Vqke(&XFWj9p4TsK|l3h zIf%Yvj!B`?&b2h}dBTYP{#|?Azh9NncnA5Kl`H%$WGhEWlg;?b^Ne$)$lbz4?!#6k zHXaAI?Hj`~TBGD&9@dsjXAQqU|97DQ11tO1y?V2N=B4Gtec0TZOsZ8LFeh zF%8h(z?+XlWq-}oMm2jzSyKUdZ65kb|Ni8PS0oQ>EYAkXA$6PBZ_={sK5@IU`Y?$7 zK@TzLipjg~Y#!B^BFphCf=j1{s-Vo&CP?d(LUJe_TshkqWdy8;G}RD-w)r zuVFtfbb}geqikg8<|qE84I!0>>!X9(-KN7C+Hb z8c&*My2?g%MN1&iFHhxq#UR6M_JpyWYU;y}6TE128NA?qO?=vGZ;F@nQ*|aJhx6 z-?)E=j4VtQnStj%%8=28Fr;h#sPn|6z}wdfTq_tg=6aZ7XXKO2oj*4vx|1YoCF5pW zQMLc4maGb^`f_E*TaC-~#P z!K*D=T>NR8Wf7&J(e^VVzu)D4R)*4=Z(gsinniStesnk?2!_n~NUnnvcQ`}Bm{i=B zBqWo|Q^fjbXMX}<5sfuDsOFEXSV0T_v*ZwQN4<#d=y9L(%oIWUT^NleJYo}#95a-oMbk)KgN$S_|l zQ$xAS9I0~*JqN7%6w}UC_($qCq`45S1Vz1~hFzlY3#UyyqLA`5ChBw17`Vy9%Yn#M z9uYX{p4drS5eJ0r2+`JO@4%x2vrT*RCd@9s{0ND^57OZ`5>t51**5oUJgKVYo@d%v6>oViEQ^;obsEegqTbtc2H;L@wla3l4XtWFM<`p~l|r;pn&5R5AIW^TDT{6e+)$ zM^e|%w(16G*pwj`UIyD;c2vz5b__ZQC&Mo6H!H}*U*&=}xE*}copX)kW(u|Od`)>i zoVV3**6`^#o{-wKTir4k`F_jPtfkJ`akDZcj?`hBjVOYmyyv#p&~ZyP@tg2@tz^4sj@ z%=Y9hcZSTMVt0;jHgwm&sXW~&oZgAnw#}L{P7hZ%<%Z?|?&NI-7w@A{TJJZDyAtl< z7(ta)N;)IzGwDQVMOMoCry5HAHZ^|}b%s6KAU7f83yF1wqb`b;I%DLe+2+1SkjA2WNLcWEC_PXnoxSIzp+Ub@Wp&l?{1^E8LR&n58O4a@ef`1-Vv&os=+{I%jOdlO8>(7()KR4qJSM1B{UoPtWx zJd_~mck~|(!}86_(P?V9y~|23$3<4X2ssjrd-`LmSPJd@*}{L7fj!!UEyC`F!ctd` z4I}TNoK!3RnIz;*<%(8_Xe8g&+;y%5+lsNm_>dc+vcIbhWNGdx@HZS69QEsKjTe<0 zPBp#V&4OuZUl^+3A-Nlo%SZRZ+RU1vT@C1rxOJRhl^pw=ab_jYzc2eaeC|`5An}k?yJ9}W_Hn#K_XMF5SN&zXfrrBB!WEU=NYmuvf=A-tHDgzv ztKAem>bXOtnmRDv$ZHP4MBiw=UP!n#yVY{NI_y`u5(cjZz5RE>*-bE03ZDENPxm%9U6pb!hRLbJEjVx~WHAMx z{d^CS9;KL99$4AxZ>5m%Mw! z8{<8yA+*_Z!5(eLs@c0Q3drzfyTToLr*5*R>{bn6Cr>B2 z&HTC7)u*jD{`MSN=B7 zye+mCZ)m~8)9App6&oLyZqNlh>;M*#cd$}eQKUP}rl45M- zOmnae0v3`6e!1}ZncbX?U)GtGKt$ z?IE=nihKswQs&6Ptcg^F9_~Rv7XlOK8mgJB8J@y-45m)!xn`*@Cu+9DSb^JODcbwe zRijgRjkpVCy9fB}?N{-0i$tAh@mOy{;fj)1deMV1)Fv?^%B*r6it?(a!J+vbU{au? zopAJ8U|0=P9vLZ>N~-r(Qric)h|~DU)mwG{ZK*g|`8F2MX5gfc*$?RtB5+U~f{Xv; zHUWwu;$wDYyYOddvvIH?1F_SMfHxJ)$!56;Uq;!bQc7-jd=^yj?1jWRs`h$T?LxK> z|6VyB&QSYj&}nOl-UB=v)INb$ZmBT4>%VjFwfsz<^d9A&@rUUM;lv;y6eiE2w7s)Z20ueL2QP}@wEe9ME{T$+HD(x%8$J3jJCSHGY_H*Dpy7E{=|x!J z@FeMZ*y(@lL_Ln|&K3d4M6wgj8#oNnwa^8qGS~V^7 zIBOc!F=@3AdqbXbx`&%2fZBTa8wSjgH|pZ6t_X$*9}Y`0{!E50VF_~;z5b4|&tC~dja&)nGp(FS%kXxLG4MbWhl1;~hXrd2{KG(030r~2(#y4QL z33FKQZ}KZP$et~>yGSXmTIKZ_VT;f9F`)Xzz_eRNH<<^RwCsP+Zc$iOHc z4iX8$i+%LUTy1Ivz({4|NM$QV_UoRD$*o0CJ?XA4MTLZWusM%SmwL?$-(9lXN1u!F zW2WWSW)=1Qu{~J@Rgj%@#{-6HU%6q9wDL#mG!gDx zo=IXY&-B8#xaHpsbJ2=JrJ3&H z2^=|z&elpEGA2W*Em{UWa0V=-^2?zZkEtQJ`GpZDm@EpoH$0$Xy&3ipHXtB9MDt9L77(&7OiutBMXbs+h- z(j|$`(2eu?*|Y$!^Wg$T>t5nE`_((usx6(t~HBprSRO{5rY%bD<{6wdZo;BG zI}8<7pCP&aaK|M=Wjhho2D|bpY$K@q! zqyLe4*y`;P2N_%rs-^+_Fci-PdvWH$ydrm}=v*=!fPIGEJ;7zFIHaBMbC~Td!qAi2F+DcBHd-$K*2mFi%ZAl&w-R@5x`?;^@}>^Bl0w}WFS4}5hO zpsa#LEb%@LZQDXn=tYQapt@P_B|vn$U*MHIfo3oHHl&U*cB#&*(@TJ`$kQ34`v?U> zX4U+k3WUTqgFXN%^!(;~7oXbmP%TEA{v=3?vMT1|5^q_s-x&%DAk<5pD<>q*@899Q zEE(}!Q?ubGAQ=cGUy5eF!k5HyYg2}nNP(bu#7NMY2zgFfmA)Z_teOtp@{S{Elv*GA z-YZ3vBEdQQJ*h?G{sS5;8?NAJ%Cn%z<(pO^+ko~^Vt&JvaB1HI3DX^JmKL+6R*hz5xo1cIQ`rQiV(FL9CNB&9or|7lNa_G{<<+SKW$ibRpD z)o5wRtElAgHAePO!@Xi1w9N0cO8n{kQYxOQ!bB`#n*5M{2zFnqphLPz;R8Ouci*8V z{FsNtrH$zPQ>yHT@icmB@LXdvC~cK|6tdrq0oU$N5DCkX9)mY!%RBrcV_4qo9a|io zv$(ZMh<7!R@b?1VRqjqhzYw^`7v3YnH`V2UDASBKcP;373{D27AQZTGJ@&;OK?{fz#@BTy$cdc6x7=Gnetpkejv~@;{52{@xYBSF zlmB%q&-#*+H!i_8j&k<%8G%^NT~!c{~tD{SbkAnVLe+z}FWBXGmMSjDEHC?U6G|MUL1>r`FKU{FHf zTje-GD&2>Xp^ll z?-xIn^#3C}VW?xoZ>MQ8O(i zAk@iT%rV-b+z!JZ|Cwr^{Cjj<_9xWKzkAYnyI8Gm#mHK>@=)B93D7^0u9p0`L&Cr_ zvw?#2?9}T;m zX-M|L^B;Qal(8QO>o6&iT0C_<2BHGHBW|)JGhh%0=aS6JE0CR<_n?;28S;=Xs6Lvy z0l=44#~4ryYx13?Z$9D#FRxFr1axc#La@=59bPrw|)gviN{k*|fcXO{6ysQ531 zQ0#T8(_0`Va?KpxozzxRYN5HDg0`+wh;M+F*Q@R+n2B=jn6Q*(sc46gQB^$+{-yrf&$FC#-r`2(Rjp(@2Q`~Af3 z`ebPHd}4)gAcMIDNFw&3F2ieog7i?7rPI-!zfDPC6Z2=&7kp&Kb0rO|xZj}M4m_g@ zJaWgzO+#g@wK>%8Z&o+&d+Wlv_l78)(DLw@*+eA2`6AnEMRm=c*n8U&gyVytl9$Qw ztnZgr^F7ExYt>;_Z#ibn;v4C6s=w- z^7PA#ASaLW%|yApX4eXS28mT*rCJz zEVR>QMdQ#n$Ubdt$#xT6^=&L&XeWNEprrJuk6F7;m98YraWr`;u!$;3VmN-=XPWU; zI-=d1n65*?KWGM7nO%nHqvQ&n^<8UQqm%0amZ)P>+u80E@G{y7#i!Wu>w)UtJ9>O{=Mod@_Mbe;J#o72o08q(^0sw_6)xF%` zTiD&&eEVN~W%PI$q`k9HB6+YEj$ZXs4DD7KD&i@6y;6l}#0Kynx}d4}PM-bl9uxP_ zO|jq_YPUzLB)gisJ7=hc%QV;1zG$vb0gM_AvPyx3 zfBSe|$&s_6`Su4Z6|%UYi#PnvT77ZaQ}2V{&=1Z?UcMnY;J-al>vTa!n$gRWjnv39 z38MdBbx2G>T55*N)!$^wGNl|9smXiP`iO$Sg{|iI1=U$s(6&8SRgCcJ1S((4eoUxrZMoNN~2g6-F<{g`Fxz;DfU!nr-O-SH#WNC7f@~WO2h~|1r6d zsg9EL`QfYN`Gl^k?INmh1e|Dmpt*HBtFFu_u}nkZ4x~hVnIH!Aw?__*)aN`Am*#B3 z&yPF2r#uTlB}#*7aK`JhlW6Yjc4)-v*Gt=46qga)L=%Vc0ALaEXw7@kMEcUgi%**g z=Ot)5xf7dDd!=6O75HkRI|a^EOwK<+qUGOGcaSL>H}H0Jf7J{YM@-~Uh$!7L$$6YM z(Bd0LjFE0heX}g0vUT&GjZUd!<@L6jJdiptTyi+g=%}h+K)5wx`s0*_-neC|)3MbD zirM$pcjk?xWHCSrzKp7mOCH%*!YHrx01Ojni7K`o=gBGwj;7Qoc3f4D4ZAAstL%*m z6O*)HDtSL83&!|<9|pdQcndq46{5yE+oq%oS^TM(2%fp=hZo|Dc(8CqSF;~v;-j0xjO@0QW_$Q40O$X_h|{C>y+wo{xD*+~_xYB1y7>AS zT3$pK4wxOc?ouKsfFIBPxV!v^+m1mF$;sorAtEpb2B&a?V1dIg?5^2K7=w)!pp*LQ z{r5>e1meI@m&=(zLg-Fu1!RhhwIBsCWd@JW{$qmgGKgs$SG~j*c!y|7C?l*0vB?rk zHu-Fhmz8=A=$RwKcAa~%FKq#J#saiGb1bX=!&@RQ&%F-wKw)NC62#^8K^y_S?zaI# z-!$zc2vXNmhB}9hAzP|M7*&AJ$)rr0jjm3ed{%*tC=-<6dGpdx2@enuWT+nxIb{pv zH>KoLj6a3TIE~h{! zY~J+Jv+0RVHpOu)-a242W{zM-Xk}IUC&>~oQG})(dg{=Zy(aJQ`JDEdLFtXh({JMo zLM4X&p(hE?wosZV`fB@R_!pV%2qpJ=HCiq%BU~z(d3qF5-}5RzqwyPo1UI1~k23cf z)Jddfe6toxIyDlTEWdQr({M~a(JJw#Z3^`;{*OKmB@Qc0*J|sW;;!2Hm3wTHhAh=~ z5RzBP&I)st(#KaCle#Ok(qsYYh(3XM27_lziraM4 z&GbS;AChJ}s!#RyBZnNN#T-Tr!t4m{7$6tA0|&F@hP!qo8s4spmu?UV(2HXwzVMQ! z_o`{47B))Bm{|b~FB?B!BqL~>DZRkw-QeYa;<@qcZDxC%+F&uwer#VvBHN?3hsBFB z4>WSOHi_Y)mfg}5e!eHYyQ7(gGVf)s6`u7auw}WDVG^V96kkI6dIvR_>M!l^4sbnk zXXA;zgBz6v#fx5Hh*jT~>j|Tr)4KHZ?EL76{_8&z{+Cy|Zo{5tGt`_}yYz@%3aMzo zMoP)a|NOe;w{UCHt2z$)uiKsIJ0N50^M2h}t4Ebs=51MuYjB+LE&AQ6J$Wzw~Dz?#LGyybbA z36MY=#3Ku-wD?LF=1Qp~VAuUG2TUbbAE?Wms4IztTCrpmME7G;i{{Z&khS( z#o#$MKxaefN$S(efa~<{=7p4t#I>ya$1zdPZ(I7dV;<$%y`V`RS}Rch;!`*Q zv7BCxqI{vD+iq3V&vSnd@~71=xh21)o5$YZ;0sNpQ=LMR6m1y!)l2XI{P0U$ixWX$ z(P@4cnl*c-5Ndh;orrFn%Q4h;7xZ4KOXNF)wb1m$ zw4|Zd!**@9s9Wy}OPueQ5MY>M@sYSGT55sWxZOV@P=rSTlJES7Qxxr+%7uiS;D7h1 z`lBB;3&*A|eNX7EE^b$%AAJ`7oqn3c8NJp*Qk->V?Q<9+=EOD$HJ6cr$!?~}(=~u_ zm%+Mxr4BM*9vVy{=XayO3C!69Os|mLf>FZHdWTnHb)G4{LUnR@SKx4~euP{`z!y}| zWjn41Yht;rKLPCmmlr@cM&C_`mi>+Wd^{w8Jp`fC4C0sZp2QmM2FCK_7W!JsffP@s z>h52tM*GTj7&a(dzKM7yKf-cw2G2?jSX?Fiwz19HAklc zAuW9IVThOXN9Zg<-g6huMAt9-kCOU(a5EygmtKLkLmq0)mW`+LZD0Tbnz& z;0QjdOVJ{c>-iJ>?&QQg(sD4V5Krbu;ILaOz4)|zez_}mNzV_l+_tAh){<#P8-iao zZ+OJ@WeQQ%MJ!#c1}ouqG;4;;A+;bem|8`3m`eIvLAVB0PV|i_X8E8Y_OW3_ja#>( zdrls<)~?wCC&l@aod@@D+UAeUDZr1?Q}S2Y5uc#^iD8`%h|x zuOvE9#Lw?0k2GMybjbbK-oupPG?*#~%uTg}CO3ar(SwbqD-&95x7lE!A^j})Ye+AY zgfZ;dXxe@ZrTUh#NeS|g+1YQ$w)sTpi(i{bcU|=v<>AF1@7;@?ONT1>e?`y!!)Z(_ zmKv%i@foELrGm5Pq#aJ5*|8xRtq@?{tHoHqi;tDpkDVWst z$yV4dnXa5=dE_yRcW>RNa>!PMdemScQn zqq*-@Vk{pJ`X2ws#qB>#&T@Lz?W8au6zzBHSUBA>Zl?ubc-+=>XcHA8R^H5NC>I+} zGFY6zxsw0{CaQEc~Z%I>V00`LOP(2%;IgPgRcqYIitcMI|qOC|8h;o1)=<8jMVHj_)iVpDE=XL%iOEVMCEI+n`Y z7A9<9dapqE`l^O)`Dmq}7`cv~zP+=GM!fA*np93jfGVdEMf;2=w z*!8aT`C#G~Y8zw&8O}y0U0u6*EFG+lc1V8NiX4)(W)n(QmpHYt*8be)HMtXJFbh06 zw}?xV*oSblR)*0QVe&DIgcnuDb?K>cETpRXN(KI+? z>%IA-iPAvWAYSw0RTjELVitX5I0$sa9Aej=%X>!-cM!KgP2bhp5T>TWihZdwGjb@( zCl?Z$Yz?3rZYa@U38Bub`u&%tdN0vPS`G`#g5e#1E76 zbIbHKp~yZ}nJ~H}|3LM!;w|u6I+ng!XD?jU}H`9S;xM+!eNhX=Qw8>hY35m4$Q1--l3yPa+=YIL-zf)S9cHU3q>Cs(FW70l)PFvy9^ z1;7EbP373Z3G7m-B#7}9jtP)*s1(MX%KFvawvmaTH~ZrYsAJbkOCKq%V-I>?kJ^hL zQ_~b}t6@V^keH>~+D7y4;QFxYE{V4%2)4?yreX?8?pb`9!sDm6Zh{cUejyiV2m9Vu zUABQhpy-vxBg&OH~CPaioBvgJi%ISrF&0tX^QX?#VcyQc4$T^&)4tqh}% z-JiP9r(8_Qx!JH~^U#J*6h3Sx-=l$}kSpe5J;2JW)plr{Bk^&hX0%OLMq>P`HF2hR zHao82NjLsvHQ+us$c_6<$flUmgZj`b<18%cwf!&GyZ^=BTR^q7b#0>w8mvu#qQ$+% zf|ue1cPYi8xRwINT?zy%R@|*n+$l~8R$Ph}DYQ7nrC4v;o^#&s{oXU~-}BvZ3@MCt9PJ`8b+H-QKiG^_igKv0*U<- z6ksFxbbY*~nyN%me8N~CF8^Z7Gf4yx1s*%!W4`*LAo=?KRdrODq62T7E0YrC+Qk%8 zWn)!a>p6m2Trh!Y3IKjZ17+b+h9*f)ciCV2Ci(bhl_3L+(OiCJrPVS*u})qE(8G4j zIvMf#LA@=1AkL$+Peb=!OyVGkisd2X90>{MrOdSapqp9C4mnZ1Us&kt<-E3+N%)l- zN`aiwuMMHE=!B_17>C_u3|y z(brxwyfOo!tG{Z=S<*KN89nXIn%fs=R_;;h0d>5TV8=Jk*5*xOQachz?9!9;ybOUx z$EqTSK?E4$J5)VnSmeQ`>_6BLyHRTKugvLjXlD1JZQHDnk91VpR`gFHk$-^gV=Mb7 znKUkqe(^;9*dIYEO8RFQ#L8@Z@sP3Nb@zTq z+w8aJzXO`^Rs37iiI-2pCNKi&xV4uS@jsslIa- zdSM#dPtbXHSxwIf@AijFeGcS?=DmHHdBMB)GK+Ub%M~ykGZeBmw@Kr(Z4+ZZ3md1u z)(gPQ_=y*PF7QZLW6n=MUZaUl*7_Yv4Ckz7)kewFReA=l(5|#!(A$8YWQ`y+to4}& z@~f5mAf+f9qqDVV%w-iJp}vX_^~XZ(c288qKXurd zZ;Jc@qrRXelFb)~G+<>45vo*T?(H2b6MVbMy_94IGMC@AKZ1C3?3=xiEt7VSIWzx* zz;bz-hB$YY;+g;pjWG68u8{5BXxU8AI!gH5xs`9l+$Xwcr%KDyAO`NPG(s0vmf7+>PAnP{HA_GF?f%v`CC#U2kDTHU_CX-!bEbMpsd=Tyf_?iWwj z|0NOzBTrO0PDd3m21W(5=7z<$@wOC-eO!xm$I$!jM}W%}QLYXp4(jCeQcsTb~A6@SVK8 z-k+H0Ow;0R>XbkeMs~rIRbrsnXfS0YAR9G15|E6dV~PZJ|3vj75!_IMK^NgC+NcMO zS2x2NhSi!@WJf#>$2VWDkZT&Kmp_6jDp&r55@Uf08c}?DfI$PhI*%z(XQ-CIVwkc_ z>-WXT#ge8sft+a7-@Lq6Vrimeq1!ZsLbPpl7fXj=WL16!n!F=rQ@8!2hD%xQPY&}8PFGkKE zwO301QTvM04}@gU#IXE;oXophma71ERVwKquyxhUdi0+db3x2X(Y9Y8?&(sA*VSIK zStnuA2*XMoK(iR}lErLeb0@;><5+UY6~!ivg7VA__YZN7XN7MkZ*9< z&(_B1yKQ{;C+@!kCjoOT`}&sHQ^0j4pO_cm^N*04Uv`f&QBCtKvMg`ON(2vz{LPh1+cdmppKpB#kgEih1@#UIa@WuL(x!e<;AEZ4~Mlzf~(K(UvRC;%;@)$YqNEOHHRd@0Vj{r$s1iDe+WqFi-i3LYUywZ>C7aGkoUa@@MpNG+m%=tmLf%4u9Cd?6Y}dcTjP9pMJiyK`Ue)Zom75DlhJ~riyYo< zW&yl|&)_`rxP@Ery<(WU=G+A$SVys|U&G|pGm`1CLnKG*K8-!jq zG=HLCjI`7#T0wwe`#c0qxFZYbw#Es3TPglAI@E)y@^jFH3lh5_5U0lFN!kwYCnZ5q zBRt+xHl-tbcw0Hi*Q8oaF=y;8PONH{zz-m#F8!W_up<)*c({mZCmeOjV~Y5ZQD?p* zW;!ZM0}D&Mb7Q2LiAFFY2F~U@jPezSneokP7* zY&B~Oa(s2*6j-3;G>cLN=8450#Kb8G!A5kNXZ!Q_EKtz_#PjY0s{E7X0az0LY`VDF ztp*&nD!^GG$F!ExpoH<~-~8(UikpSJ$w4RN@X^uD%0XmU*OCs<61 zVv&{DYicn9F*GXVo>fi|5m(SSyN}uQ{skUuyaKe-Xbc|B97u|{k<9%taR?K;tV?^T zP>ZAt4D2xincQa&!+OR5(~6d*PATdv1~S(S0eUyjj?ndjeEKPd9p?eJi0tlj1s zI<~!@`7rT^2_^OS(-;R56+@D>goLCNk--LeMpx=#C65G99u<7JgAZ<0O8O3nycKbW zfL>mHjV}7xSA26332=pf^y3n1RAy2MIkUh7dKkSme(k5eag=t#jb@f!R8UU~uR&*h zcP&m3N`kyyUl11n1yhyV1Z0;B1(?V@on_Rl&ZFmj$3o0o#f3iF70T%wv%t(B4gDzY zL`n+)8%LNoW?4|X=jWmg@Q0@dgukJnW=`B=deI)9z<ɶwNf4y5j`DV` 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 diff --git a/compile-pdf.sh b/compile-pdf.sh index 134623e..c895eef 100644 --- a/compile-pdf.sh +++ b/compile-pdf.sh @@ -1,5 +1,4 @@ -pandoc -i -t revealjs -s -V theme=simple -V transition=none -o ulaval-ppr-principes-fair.html README.md -cat README.md | python extract_emojis.py > README_emojis.md +cat ulaval-ppr-principes-fair.md | python extract_emojis.py > ulaval-ppr-principes-fair_emojis.md pandoc -s \ --include-in-header=header.tex \ --pdf-engine=lualatex \ @@ -8,11 +7,15 @@ pandoc -s \ -o ulaval-ppr-principes-fair.pdf \ -V 'fontsize=14pt' \ --dpi=300 \ +-V 'colorlinks=true' \ +-V 'linkcolor=blue' \ +-V 'urlcolor=red' \ +-V 'toccolor=gray' \ -V 'geometry:paperwidth=6.4in' \ -V 'geometry:paperheight=3.6in' \ -V 'geometry:left=1in' \ -V 'geometry:right=1in' \ -V 'geometry:top=0.6in' \ -V 'geometry:bottom=0.6in' \ -README_emojis.md -rm README_emojis.md \ No newline at end of file +ulaval-ppr-principes-fair_emojis.md +rm ulaval-ppr-principes-fair_emojis.md diff --git a/reveal.js/.github/CONTRIBUTING.md b/reveal.js/.github/CONTRIBUTING.md deleted file mode 100644 index bd0fab2..0000000 --- a/reveal.js/.github/CONTRIBUTING.md +++ /dev/null @@ -1,21 +0,0 @@ -## Contributing -Please keep the [issue tracker](https://github.com/hakimel/reveal.js/issues) limited to **bug reports**. - - -### General Questions and Support -If you have questions about how to use reveal.js the best place to ask is in the [Discussions](https://github.com/hakimel/reveal.js/discussions). Anything that isn't a bug report should be posted as a dicussion instead. - - -### Bug Reports -When reporting a bug make sure to include information about which browser and operating system you are on as well as the necessary steps to reproduce the issue. If possible please include a link to a sample presentation where the bug can be tested. - - -### Pull Requests -- Should be submitted from a feature/topic branch (not your master) -- Should follow the coding style of the file you work in, most importantly: - - Tabs to indent - - Single-quoted strings - - -### Plugins -Please do not submit plugins as pull requests. They should be maintained in their own separate repository. More information here: https://github.com/hakimel/reveal.js/wiki/Plugin-Guidelines diff --git a/reveal.js/.github/FUNDING.yml b/reveal.js/.github/FUNDING.yml deleted file mode 100644 index 972831e..0000000 --- a/reveal.js/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: [hakimel] diff --git a/reveal.js/.github/workflows/js.yml b/reveal.js/.github/workflows/js.yml deleted file mode 100644 index 071e030..0000000 --- a/reveal.js/.github/workflows/js.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: tests - -on: - - push - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: - - 18 - - 20 - - steps: - - uses: actions/checkout@v4 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - - - run: npm install - - run: npm run build --if-present - - run: npm test - env: - CI: true diff --git a/reveal.js/.gitignore b/reveal.js/.gitignore deleted file mode 100644 index ba5aa84..0000000 --- a/reveal.js/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -.idea/ -*.iml -*.iws -*.eml -out/ -.DS_Store -.svn -log/*.log -tmp/** -node_modules/ -.sass-cache \ No newline at end of file diff --git a/reveal.js/.npmignore b/reveal.js/.npmignore deleted file mode 100644 index 362d612..0000000 --- a/reveal.js/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -/test -/examples -.github -.sass-cache -gulpfile.js diff --git a/reveal.js/LICENSE b/reveal.js/LICENSE deleted file mode 100644 index 0de9fdd..0000000 --- a/reveal.js/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2011-2023 Hakim El Hattab, http://hakim.se, and reveal.js contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/reveal.js/README.md b/reveal.js/README.md deleted file mode 100644 index db584dc..0000000 --- a/reveal.js/README.md +++ /dev/null @@ -1,50 +0,0 @@ - - -reveal.js is an open source HTML presentation framework. It enables anyone with a web browser to create beautiful presentations for free. Check out the live demo at [revealjs.com](https://revealjs.com/). - -The framework comes with a powerful feature set including [nested slides](https://revealjs.com/vertical-slides/), [Markdown support](https://revealjs.com/markdown/), [Auto-Animate](https://revealjs.com/auto-animate/), [PDF export](https://revealjs.com/pdf-export/), [speaker notes](https://revealjs.com/speaker-view/), [LaTeX typesetting](https://revealjs.com/math/), [syntax highlighted code](https://revealjs.com/code/) and an [extensive API](https://revealjs.com/api/). - ---- - -Want to create reveal.js presentation in a graphical editor? Try . It's made by the same people behind reveal.js. - ---- - -### Sponsors -Hakim's open source work is supported by GitHub sponsors. Special thanks to: - - ---- - -### Getting started -- 🚀 [Install reveal.js](https://revealjs.com/installation) -- 👀 [View the demo presentation](https://revealjs.com/demo) -- 📖 [Read the documentation](https://revealjs.com/markup/) -- 🖌 [Try the visual editor for reveal.js at Slides.com](https://slides.com/) -- 🎬 [Watch the reveal.js video course (paid)](https://revealjs.com/course) - ---- -
- MIT licensed | Copyright © 2011-2023 Hakim El Hattab, https://hakim.se -
diff --git a/reveal.js/css/layout.scss b/reveal.js/css/layout.scss deleted file mode 100644 index f499fdd..0000000 --- a/reveal.js/css/layout.scss +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Layout helpers. - */ - -// Stretch an element vertically based on available space -.reveal .stretch, -.reveal .r-stretch { - max-width: none; - max-height: none; -} - -.reveal pre.stretch code, -.reveal pre.r-stretch code { - height: 100%; - max-height: 100%; - box-sizing: border-box; -} - -// Text that auto-fits its container -.reveal .r-fit-text { - display: inline-block; // https://github.com/rikschennink/fitty#performance - white-space: nowrap; -} - -// Stack multiple elements on top of each other -.reveal .r-stack { - display: grid; -} - -.reveal .r-stack > * { - grid-area: 1/1; - margin: auto; -} - -// Horizontal and vertical stacks -.reveal .r-vstack, -.reveal .r-hstack { - display: flex; - - img, video { - min-width: 0; - min-height: 0; - object-fit: contain; - } -} - -.reveal .r-vstack { - flex-direction: column; - align-items: center; - justify-content: center; -} - -.reveal .r-hstack { - flex-direction: row; - align-items: center; - justify-content: center; -} - -// Naming based on tailwindcss -.reveal .items-stretch { align-items: stretch; } -.reveal .items-start { align-items: flex-start; } -.reveal .items-center { align-items: center; } -.reveal .items-end { align-items: flex-end; } - -.reveal .justify-between { justify-content: space-between; } -.reveal .justify-around { justify-content: space-around; } -.reveal .justify-start { justify-content: flex-start; } -.reveal .justify-center { justify-content: center; } -.reveal .justify-end { justify-content: flex-end; } diff --git a/reveal.js/css/print/paper.scss b/reveal.js/css/print/paper.scss deleted file mode 100644 index 32fab8a..0000000 --- a/reveal.js/css/print/paper.scss +++ /dev/null @@ -1,166 +0,0 @@ - -@media print { - html:not(.print-pdf) { - overflow: visible; - width: auto; - height: auto; - - body { - margin: 0; - padding: 0; - overflow: visible; - } - } - - html:not(.print-pdf) .reveal { - background: #fff; - font-size: 20pt; - - .controls, - .state-background, - .progress, - .backgrounds, - .slide-number { - display: none !important; - } - - p, td, li { - font-size: 20pt!important; - color: #000; - } - - h1,h2,h3,h4,h5,h6 { - color: #000!important; - height: auto; - line-height: normal; - text-align: left; - letter-spacing: normal; - } - - h1 { font-size: 28pt !important; } - h2 { font-size: 24pt !important; } - h3 { font-size: 22pt !important; } - h4 { font-size: 22pt !important; font-variant: small-caps; } - h5 { font-size: 21pt !important; } - h6 { font-size: 20pt !important; font-style: italic; } - - a:link, - a:visited { - color: #000 !important; - font-weight: bold; - text-decoration: underline; - } - - ul, ol, div, p { - visibility: visible; - position: static; - width: auto; - height: auto; - display: block; - overflow: visible; - margin: 0; - text-align: left !important; - } - pre, - table { - margin-left: 0; - margin-right: 0; - } - pre code { - padding: 20px; - } - blockquote { - margin: 20px 0; - } - - .slides { - position: static !important; - width: auto !important; - height: auto !important; - - left: 0 !important; - top: 0 !important; - margin-left: 0 !important; - margin-top: 0 !important; - padding: 0 !important; - zoom: 1 !important; - transform: none !important; - - overflow: visible !important; - display: block !important; - - text-align: left !important; - perspective: none; - - perspective-origin: 50% 50%; - } - .slides section { - visibility: visible !important; - position: static !important; - width: auto !important; - height: auto !important; - display: block !important; - overflow: visible !important; - - left: 0 !important; - top: 0 !important; - margin-left: 0 !important; - margin-top: 0 !important; - padding: 60px 20px !important; - z-index: auto !important; - - opacity: 1 !important; - - page-break-after: always !important; - - transform-style: flat !important; - transform: none !important; - transition: none !important; - } - .slides section.stack { - padding: 0 !important; - } - .slides section:last-of-type { - page-break-after: avoid !important; - } - .slides section .fragment { - opacity: 1 !important; - visibility: visible !important; - - transform: none !important; - } - - .r-fit-text { - white-space: normal !important; - } - - section img { - display: block; - margin: 15px 0px; - background: rgba(255,255,255,1); - border: 1px solid #666; - box-shadow: none; - } - - section small { - font-size: 0.8em; - } - - .hljs { - max-height: 100%; - white-space: pre-wrap; - word-wrap: break-word; - word-break: break-word; - font-size: 15pt; - } - - .hljs .hljs-ln-numbers { - white-space: nowrap; - } - - .hljs td { - font-size: inherit !important; - color: inherit !important; - } - } -} diff --git a/reveal.js/css/print/pdf.scss b/reveal.js/css/print/pdf.scss deleted file mode 100644 index 0a1c2bf..0000000 --- a/reveal.js/css/print/pdf.scss +++ /dev/null @@ -1,159 +0,0 @@ -/** - * This stylesheet is used to print reveal.js - * presentations to PDF. - * - * https://revealjs.com/pdf-export/ - */ - -html.reveal-print { - * { - -webkit-print-color-adjust: exact; - } - - & { - width: 100%; - height: 100%; - overflow: visible; - } - - body { - margin: 0 auto !important; - border: 0; - padding: 0; - float: none !important; - overflow: visible; - } - - /* Remove any elements not needed in print. */ - .nestedarrow, - .reveal .controls, - .reveal .progress, - .reveal .playback, - .reveal.overview, - .state-background { - display: none !important; - } - - .reveal pre code { - overflow: hidden !important; - } - - .reveal { - width: auto !important; - height: auto !important; - overflow: hidden !important; - } - .reveal .slides { - position: static; - width: 100% !important; - height: auto !important; - zoom: 1 !important; - pointer-events: initial; - - left: auto; - top: auto; - margin: 0 !important; - padding: 0 !important; - - overflow: visible; - display: block; - - perspective: none; - perspective-origin: 50% 50%; - } - - .reveal .slides .pdf-page { - position: relative; - overflow: hidden; - z-index: 1; - - page-break-after: always; - } - - .reveal .slides .pdf-page:last-of-type { - page-break-after: avoid; - } - - .reveal .slides section { - visibility: visible !important; - display: block !important; - position: absolute !important; - - margin: 0 !important; - padding: 0 !important; - box-sizing: border-box !important; - min-height: 1px; - - opacity: 1 !important; - - transform-style: flat !important; - transform: none !important; - } - - .reveal section.stack { - position: relative !important; - margin: 0 !important; - padding: 0 !important; - page-break-after: avoid !important; - height: auto !important; - min-height: auto !important; - } - - .reveal img { - box-shadow: none; - } - - /* Slide backgrounds are placed inside of their slide when exporting to PDF */ - .reveal .backgrounds { - display: none; - } - .reveal .slide-background { - display: block !important; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: auto !important; - } - - /* Display slide speaker notes when 'showNotes' is enabled */ - .reveal.show-notes { - max-width: none; - max-height: none; - } - .reveal .speaker-notes-pdf { - display: block; - width: 100%; - height: auto; - max-height: none; - top: auto; - right: auto; - bottom: auto; - left: auto; - z-index: 100; - } - - /* Layout option which makes notes appear on a separate page */ - .reveal .speaker-notes-pdf[data-layout="separate-page"] { - position: relative; - color: inherit; - background-color: transparent; - padding: 20px; - page-break-after: always; - border: 0; - } - - /* Display slide numbers when 'slideNumber' is enabled */ - .reveal .slide-number-pdf { - display: block; - position: absolute; - font-size: 14px; - visibility: visible; - } - - /* This accessibility tool is not useful in PDF and breaks it visually */ - .aria-status { - display: none; - } -} diff --git a/reveal.js/css/reveal.scss b/reveal.js/css/reveal.scss deleted file mode 100644 index d8db667..0000000 --- a/reveal.js/css/reveal.scss +++ /dev/null @@ -1,2104 +0,0 @@ -@use "sass:math"; - -/** - * reveal.js - * http://revealjs.com - * MIT licensed - * - * Copyright (C) Hakim El Hattab, https://hakim.se - */ - -@import 'layout'; - -/********************************************* - * GLOBAL STYLES - *********************************************/ - -html.reveal-full-page { - width: 100%; - height: 100%; - height: 100vh; - height: calc( var(--vh, 1vh) * 100 ); - height: 100svh; - overflow: hidden; -} - -.reveal-viewport { - height: 100%; - overflow: hidden; - position: relative; - line-height: 1; - margin: 0; - - background-color: #fff; - color: #000; - - --r-controls-spacing: 12px; -} - -// Force the presentation to cover the full viewport when we -// enter fullscreen mode. Fixes sizing issues in Safari. -.reveal-viewport:fullscreen { - top: 0 !important; - left: 0 !important; - width: 100% !important; - height: 100% !important; - transform: none !important; -} - - -/********************************************* - * VIEW FRAGMENTS - *********************************************/ - -.reveal .fragment { - transition: all .2s ease; - - &:not(.custom) { - opacity: 0; - visibility: hidden; - will-change: opacity; - } - - &.visible { - opacity: 1; - visibility: inherit; - } - - &.disabled { - transition: none; - } -} - -.reveal .fragment.grow { - opacity: 1; - visibility: inherit; - - &.visible { - transform: scale( 1.3 ); - } -} - -.reveal .fragment.shrink { - opacity: 1; - visibility: inherit; - - &.visible { - transform: scale( 0.7 ); - } -} - -.reveal .fragment.zoom-in { - transform: scale( 0.1 ); - - &.visible { - transform: none; - } -} - -.reveal .fragment.fade-out { - opacity: 1; - visibility: inherit; - - &.visible { - opacity: 0; - visibility: hidden; - } -} - -.reveal .fragment.semi-fade-out { - opacity: 1; - visibility: inherit; - - &.visible { - opacity: 0.5; - visibility: inherit; - } -} - -.reveal .fragment.strike { - opacity: 1; - visibility: inherit; - - &.visible { - text-decoration: line-through; - } -} - -.reveal .fragment.fade-up { - transform: translate(0, 40px); - - &.visible { - transform: translate(0, 0); - } -} - -.reveal .fragment.fade-down { - transform: translate(0, -40px); - - &.visible { - transform: translate(0, 0); - } -} - -.reveal .fragment.fade-right { - transform: translate(-40px, 0); - - &.visible { - transform: translate(0, 0); - } -} - -.reveal .fragment.fade-left { - transform: translate(40px, 0); - - &.visible { - transform: translate(0, 0); - } -} - -.reveal .fragment.fade-in-then-out, -.reveal .fragment.current-visible { - opacity: 0; - visibility: hidden; - - &.current-fragment { - opacity: 1; - visibility: inherit; - } -} - -.reveal .fragment.fade-in-then-semi-out { - opacity: 0; - visibility: hidden; - - &.visible { - opacity: 0.5; - visibility: inherit; - } - - &.current-fragment { - opacity: 1; - visibility: inherit; - } -} - -.reveal .fragment.highlight-red, -.reveal .fragment.highlight-current-red, -.reveal .fragment.highlight-green, -.reveal .fragment.highlight-current-green, -.reveal .fragment.highlight-blue, -.reveal .fragment.highlight-current-blue { - opacity: 1; - visibility: inherit; -} - .reveal .fragment.highlight-red.visible { - color: #ff2c2d - } - .reveal .fragment.highlight-green.visible { - color: #17ff2e; - } - .reveal .fragment.highlight-blue.visible { - color: #1b91ff; - } - -.reveal .fragment.highlight-current-red.current-fragment { - color: #ff2c2d -} -.reveal .fragment.highlight-current-green.current-fragment { - color: #17ff2e; -} -.reveal .fragment.highlight-current-blue.current-fragment { - color: #1b91ff; -} - - -/********************************************* - * DEFAULT ELEMENT STYLES - *********************************************/ - -/* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */ -.reveal:after { - content: ''; - font-style: italic; -} - -.reveal iframe { - z-index: 1; -} - -/** Prevents layering issues in certain browser/transition combinations */ -.reveal a { - position: relative; -} - - -/********************************************* - * CONTROLS - *********************************************/ - -@keyframes bounce-right { - 0%, 10%, 25%, 40%, 50% {transform: translateX(0);} - 20% {transform: translateX(10px);} - 30% {transform: translateX(-5px);} -} - -@keyframes bounce-left { - 0%, 10%, 25%, 40%, 50% {transform: translateX(0);} - 20% {transform: translateX(-10px);} - 30% {transform: translateX(5px);} -} - -@keyframes bounce-down { - 0%, 10%, 25%, 40%, 50% {transform: translateY(0);} - 20% {transform: translateY(10px);} - 30% {transform: translateY(-5px);} -} - -$controlArrowSize: 3.6em; -$controlArrowSpacing: 1.4em; -$controlArrowLength: 2.6em; -$controlArrowThickness: 0.5em; -$controlsArrowAngle: 45deg; -$controlsArrowAngleHover: 40deg; -$controlsArrowAngleActive: 36deg; - -@mixin controlsArrowTransform( $angle ) { - &:before { - transform: translateX(($controlArrowSize - $controlArrowLength)*0.5) translateY(($controlArrowSize - $controlArrowThickness)*0.5) rotate( $angle ); - } - - &:after { - transform: translateX(($controlArrowSize - $controlArrowLength)*0.5) translateY(($controlArrowSize - $controlArrowThickness)*0.5) rotate( -$angle ); - } -} - -.reveal .controls { - display: none; - position: absolute; - top: auto; - bottom: var(--r-controls-spacing); - right: var(--r-controls-spacing); - left: auto; - z-index: 11; - color: #000; - pointer-events: none; - font-size: 10px; - - button { - position: absolute; - padding: 0; - background-color: transparent; - border: 0; - outline: 0; - cursor: pointer; - color: currentColor; - transform: scale(.9999); - transition: color 0.2s ease, - opacity 0.2s ease, - transform 0.2s ease; - z-index: 2; // above slides - pointer-events: auto; - font-size: inherit; - - visibility: hidden; - opacity: 0; - - -webkit-appearance: none; - -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 ); - } - - .controls-arrow:before, - .controls-arrow:after { - content: ''; - position: absolute; - top: 0; - left: 0; - width: $controlArrowLength; - height: $controlArrowThickness; - border-radius: $controlArrowThickness*0.5; - background-color: currentColor; - - transition: all 0.15s ease, background-color 0.8s ease; - transform-origin: math.div(floor(($controlArrowThickness*0.5)*10), 10) 50%; - will-change: transform; - } - - .controls-arrow { - position: relative; - width: $controlArrowSize; - height: $controlArrowSize; - - @include controlsArrowTransform( $controlsArrowAngle ); - - &:hover { - @include controlsArrowTransform( $controlsArrowAngleHover ); - } - - &:active { - @include controlsArrowTransform( $controlsArrowAngleActive ); - } - } - - .navigate-left { - right: $controlArrowSize + $controlArrowSpacing*2; - bottom: $controlArrowSpacing + $controlArrowSize*0.5; - transform: translateX( -10px ); - - &.highlight { - animation: bounce-left 2s 50 both ease-out; - } - } - - .navigate-right { - right: 0; - bottom: $controlArrowSpacing + $controlArrowSize*0.5; - transform: translateX( 10px ); - - .controls-arrow { - transform: rotate( 180deg ); - } - - &.highlight { - animation: bounce-right 2s 50 both ease-out; - } - } - - .navigate-up { - right: $controlArrowSpacing + $controlArrowSize*0.5; - bottom: $controlArrowSpacing*2 + $controlArrowSize; - transform: translateY( -10px ); - - .controls-arrow { - transform: rotate( 90deg ); - } - } - - .navigate-down { - right: $controlArrowSpacing + $controlArrowSize*0.5; - bottom: -$controlArrowSpacing; - padding-bottom: $controlArrowSpacing; - transform: translateY( 10px ); - - .controls-arrow { - transform: rotate( -90deg ); - } - - &.highlight { - animation: bounce-down 2s 50 both ease-out; - } - } - - // Back arrow style: "faded": - // Deemphasize backwards navigation arrows in favor of drawing - // attention to forwards navigation - &[data-controls-back-arrows="faded"] .navigate-up.enabled { - opacity: 0.3; - - &:hover { - opacity: 1; - } - } - - // Back arrow style: "hidden": - // Never show arrows for backwards navigation - &[data-controls-back-arrows="hidden"] .navigate-up.enabled { - opacity: 0; - visibility: hidden; - } - - // Any control button that can be clicked is "enabled" - .enabled { - visibility: visible; - opacity: 0.9; - cursor: pointer; - transform: none; - } - - // Any control button that leads to showing or hiding - // a fragment - .enabled.fragmented { - opacity: 0.5; - } - - .enabled:hover, - .enabled.fragmented:hover { - opacity: 1; - } -} - -.reveal:not(.rtl) .controls { - // Back arrow style: "faded": - // Deemphasize left arrow - &[data-controls-back-arrows="faded"] .navigate-left.enabled { - opacity: 0.3; - - &:hover { - opacity: 1; - } - } - - // Back arrow style: "hidden": - // Never show left arrow - &[data-controls-back-arrows="hidden"] .navigate-left.enabled { - opacity: 0; - visibility: hidden; - } -} - -.reveal.rtl .controls { - // Back arrow style: "faded": - // Deemphasize right arrow in RTL mode - &[data-controls-back-arrows="faded"] .navigate-right.enabled { - opacity: 0.3; - - &:hover { - opacity: 1; - } - } - - // Back arrow style: "hidden": - // Never show right arrow in RTL mode - &[data-controls-back-arrows="hidden"] .navigate-right.enabled { - opacity: 0; - visibility: hidden; - } -} - -.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-up, -.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-down { - display: none; -} - -// Adjust the layout when there are no vertical slides -.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-left, -.reveal:not(.has-vertical-slides) .controls .navigate-left { - bottom: $controlArrowSpacing; - right: 0.5em + $controlArrowSpacing + $controlArrowSize; -} - -.reveal[data-navigation-mode="linear"].has-horizontal-slides .navigate-right, -.reveal:not(.has-vertical-slides) .controls .navigate-right { - bottom: $controlArrowSpacing; - right: 0.5em; -} - -// Adjust the layout when there are no horizontal slides -.reveal:not(.has-horizontal-slides) .controls .navigate-up { - right: $controlArrowSpacing; - bottom: $controlArrowSpacing + $controlArrowSize; -} -.reveal:not(.has-horizontal-slides) .controls .navigate-down { - right: $controlArrowSpacing; - bottom: 0.5em; -} - -// Invert arrows based on background color -.reveal.has-dark-background .controls { - color: #fff; -} -.reveal.has-light-background .controls { - color: #000; -} - -// Disable active states on touch devices -.reveal.no-hover .controls .controls-arrow:hover, -.reveal.no-hover .controls .controls-arrow:active { - @include controlsArrowTransform( $controlsArrowAngle ); -} - -// Edge aligned controls layout -@media screen and (min-width: 500px) { - - .reveal-viewport { - --r-controls-spacing: 0.8em; - } - - .reveal .controls[data-controls-layout="edges"] { - & { - top: 0; - right: 0; - bottom: 0; - left: 0; - } - - .navigate-left, - .navigate-right, - .navigate-up, - .navigate-down { - bottom: auto; - right: auto; - } - - .navigate-left { - top: 50%; - left: var(--r-controls-spacing); - margin-top: -$controlArrowSize*0.5; - } - - .navigate-right { - top: 50%; - right: var(--r-controls-spacing); - margin-top: -$controlArrowSize*0.5; - } - - .navigate-up { - top: var(--r-controls-spacing); - left: 50%; - margin-left: -$controlArrowSize*0.5; - } - - .navigate-down { - bottom: calc(var(--r-controls-spacing) - #{$controlArrowSpacing} + 0.3em); - left: 50%; - margin-left: -$controlArrowSize*0.5; - } - } - -} - - -/********************************************* - * PROGRESS BAR - *********************************************/ - -.reveal .progress { - position: absolute; - display: none; - height: 3px; - width: 100%; - bottom: 0; - left: 0; - z-index: 10; - - background-color: rgba( 0, 0, 0, 0.2 ); - color: #fff; -} - .reveal .progress:after { - content: ''; - display: block; - position: absolute; - height: 10px; - width: 100%; - top: -10px; - } - .reveal .progress span { - display: block; - height: 100%; - width: 100%; - - background-color: currentColor; - transition: transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - transform-origin: 0 0; - transform: scaleX(0); - } - -/********************************************* - * SLIDE NUMBER - *********************************************/ - -.reveal .slide-number { - position: absolute; - display: block; - right: 8px; - bottom: 8px; - z-index: 31; - font-family: Helvetica, sans-serif; - font-size: 12px; - line-height: 1; - color: #fff; - background-color: rgba( 0, 0, 0, 0.4 ); - padding: 5px; -} - -.reveal .slide-number a { - color: currentColor; -} - -.reveal .slide-number-delimiter { - margin: 0 3px; -} - -/********************************************* - * SLIDES - *********************************************/ - -.reveal { - position: relative; - width: 100%; - height: 100%; - overflow: hidden; - touch-action: pinch-zoom; -} - -// Swiping on an embedded deck should not block page scrolling -.reveal.embedded { - touch-action: pan-y; -} - -.reveal .slides { - position: absolute; - width: 100%; - height: 100%; - top: 0; - right: 0; - bottom: 0; - left: 0; - margin: auto; - pointer-events: none; - - overflow: visible; - z-index: 1; - text-align: center; - perspective: 600px; - perspective-origin: 50% 40%; -} - -.reveal .slides>section { - perspective: 600px; -} - -.reveal .slides>section, -.reveal .slides>section>section { - display: none; - position: absolute; - width: 100%; - pointer-events: auto; - - z-index: 10; - transform-style: flat; - transition: transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), - transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), - visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), - opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); -} - -/* Global transition speed settings */ -.reveal[data-transition-speed="fast"] .slides section { - transition-duration: 400ms; -} -.reveal[data-transition-speed="slow"] .slides section { - transition-duration: 1200ms; -} - -/* Slide-specific transition speed overrides */ -.reveal .slides section[data-transition-speed="fast"] { - transition-duration: 400ms; -} -.reveal .slides section[data-transition-speed="slow"] { - transition-duration: 1200ms; -} - -.reveal .slides>section.stack { - padding-top: 0; - padding-bottom: 0; - pointer-events: none; - height: 100%; -} - -.reveal .slides>section.present, -.reveal .slides>section>section.present { - display: block; - z-index: 11; - opacity: 1; -} - -.reveal .slides>section:empty, -.reveal .slides>section>section:empty, -.reveal .slides>section[data-background-interactive], -.reveal .slides>section>section[data-background-interactive] { - pointer-events: none; -} - -.reveal.center, -.reveal.center .slides, -.reveal.center .slides section { - min-height: 0 !important; -} - -/* Don't allow interaction with invisible slides */ -.reveal .slides>section:not(.present), -.reveal .slides>section>section:not(.present) { - pointer-events: none; -} - -.reveal.overview .slides>section, -.reveal.overview .slides>section>section { - pointer-events: auto; -} - -.reveal .slides>section.past, -.reveal .slides>section.future, -.reveal .slides>section.past>section, -.reveal .slides>section.future>section, -.reveal .slides>section>section.past, -.reveal .slides>section>section.future { - opacity: 0; -} - - -/********************************************* - * Mixins for readability of transitions - *********************************************/ - -@mixin transition-global($style) { - .reveal .slides section[data-transition=#{$style}], - .reveal.#{$style} .slides section:not([data-transition]) { - @content; - } -} -@mixin transition-stack($style) { - .reveal .slides section[data-transition=#{$style}].stack, - .reveal.#{$style} .slides section.stack { - @content; - } -} -@mixin transition-horizontal-past($style) { - .reveal .slides>section[data-transition=#{$style}].past, - .reveal .slides>section[data-transition~=#{$style}-out].past, - .reveal.#{$style} .slides>section:not([data-transition]).past { - @content; - } -} -@mixin transition-horizontal-future($style) { - .reveal .slides>section[data-transition=#{$style}].future, - .reveal .slides>section[data-transition~=#{$style}-in].future, - .reveal.#{$style} .slides>section:not([data-transition]).future { - @content; - } -} - -@mixin transition-vertical-past($style) { - .reveal .slides>section>section[data-transition=#{$style}].past, - .reveal .slides>section>section[data-transition~=#{$style}-out].past, - .reveal.#{$style} .slides>section>section:not([data-transition]).past { - @content; - } -} -@mixin transition-vertical-future($style) { - .reveal .slides>section>section[data-transition=#{$style}].future, - .reveal .slides>section>section[data-transition~=#{$style}-in].future, - .reveal.#{$style} .slides>section>section:not([data-transition]).future { - @content; - } -} - -/********************************************* - * SLIDE TRANSITION - * Aliased 'linear' for backwards compatibility - *********************************************/ - -@each $stylename in slide, linear { - @include transition-horizontal-past(#{$stylename}) { - transform: translate(-150%, 0); - } - @include transition-horizontal-future(#{$stylename}) { - transform: translate(150%, 0); - } - @include transition-vertical-past(#{$stylename}) { - transform: translate(0, -150%); - } - @include transition-vertical-future(#{$stylename}) { - transform: translate(0, 150%); - } -} - -/********************************************* - * CONVEX TRANSITION - * Aliased 'default' for backwards compatibility - *********************************************/ - -@each $stylename in default, convex { - @include transition-stack(#{$stylename}) { - transform-style: preserve-3d; - } - - @include transition-horizontal-past(#{$stylename}) { - transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); - } - @include transition-horizontal-future(#{$stylename}) { - transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); - } - @include transition-vertical-past(#{$stylename}) { - transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); - } - @include transition-vertical-future(#{$stylename}) { - transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); - } -} - -/********************************************* - * CONCAVE TRANSITION - *********************************************/ - -@include transition-stack(concave) { - transform-style: preserve-3d; -} - -@include transition-horizontal-past(concave) { - transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); -} -@include transition-horizontal-future(concave) { - transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); -} -@include transition-vertical-past(concave) { - transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); -} -@include transition-vertical-future(concave) { - transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); -} - - -/********************************************* - * ZOOM TRANSITION - *********************************************/ - -@include transition-global(zoom) { - transition-timing-function: ease; -} -@include transition-horizontal-past(zoom) { - visibility: hidden; - transform: scale(16); -} -@include transition-horizontal-future(zoom) { - visibility: hidden; - transform: scale(0.2); -} -@include transition-vertical-past(zoom) { - transform: scale(16); -} -@include transition-vertical-future(zoom) { - transform: scale(0.2); -} - - -/********************************************* - * CUBE TRANSITION - * - * WARNING: - * this is deprecated and will be removed in a - * future version. - *********************************************/ - -.reveal.cube .slides { - perspective: 1300px; -} - -.reveal.cube .slides section { - padding: 30px; - min-height: 700px; - backface-visibility: hidden; - box-sizing: border-box; - transform-style: preserve-3d; -} - .reveal.center.cube .slides section { - min-height: 0; - } - .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,0.1); - border-radius: 4px; - transform: translateZ( -20px ); - } - .reveal.cube .slides section:not(.stack):after { - content: ''; - position: absolute; - display: block; - width: 90%; - height: 30px; - left: 5%; - bottom: 0; - background: none; - z-index: 1; - - border-radius: 4px; - box-shadow: 0px 95px 25px rgba(0,0,0,0.2); - transform: translateZ(-90px) rotateX( 65deg ); - } - -.reveal.cube .slides>section.stack { - padding: 0; - background: none; -} - -.reveal.cube .slides>section.past { - transform-origin: 100% 0%; - transform: translate3d(-100%, 0, 0) rotateY(-90deg); -} - -.reveal.cube .slides>section.future { - transform-origin: 0% 0%; - transform: translate3d(100%, 0, 0) rotateY(90deg); -} - -.reveal.cube .slides>section>section.past { - transform-origin: 0% 100%; - transform: translate3d(0, -100%, 0) rotateX(90deg); -} - -.reveal.cube .slides>section>section.future { - transform-origin: 0% 0%; - transform: translate3d(0, 100%, 0) rotateX(-90deg); -} - - -/********************************************* - * PAGE TRANSITION - * - * WARNING: - * this is deprecated and will be removed in a - * future version. - *********************************************/ - -.reveal.page .slides { - perspective-origin: 0% 50%; - perspective: 3000px; -} - -.reveal.page .slides section { - padding: 30px; - min-height: 700px; - box-sizing: border-box; - transform-style: preserve-3d; -} - .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,0.1); - transform: translateZ( -20px ); - } - .reveal.page .slides section:not(.stack):after { - content: ''; - position: absolute; - display: block; - width: 90%; - height: 30px; - left: 5%; - bottom: 0; - background: none; - z-index: 1; - - border-radius: 4px; - box-shadow: 0px 95px 25px rgba(0,0,0,0.2); - - -webkit-transform: translateZ(-90px) rotateX( 65deg ); - } - -.reveal.page .slides>section.stack { - padding: 0; - background: none; -} - -.reveal.page .slides>section.past { - transform-origin: 0% 0%; - transform: translate3d(-40%, 0, 0) rotateY(-80deg); -} - -.reveal.page .slides>section.future { - transform-origin: 100% 0%; - transform: translate3d(0, 0, 0); -} - -.reveal.page .slides>section>section.past { - transform-origin: 0% 0%; - transform: translate3d(0, -40%, 0) rotateX(80deg); -} - -.reveal.page .slides>section>section.future { - transform-origin: 0% 100%; - transform: translate3d(0, 0, 0); -} - - -/********************************************* - * FADE TRANSITION - *********************************************/ - -.reveal .slides section[data-transition=fade], -.reveal.fade .slides section:not([data-transition]), -.reveal.fade .slides>section>section:not([data-transition]) { - transform: none; - transition: opacity 0.5s; -} - - -.reveal.fade.overview .slides section, -.reveal.fade.overview .slides>section>section { - transition: none; -} - - -/********************************************* - * NO TRANSITION - *********************************************/ - -@include transition-global(none) { - transform: none; - transition: none; -} - - -/********************************************* - * PAUSED MODE - *********************************************/ - -.reveal .pause-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: black; - visibility: hidden; - opacity: 0; - z-index: 100; - transition: all 1s ease; -} - -.reveal .pause-overlay .resume-button { - position: absolute; - bottom: 20px; - right: 20px; - color: #ccc; - border-radius: 2px; - padding: 6px 14px; - border: 2px solid #ccc; - font-size: 16px; - background: transparent; - cursor: pointer; - - &:hover { - color: #fff; - border-color: #fff; - } -} - -.reveal.paused .pause-overlay { - visibility: visible; - opacity: 1; -} - - -/********************************************* - * FALLBACK - *********************************************/ - -.reveal .no-transition, -.reveal .no-transition *, -.reveal .slides.disable-slide-transitions section { - transition: none !important; -} - -.reveal .slides.disable-slide-transitions section { - transform: none !important; -} - - -/********************************************* - * PER-SLIDE BACKGROUNDS - *********************************************/ - -.reveal .backgrounds { - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - perspective: 600px; -} - .reveal .slide-background { - display: none; - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - visibility: hidden; - overflow: hidden; - - background-color: rgba( 0, 0, 0, 0 ); - - transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - } - - .reveal .slide-background-content { - position: absolute; - width: 100%; - height: 100%; - - background-position: 50% 50%; - background-repeat: no-repeat; - background-size: cover; - } - - .reveal .slide-background.stack { - display: block; - } - - .reveal .slide-background.present { - opacity: 1; - visibility: visible; - z-index: 2; - } - - .print-pdf .reveal .slide-background { - opacity: 1 !important; - visibility: visible !important; - } - -/* Video backgrounds */ -.reveal .slide-background video { - position: absolute; - width: 100%; - height: 100%; - max-width: none; - max-height: none; - top: 0; - left: 0; - object-fit: cover; -} - .reveal .slide-background[data-background-size="contain"] video { - object-fit: contain; - } - -/* Immediate transition style */ -.reveal[data-background-transition=none]>.backgrounds .slide-background:not([data-background-transition]), -.reveal>.backgrounds .slide-background[data-background-transition=none] { - transition: none; -} - -/* Slide */ -.reveal[data-background-transition=slide]>.backgrounds .slide-background:not([data-background-transition]), -.reveal>.backgrounds .slide-background[data-background-transition=slide] { - opacity: 1; -} - .reveal[data-background-transition=slide]>.backgrounds .slide-background.past:not([data-background-transition]), - .reveal>.backgrounds .slide-background.past[data-background-transition=slide] { - transform: translate(-100%, 0); - } - .reveal[data-background-transition=slide]>.backgrounds .slide-background.future:not([data-background-transition]), - .reveal>.backgrounds .slide-background.future[data-background-transition=slide] { - transform: translate(100%, 0); - } - - .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]), - .reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide] { - transform: translate(0, -100%); - } - .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]), - .reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide] { - transform: translate(0, 100%); - } - - -/* Convex */ -.reveal[data-background-transition=convex]>.backgrounds .slide-background.past:not([data-background-transition]), -.reveal>.backgrounds .slide-background.past[data-background-transition=convex] { - opacity: 0; - transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); -} -.reveal[data-background-transition=convex]>.backgrounds .slide-background.future:not([data-background-transition]), -.reveal>.backgrounds .slide-background.future[data-background-transition=convex] { - opacity: 0; - transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); -} - -.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]), -.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex] { - opacity: 0; - transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); -} -.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]), -.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex] { - opacity: 0; - transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); -} - - -/* Concave */ -.reveal[data-background-transition=concave]>.backgrounds .slide-background.past:not([data-background-transition]), -.reveal>.backgrounds .slide-background.past[data-background-transition=concave] { - opacity: 0; - transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); -} -.reveal[data-background-transition=concave]>.backgrounds .slide-background.future:not([data-background-transition]), -.reveal>.backgrounds .slide-background.future[data-background-transition=concave] { - opacity: 0; - transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); -} - -.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]), -.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave] { - opacity: 0; - transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); -} -.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]), -.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave] { - opacity: 0; - transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); -} - -/* Zoom */ -.reveal[data-background-transition=zoom]>.backgrounds .slide-background:not([data-background-transition]), -.reveal>.backgrounds .slide-background[data-background-transition=zoom] { - transition-timing-function: ease; -} - -.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past:not([data-background-transition]), -.reveal>.backgrounds .slide-background.past[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - transform: scale(16); -} -.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future:not([data-background-transition]), -.reveal>.backgrounds .slide-background.future[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - transform: scale(0.2); -} - -.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]), -.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - transform: scale(16); -} -.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]), -.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - transform: scale(0.2); -} - - -/* Global transition speed settings */ -.reveal[data-transition-speed="fast"]>.backgrounds .slide-background { - transition-duration: 400ms; -} -.reveal[data-transition-speed="slow"]>.backgrounds .slide-background { - transition-duration: 1200ms; -} - - -/********************************************* - * AUTO ANIMATE - *********************************************/ - -.reveal [data-auto-animate-target^="unmatched"] { - will-change: opacity; -} - -.reveal section[data-auto-animate]:not(.stack):not([data-auto-animate="running"]) [data-auto-animate-target^="unmatched"] { - opacity: 0; -} - - -/********************************************* - * OVERVIEW - *********************************************/ - -.reveal.overview { - perspective-origin: 50% 50%; - perspective: 700px; - - .slides { - // Fixes overview rendering errors in FF48+, not applied to - // other browsers since it degrades performance - -moz-transform-style: preserve-3d; - } - - .slides section { - height: 100%; - top: 0 !important; - opacity: 1 !important; - overflow: hidden; - visibility: visible !important; - cursor: pointer; - box-sizing: border-box; - } - .slides section:hover, - .slides section.present { - outline: 10px solid rgba(150,150,150,0.4); - outline-offset: 10px; - } - .slides section .fragment { - opacity: 1; - transition: none; - } - .slides section:after, - .slides section:before { - display: none !important; - } - .slides>section.stack { - padding: 0; - top: 0 !important; - background: none; - outline: none; - overflow: visible; - } - - .backgrounds { - perspective: inherit; - - // Fixes overview rendering errors in FF48+, not applied to - // other browsers since it degrades performance - -moz-transform-style: preserve-3d; - } - - .backgrounds .slide-background { - opacity: 1; - visibility: visible; - - // This can't be applied to the slide itself in Safari - outline: 10px solid rgba(150,150,150,0.1); - outline-offset: 10px; - } - - .backgrounds .slide-background.stack { - overflow: visible; - } -} - -// Disable transitions transitions while we're activating -// or deactivating the overview mode. -.reveal.overview .slides section, -.reveal.overview-deactivating .slides section { - transition: none; -} - -.reveal.overview .backgrounds .slide-background, -.reveal.overview-deactivating .backgrounds .slide-background { - transition: none; -} - - -/********************************************* - * RTL SUPPORT - *********************************************/ - -.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 { - transform-origin: 100% 0; -} - -/********************************************* - * PARALLAX BACKGROUND - *********************************************/ - -.reveal.has-parallax-background .backgrounds { - transition: all 0.8s ease; -} - -/* Global transition speed settings */ -.reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds { - transition-duration: 400ms; -} -.reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds { - transition-duration: 1200ms; -} - - -/********************************************* - * OVERLAY FOR LINK PREVIEWS AND HELP - *********************************************/ - -$overlayHeaderHeight: 40px; -$overlayHeaderPadding: 5px; - -.reveal > .overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 1000; - background: rgba( 0, 0, 0, 0.9 ); - transition: all 0.3s ease; -} - - .reveal > .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: 0.6; - transition: all 0.3s ease; - } - - .reveal > .overlay header { - position: absolute; - left: 0; - top: 0; - width: 100%; - padding: $overlayHeaderPadding; - z-index: 2; - box-sizing: border-box; - } - .reveal > .overlay header a { - display: inline-block; - width: $overlayHeaderHeight; - height: $overlayHeaderHeight; - line-height: 36px; - padding: 0 10px; - float: right; - opacity: 0.6; - - box-sizing: border-box; - } - .reveal > .overlay header a:hover { - opacity: 1; - } - .reveal > .overlay header a .icon { - display: inline-block; - width: 20px; - height: 20px; - - background-position: 50% 50%; - background-size: 100%; - background-repeat: no-repeat; - } - .reveal > .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 > .overlay header a.external .icon { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); - } - - .reveal > .overlay .viewport { - position: absolute; - display: flex; - top: $overlayHeaderHeight + $overlayHeaderPadding*2; - right: 0; - bottom: 0; - left: 0; - } - - .reveal > .overlay.overlay-preview .viewport iframe { - width: 100%; - height: 100%; - max-width: 100%; - max-height: 100%; - border: 0; - - opacity: 0; - visibility: hidden; - transition: all 0.3s ease; - } - - .reveal > .overlay.overlay-preview.loaded .viewport iframe { - opacity: 1; - visibility: visible; - } - - .reveal > .overlay.overlay-preview.loaded .viewport-inner { - position: absolute; - z-index: -1; - left: 0; - top: 45%; - width: 100%; - text-align: center; - letter-spacing: normal; - } - .reveal > .overlay.overlay-preview .x-frame-error { - opacity: 0; - transition: opacity 0.3s ease 0.3s; - } - .reveal > .overlay.overlay-preview.loaded .x-frame-error { - opacity: 1; - } - - .reveal > .overlay.overlay-preview.loaded .spinner { - opacity: 0; - visibility: hidden; - transform: scale(0.2); - } - - .reveal > .overlay.overlay-help .viewport { - overflow: auto; - color: #fff; - } - - .reveal > .overlay.overlay-help .viewport .viewport-inner { - width: 600px; - margin: auto; - padding: 20px 20px 80px 20px; - text-align: center; - letter-spacing: normal; - } - - .reveal > .overlay.overlay-help .viewport .viewport-inner .title { - font-size: 20px; - } - - .reveal > .overlay.overlay-help .viewport .viewport-inner table { - border: 1px solid #fff; - border-collapse: collapse; - font-size: 16px; - } - - .reveal > .overlay.overlay-help .viewport .viewport-inner table th, - .reveal > .overlay.overlay-help .viewport .viewport-inner table td { - width: 200px; - padding: 14px; - border: 1px solid #fff; - vertical-align: middle; - } - - .reveal > .overlay.overlay-help .viewport .viewport-inner table th { - padding-top: 20px; - padding-bottom: 20px; - } - - -/********************************************* - * PLAYBACK COMPONENT - *********************************************/ - -.reveal .playback { - position: absolute; - left: 15px; - bottom: 20px; - z-index: 30; - cursor: pointer; - transition: all 400ms ease; - -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 ); -} - -.reveal.overview .playback { - opacity: 0; - visibility: hidden; -} - - -/********************************************* - * CODE HIGHLGIHTING - *********************************************/ - -.reveal .hljs { - min-height: 100%; -} - -.reveal .hljs table { - margin: initial; -} - -.reveal .hljs-ln-code, -.reveal .hljs-ln-numbers { - padding: 0; - border: 0; -} - -.reveal .hljs-ln-numbers { - opacity: 0.6; - padding-right: 0.75em; - text-align: right; - vertical-align: top; -} - -.reveal .hljs.has-highlights tr:not(.highlight-line) { - opacity: 0.4; -} - -.reveal .hljs.has-highlights.fragment { - transition: all .2s ease; -} - -.reveal .hljs:not(:first-child).fragment { - position: absolute; - top: 0; - left: 0; - width: 100%; - box-sizing: border-box; -} - -.reveal pre[data-auto-animate-target] { - overflow: hidden; -} -.reveal pre[data-auto-animate-target] code { - height: 100%; -} - - -/********************************************* - * ROLLING LINKS - *********************************************/ - -.reveal .roll { - display: inline-block; - line-height: 1.2; - overflow: hidden; - - vertical-align: top; - perspective: 400px; - perspective-origin: 50% 50%; -} - .reveal .roll:hover { - background: none; - text-shadow: none; - } -.reveal .roll span { - display: block; - position: relative; - padding: 0 2px; - - pointer-events: none; - transition: all 400ms ease; - transform-origin: 50% 0%; - transform-style: preserve-3d; - backface-visibility: hidden; -} - .reveal .roll:hover span { - background: rgba(0,0,0,0.5); - transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg ); - } -.reveal .roll span:after { - content: attr(data-title); - - display: block; - position: absolute; - left: 0; - top: 0; - padding: 0 2px; - backface-visibility: hidden; - transform-origin: 50% 0%; - transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg ); -} - - -/********************************************* - * SPEAKER NOTES - *********************************************/ - -$notesWidthPercent: 25%; - -// Hide on-page notes -.reveal aside.notes { - display: none; -} - -// An interface element that can optionally be used to show the -// speaker notes to all viewers, on top of the presentation -.reveal .speaker-notes { - display: none; - position: absolute; - width: math.div($notesWidthPercent, (1 - math.div($notesWidthPercent,100))) * 1%; - height: 100%; - top: 0; - left: 100%; - padding: 14px 18px 14px 18px; - z-index: 1; - font-size: 18px; - line-height: 1.4; - border: 1px solid rgba( 0, 0, 0, 0.05 ); - color: #222; - background-color: #f5f5f5; - overflow: auto; - box-sizing: border-box; - text-align: left; - font-family: Helvetica, sans-serif; - -webkit-overflow-scrolling: touch; - - .notes-placeholder { - color: #ccc; - font-style: italic; - } - - &:focus { - outline: none; - } - - &:before { - content: 'Speaker notes'; - display: block; - margin-bottom: 10px; - opacity: 0.5; - } -} - - -.reveal.show-notes { - max-width: 100% - $notesWidthPercent; - overflow: visible; -} - -.reveal.show-notes .speaker-notes { - display: block; -} - -@media screen and (min-width: 1600px) { - .reveal .speaker-notes { - font-size: 20px; - } -} - -@media screen and (max-width: 1024px) { - .reveal.show-notes { - border-left: 0; - max-width: none; - max-height: 70%; - max-height: 70vh; - overflow: visible; - } - - .reveal.show-notes .speaker-notes { - top: 100%; - left: 0; - width: 100%; - height: 30vh; - border: 0; - } -} - -@media screen and (max-width: 600px) { - .reveal.show-notes { - max-height: 60%; - max-height: 60vh; - } - - .reveal.show-notes .speaker-notes { - top: 100%; - height: 40vh; - } - - .reveal .speaker-notes { - font-size: 14px; - } -} - - -/********************************************* - * JUMP-TO-SLIDE COMPONENT - *********************************************/ - - .reveal .jump-to-slide { - position: absolute; - top: 15px; - left: 15px; - z-index: 30; - font-size: 32px; - -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 ); -} - -.reveal .jump-to-slide-input { - background: transparent; - padding: 8px; - font-size: inherit; - color: currentColor; - border: 0; -} -.reveal .jump-to-slide-input::placeholder { - color: currentColor; - opacity: 0.5; -} - -.reveal.has-dark-background .jump-to-slide-input { - color: #fff; -} -.reveal.has-light-background .jump-to-slide-input { - color: #222; -} - -.reveal .jump-to-slide-input:focus { - outline: none; -} - - -/********************************************* - * ZOOM PLUGIN - *********************************************/ - -.zoomed .reveal *, -.zoomed .reveal *:before, -.zoomed .reveal *:after { - backface-visibility: visible !important; -} - -.zoomed .reveal .progress, -.zoomed .reveal .controls { - opacity: 0; -} - -.zoomed .reveal .roll span { - background: none; -} - -.zoomed .reveal .roll span:after { - visibility: hidden; -} - - -/********************************************* - * SCROLL VIEW - *********************************************/ -.reveal-viewport.loading-scroll-mode { - visibility: hidden; -} - -.reveal-viewport.reveal-scroll { - & { - margin: 0 auto; - overflow: auto; - overflow-x: hidden; - overflow-y: auto; - z-index: 1; - - --r-scrollbar-width: 7px; - --r-scrollbar-trigger-size: 5px; - --r-controls-spacing: 8px; - } - - @media screen and (max-width: 500px) { - --r-scrollbar-width: 3px; - --r-scrollbar-trigger-size: 3px; - } - - .controls, - .progress, - .playback, - .backgrounds, - .slide-number, - .speaker-notes { - display: none !important; - } - - .reveal { - overflow: visible; - touch-action: manipulation; - } - - .slides { - position: static; - pointer-events: initial; - - left: auto; - top: auto; - width: 100% !important; - margin: 0; - padding: 0; - - overflow: visible; - display: block; - - perspective: none; - perspective-origin: 50% 50%; - } - - .scroll-page { - position: relative; - width: 100%; - height: calc(var(--page-height) + var(--page-scroll-padding)); - z-index: 1; - overflow: visible; - } - - .scroll-page-sticky { - position: sticky; - height: var(--page-height); - top: 0px; - } - - .scroll-page-content { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - } - - .scroll-page section { - visibility: visible !important; - display: block !important; - position: absolute !important; - width: var(--slide-width) !important; - height: var(--slide-height) !important; - top: 50% !important; - left: 50% !important; - opacity: 1 !important; - transform: scale(var(--slide-scale)) translate(-50%, -50%) !important; - transform-style: flat !important; - transform-origin: 0 0 !important; - } - - .slide-background { - display: block !important; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: auto !important; - visibility: visible; - opacity: 1; - touch-action: manipulation; - } -} - -// Chromium -.reveal-viewport.reveal-scroll[data-scrollbar="true"]::-webkit-scrollbar, -.reveal-viewport.reveal-scroll[data-scrollbar="auto"]::-webkit-scrollbar { - display: none; -} - -// Firefox -.reveal-viewport.reveal-scroll[data-scrollbar="true"], -.reveal-viewport.reveal-scroll[data-scrollbar="auto"] { - scrollbar-width: none; -} - -.reveal.has-dark-background, -.reveal-viewport.has-dark-background { - --r-overlay-element-bg-color: 240, 240, 240; - --r-overlay-element-fg-color: 0, 0, 0; -} -.reveal.has-light-background, -.reveal-viewport.has-light-background { - --r-overlay-element-bg-color: 0, 0, 0; - --r-overlay-element-fg-color: 240, 240, 240; -} - -.reveal-viewport.reveal-scroll .scrollbar { - position: sticky; - top: 50%; - z-index: 20; - opacity: 0; - transition: all 0.3s ease; - - &.visible, - &:hover { - opacity: 1; - } - - .scrollbar-inner { - position: absolute; - width: var(--r-scrollbar-width); - height: calc(var(--viewport-height) - var(--r-controls-spacing) * 2); - right: var(--r-controls-spacing); - top: 0; - transform: translateY(-50%); - border-radius: var(--r-scrollbar-width); - z-index: 10; - } - - .scrollbar-playhead { - position: absolute; - width: var(--r-scrollbar-width); - height: var(--r-scrollbar-width); - top: 0; - left: 0; - border-radius: var(--r-scrollbar-width); - background-color: rgba(var(--r-overlay-element-bg-color), 1); - z-index: 11; - transition: background-color 0.2s ease; - } - - .scrollbar-slide { - position: absolute; - width: 100%; - background-color: rgba(var(--r-overlay-element-bg-color), 0.2); - box-shadow: 0 0 0px 1px rgba(var(--r-overlay-element-fg-color), 0.1); - border-radius: var(--r-scrollbar-width); - transition: background-color 0.2s ease; - } - - // Hit area - .scrollbar-slide:after { - content: ''; - position: absolute; - width: 200%; - height: 100%; - top: 0; - left: -50%; - background: rgba( 0, 0, 0, 0 ); - z-index: -1; - } - - .scrollbar-slide:hover, - .scrollbar-slide.active { - background-color: rgba(var(--r-overlay-element-bg-color), 0.4); - } - - .scrollbar-trigger { - position: absolute; - width: 100%; - transition: background-color 0.2s ease; - } - - .scrollbar-slide.active.has-triggers { - background-color: rgba(var(--r-overlay-element-bg-color), 0.4); - z-index: 10; - } - - .scrollbar-slide.active .scrollbar-trigger:after { - content: ''; - position: absolute; - width: var(--r-scrollbar-trigger-size); - height: var(--r-scrollbar-trigger-size); - border-radius: 20px; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background-color: rgba(var(--r-overlay-element-bg-color), 1); - transition: transform 0.2s ease, opacity 0.2s ease; - opacity: 0.4; - } - - .scrollbar-slide.active .scrollbar-trigger.active:after, - .scrollbar-slide.active .scrollbar-trigger.active ~ .scrollbar-trigger:after { - opacity: 1; - } - - .scrollbar-slide.active .scrollbar-trigger ~ .scrollbar-trigger.active:after { - transform: translate(calc( var(--r-scrollbar-width) * -2), 0); - background-color: rgba(var(--r-overlay-element-bg-color), 1); - } -} - - -/********************************************* - * PRINT STYLES - *********************************************/ - -@import 'print/pdf.scss'; -@import 'print/paper.scss'; - diff --git a/reveal.js/css/theme/README.md b/reveal.js/css/theme/README.md deleted file mode 100644 index 30916c4..0000000 --- a/reveal.js/css/theme/README.md +++ /dev/null @@ -1,21 +0,0 @@ -## Dependencies - -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 installed before proceeding: https://revealjs.com/installation/#full-setup - -## Creating a Theme - -To create your own theme, start by duplicating a ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled from Sass to CSS (see the [gulpfile](https://github.com/hakimel/reveal.js/blob/master/gulpfile.js)) when you run `npm run build -- css-themes`. - -Each theme file does four things in the following order: - -1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)** -Shared utility functions. - -2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)** -Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3. - -3. **Override** -This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding any selectors and styles you please. - -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. diff --git a/reveal.js/css/theme/source/beige.scss b/reveal.js/css/theme/source/beige.scss deleted file mode 100644 index 7598b94..0000000 --- a/reveal.js/css/theme/source/beige.scss +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Beige theme for reveal.js. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(./fonts/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); - - -// Override theme settings (see ../template/settings.scss) -$mainColor: #333; -$headingColor: #333; -$headingTextShadow: none; -$backgroundColor: #f7f3de; -$linkColor: #8b743d; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: rgba(79, 64, 28, 0.99); -$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); - -$overlayElementBgColor: 0, 0, 0; -$overlayElementFgColor: 240, 240, 240; - -// Background generator -@mixin bodyBackground() { - @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) ); -} - -// Change text colors against dark slide backgrounds -@include dark-bg-text-color(#fff); - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/reveal.js/css/theme/source/black-contrast.scss b/reveal.js/css/theme/source/black-contrast.scss deleted file mode 100644 index 9e1a2ca..0000000 --- a/reveal.js/css/theme/source/black-contrast.scss +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Black compact & high contrast reveal.js theme, with headers not in capitals. - * - * By Peter Kehl. Based on black.(s)css by Hakim El Hattab, http://hakim.se - * - * - Keep the source similar to black.css - for easy comparison. - * - $mainFontSize controls code blocks, too (although under some ratio). - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - -// Include theme-specific fonts -@import url(./fonts/source-sans-pro/source-sans-pro.css); - - -// Override theme settings (see ../template/settings.scss) -$backgroundColor: #000000; - -$mainColor: #fff; -$headingColor: #fff; - -$mainFontSize: 42px; -$mainFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingTextShadow: none; -$headingLetterSpacing: normal; -$headingTextTransform: uppercase; -$headingFontWeight: 600; -$linkColor: #42affa; -$linkColorHover: lighten( $linkColor, 15% ); -$selectionBackgroundColor: lighten( $linkColor, 25% ); - -$heading1Size: 2.5em; -$heading2Size: 1.6em; -$heading3Size: 1.3em; -$heading4Size: 1.0em; - -// Change text colors against light slide backgrounds -@include light-bg-text-color(#000); - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/reveal.js/css/theme/source/black.scss b/reveal.js/css/theme/source/black.scss deleted file mode 100644 index 7c655c4..0000000 --- a/reveal.js/css/theme/source/black.scss +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Black theme for reveal.js. This is the opposite of the 'white' theme. - * - * By Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - -// Include theme-specific fonts -@import url(./fonts/source-sans-pro/source-sans-pro.css); - - -// Override theme settings (see ../template/settings.scss) -$backgroundColor: #191919; - -$mainColor: #fff; -$headingColor: #fff; - -$mainFontSize: 42px; -$mainFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingTextShadow: none; -$headingLetterSpacing: normal; -$headingTextTransform: uppercase; -$headingFontWeight: 600; -$linkColor: #42affa; -$linkColorHover: lighten( $linkColor, 15% ); -$selectionBackgroundColor: rgba( $linkColor, 0.75 ); - -$heading1Size: 2.5em; -$heading2Size: 1.6em; -$heading3Size: 1.3em; -$heading4Size: 1.0em; - -// Change text colors against light slide backgrounds -@include light-bg-text-color(#222); - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/reveal.js/css/theme/source/blood.scss b/reveal.js/css/theme/source/blood.scss deleted file mode 100644 index b5a8679..0000000 --- a/reveal.js/css/theme/source/blood.scss +++ /dev/null @@ -1,87 +0,0 @@ -/** - * 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; - -$backgroundColor: $coal; - -// Main text -$mainFont: Ubuntu, 'sans-serif'; -$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; - -// Change text colors against dark slide backgrounds -@include light-bg-text-color(#222); - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- - -// some overrides after theme template import - -.reveal p { - font-weight: 300; - text-shadow: 1px 1px $coal; -} - -section.has-light-background { - p, h1, h2, h3, h4 { - text-shadow: none; - } -} - -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - font-weight: 700; -} - -.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/reveal.js/css/theme/source/dracula.scss b/reveal.js/css/theme/source/dracula.scss deleted file mode 100644 index ae968b8..0000000 --- a/reveal.js/css/theme/source/dracula.scss +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Dracula Dark theme for reveal.js. - * Based on https://draculatheme.com - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -$systemFontsSansSerif: -apple-system, - BlinkMacSystemFont, - avenir next, - avenir, - segoe ui, - helvetica neue, - helvetica, - Cantarell, - Ubuntu, - roboto, - noto, - arial, - sans-serif; -$systemFontsMono: Menlo, - Consolas, - Monaco, - Liberation Mono, - Lucida Console, - monospace; - -/** - * Dracula colors by Zeno Rocha - * https://draculatheme.com/contribute - */ -html * { - color-profile: sRGB; - rendering-intent: auto; -} - -$background: #282A36; -$foreground: #F8F8F2; -$selection: #44475A; -$comment: #6272A4; -$red: #FF5555; -$orange: #FFB86C; -$yellow: #F1FA8C; -$green: #50FA7B; -$purple: #BD93F9; -$cyan: #8BE9FD; -$pink: #FF79C6; - - - -// Override theme settings (see ../template/settings.scss) -$mainColor: $foreground; -$headingColor: $purple; -$headingTextShadow: none; -$headingTextTransform: none; -$backgroundColor: $background; -$linkColor: $pink; -$linkColorHover: $cyan; -$selectionBackgroundColor: $selection; -$inlineCodeColor: $green; -$listBulletColor: $cyan; - -$mainFont: $systemFontsSansSerif; -$codeFont: "Fira Code", $systemFontsMono; - -// Change text colors against light slide backgrounds -@include light-bg-text-color($background); - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- - -// Define additional color effects based on Dracula spec -// https://spec.draculatheme.com/ -:root { - --r-bold-color: #{$orange}; - --r-italic-color: #{$yellow}; - --r-inline-code-color: #{$inlineCodeColor}; - --r-list-bullet-color: #{$listBulletColor}; -} - -.reveal { - strong, b { - color: var(--r-bold-color); - } - em, i, blockquote { - color: var(--r-italic-color); - } - code { - color: var(--r-inline-code-color); - } - // Dracula colored list bullets and numbers - ul, ol { - li::marker { - color: var(--r-list-bullet-color); - } - } -} - diff --git a/reveal.js/css/theme/source/league.scss b/reveal.js/css/theme/source/league.scss deleted file mode 100644 index ee01258..0000000 --- a/reveal.js/css/theme/source/league.scss +++ /dev/null @@ -1,36 +0,0 @@ -/** - * League theme for reveal.js. - * - * This was the default theme pre-3.0.0. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(./fonts/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); - -// Override theme settings (see ../template/settings.scss) -$headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2); -$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); - -// Background generator -@mixin bodyBackground() { - @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) ); -} - -// Change text colors against light slide backgrounds -@include light-bg-text-color(#222); - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/reveal.js/css/theme/source/moon.scss b/reveal.js/css/theme/source/moon.scss deleted file mode 100644 index 59ef0a9..0000000 --- a/reveal.js/css/theme/source/moon.scss +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Solarized Dark theme for reveal.js. - * Author: Achim Staebler - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(./fonts/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); - -/** - * Solarized colors by Ethan Schoonover - */ - -// Solarized colors -$base03: #002b36; -$base02: #073642; -$base01: #586e75; -$base00: #657b83; -$base0: #839496; -$base1: #93a1a1; -$base2: #eee8d5; -$base3: #fdf6e3; -$yellow: #b58900; -$orange: #cb4b16; -$red: #dc322f; -$magenta: #d33682; -$violet: #6c71c4; -$blue: #268bd2; -$cyan: #2aa198; -$green: #859900; - -// Override theme settings (see ../template/settings.scss) -$mainColor: $base1; -$headingColor: $base2; -$headingTextShadow: none; -$backgroundColor: $base03; -$linkColor: $blue; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: $magenta; - -// Change text colors against light slide backgrounds -@include light-bg-text-color(#222); - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/reveal.js/css/theme/source/night.scss b/reveal.js/css/theme/source/night.scss deleted file mode 100644 index 98a2062..0000000 --- a/reveal.js/css/theme/source/night.scss +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Black theme for reveal.js. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - -// Include theme-specific fonts -@import url(https://fonts.googleapis.com/css?family=Montserrat:700); -@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); - - -// Override theme settings (see ../template/settings.scss) -$backgroundColor: #111; - -$mainFont: 'Open Sans', sans-serif; -$linkColor: #e7ad52; -$linkColorHover: lighten( $linkColor, 20% ); -$headingFont: 'Montserrat', Impact, sans-serif; -$headingTextShadow: none; -$headingLetterSpacing: -0.03em; -$headingTextTransform: none; -$selectionBackgroundColor: #e7ad52; - -// Change text colors against light slide backgrounds -@include light-bg-text-color(#222); - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- \ No newline at end of file diff --git a/reveal.js/css/theme/source/serif.scss b/reveal.js/css/theme/source/serif.scss deleted file mode 100644 index babec4d..0000000 --- a/reveal.js/css/theme/source/serif.scss +++ /dev/null @@ -1,41 +0,0 @@ -/** - * A simple theme for reveal.js presentations, similar - * to the default theme. The accent color is brown. - * - * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Override theme settings (see ../template/settings.scss) -$mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; -$mainColor: #000; -$headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; -$headingColor: #383D3D; -$headingTextShadow: none; -$headingTextTransform: none; -$backgroundColor: #F0F1EB; -$linkColor: #51483D; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: #26351C; - -$overlayElementBgColor: 0, 0, 0; -$overlayElementFgColor: 240, 240, 240; - -.reveal a { - line-height: 1.3em; -} - -// Change text colors against dark slide backgrounds -@include dark-bg-text-color(#fff); - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/reveal.js/css/theme/source/simple.scss b/reveal.js/css/theme/source/simple.scss deleted file mode 100644 index 51a21af..0000000 --- a/reveal.js/css/theme/source/simple.scss +++ /dev/null @@ -1,43 +0,0 @@ -/** - * A simple theme for reveal.js presentations, similar - * to the default theme. The accent color is darkblue. - * - * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. - * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); - - -// Override theme settings (see ../template/settings.scss) -$mainFont: 'Lato', sans-serif; -$mainColor: #000; -$headingFont: 'News Cycle', Impact, sans-serif; -$headingColor: #000; -$headingTextShadow: none; -$headingTextTransform: none; -$backgroundColor: #fff; -$linkColor: #00008B; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: rgba(0, 0, 0, 0.99); - -$overlayElementBgColor: 0, 0, 0; -$overlayElementFgColor: 240, 240, 240; - -// Change text colors against dark slide backgrounds -@include dark-bg-text-color(#fff); - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- \ No newline at end of file diff --git a/reveal.js/css/theme/source/sky.scss b/reveal.js/css/theme/source/sky.scss deleted file mode 100644 index 457e9e5..0000000 --- a/reveal.js/css/theme/source/sky.scss +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Sky theme for reveal.js. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); -@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); - - -// Override theme settings (see ../template/settings.scss) -$mainFont: 'Open Sans', sans-serif; -$mainColor: #333; -$headingFont: 'Quicksand', sans-serif; -$headingColor: #333; -$headingLetterSpacing: -0.08em; -$headingTextShadow: none; -$backgroundColor: #f7fbfc; -$linkColor: #3b759e; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: #134674; - -$overlayElementBgColor: 0, 0, 0; -$overlayElementFgColor: 240, 240, 240; - -// Fix links so they are not cut off -.reveal a { - line-height: 1.3em; -} - -// Background generator -@mixin bodyBackground() { - @include radial-gradient( #add9e4, #f7fbfc ); -} - -// Change text colors against dark slide backgrounds -@include dark-bg-text-color(#fff); - - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/reveal.js/css/theme/source/solarized.scss b/reveal.js/css/theme/source/solarized.scss deleted file mode 100644 index f325345..0000000 --- a/reveal.js/css/theme/source/solarized.scss +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Solarized Light theme for reveal.js. - * Author: Achim Staebler - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(./fonts/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); - - -/** - * Solarized colors by Ethan Schoonover - */ -html * { - color-profile: sRGB; - rendering-intent: auto; -} - -// Solarized colors -$base03: #002b36; -$base02: #073642; -$base01: #586e75; -$base00: #657b83; -$base0: #839496; -$base1: #93a1a1; -$base2: #eee8d5; -$base3: #fdf6e3; -$yellow: #b58900; -$orange: #cb4b16; -$red: #dc322f; -$magenta: #d33682; -$violet: #6c71c4; -$blue: #268bd2; -$cyan: #2aa198; -$green: #859900; - -// Override theme settings (see ../template/settings.scss) -$mainColor: $base00; -$headingColor: $base01; -$headingTextShadow: none; -$backgroundColor: $base3; -$linkColor: $blue; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: $magenta; - -$overlayElementBgColor: 0, 0, 0; -$overlayElementFgColor: 240, 240, 240; - -// Background generator -// @mixin bodyBackground() { -// @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) ); -// } - - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/reveal.js/css/theme/source/white-contrast.scss b/reveal.js/css/theme/source/white-contrast.scss deleted file mode 100644 index e22007e..0000000 --- a/reveal.js/css/theme/source/white-contrast.scss +++ /dev/null @@ -1,52 +0,0 @@ -/** - * White compact & high contrast reveal.js theme, with headers not in capitals. - * - * By Peter Kehl. Based on white.(s)css by Hakim El Hattab, http://hakim.se - * - * - Keep the source similar to black.css - for easy comparison. - * - $mainFontSize controls code blocks, too (although under some ratio). - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - -// Include theme-specific fonts -@import url(./fonts/source-sans-pro/source-sans-pro.css); - - -// Override theme settings (see ../template/settings.scss) -$backgroundColor: #fff; - -$mainColor: #000; -$headingColor: #000; - -$mainFontSize: 42px; -$mainFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingTextShadow: none; -$headingLetterSpacing: normal; -$headingTextTransform: uppercase; -$headingFontWeight: 600; -$linkColor: #2a76dd; -$linkColorHover: lighten( $linkColor, 15% ); -$selectionBackgroundColor: lighten( $linkColor, 25% ); - -$heading1Size: 2.5em; -$heading2Size: 1.6em; -$heading3Size: 1.3em; -$heading4Size: 1.0em; - -$overlayElementBgColor: 0, 0, 0; -$overlayElementFgColor: 240, 240, 240; - -// Change text colors against dark slide backgrounds -@include dark-bg-text-color(#fff); - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/reveal.js/css/theme/source/white.scss b/reveal.js/css/theme/source/white.scss deleted file mode 100644 index a2b1292..0000000 --- a/reveal.js/css/theme/source/white.scss +++ /dev/null @@ -1,49 +0,0 @@ -/** - * White theme for reveal.js. This is the opposite of the 'black' theme. - * - * By Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - -// Include theme-specific fonts -@import url(./fonts/source-sans-pro/source-sans-pro.css); - - -// Override theme settings (see ../template/settings.scss) -$backgroundColor: #fff; - -$mainColor: #222; -$headingColor: #222; - -$mainFontSize: 42px; -$mainFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingTextShadow: none; -$headingLetterSpacing: normal; -$headingTextTransform: uppercase; -$headingFontWeight: 600; -$linkColor: #2a76dd; -$linkColorHover: lighten( $linkColor, 15% ); -$selectionBackgroundColor: lighten( $linkColor, 25% ); - -$heading1Size: 2.5em; -$heading2Size: 1.6em; -$heading3Size: 1.3em; -$heading4Size: 1.0em; - -$overlayElementBgColor: 0, 0, 0; -$overlayElementFgColor: 240, 240, 240; - -// Change text colors against dark slide backgrounds -@include dark-bg-text-color(#fff); - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/reveal.js/css/theme/template/exposer.scss b/reveal.js/css/theme/template/exposer.scss deleted file mode 100644 index 2e9288d..0000000 --- a/reveal.js/css/theme/template/exposer.scss +++ /dev/null @@ -1,30 +0,0 @@ -// Exposes theme's variables for easy re-use in CSS for plugin authors - -:root { - --r-background-color: #{$backgroundColor}; - --r-main-font: #{$mainFont}; - --r-main-font-size: #{$mainFontSize}; - --r-main-color: #{$mainColor}; - --r-block-margin: #{$blockMargin}; - --r-heading-margin: #{$headingMargin}; - --r-heading-font: #{$headingFont}; - --r-heading-color: #{$headingColor}; - --r-heading-line-height: #{$headingLineHeight}; - --r-heading-letter-spacing: #{$headingLetterSpacing}; - --r-heading-text-transform: #{$headingTextTransform}; - --r-heading-text-shadow: #{$headingTextShadow}; - --r-heading-font-weight: #{$headingFontWeight}; - --r-heading1-text-shadow: #{$heading1TextShadow}; - --r-heading1-size: #{$heading1Size}; - --r-heading2-size: #{$heading2Size}; - --r-heading3-size: #{$heading3Size}; - --r-heading4-size: #{$heading4Size}; - --r-code-font: #{$codeFont}; - --r-link-color: #{$linkColor}; - --r-link-color-dark: #{darken($linkColor , 15% )}; - --r-link-color-hover: #{$linkColorHover}; - --r-selection-background-color: #{$selectionBackgroundColor}; - --r-selection-color: #{$selectionColor}; - --r-overlay-element-bg-color: #{$overlayElementBgColor}; - --r-overlay-element-fg-color: #{$overlayElementFgColor}; -} diff --git a/reveal.js/css/theme/template/mixins.scss b/reveal.js/css/theme/template/mixins.scss deleted file mode 100644 index 17a3db5..0000000 --- a/reveal.js/css/theme/template/mixins.scss +++ /dev/null @@ -1,45 +0,0 @@ -@mixin vertical-gradient( $top, $bottom ) { - background: $top; - background: -moz-linear-gradient( top, $top 0%, $bottom 100% ); - background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) ); - background: -webkit-linear-gradient( top, $top 0%, $bottom 100% ); - background: -o-linear-gradient( top, $top 0%, $bottom 100% ); - background: -ms-linear-gradient( top, $top 0%, $bottom 100% ); - background: linear-gradient( top, $top 0%, $bottom 100% ); -} - -@mixin horizontal-gradient( $top, $bottom ) { - background: $top; - background: -moz-linear-gradient( left, $top 0%, $bottom 100% ); - background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) ); - background: -webkit-linear-gradient( left, $top 0%, $bottom 100% ); - background: -o-linear-gradient( left, $top 0%, $bottom 100% ); - background: -ms-linear-gradient( left, $top 0%, $bottom 100% ); - background: linear-gradient( left, $top 0%, $bottom 100% ); -} - -@mixin radial-gradient( $outer, $inner, $type: circle ) { - background: $outer; - background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); - background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) ); - background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); - background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); - background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); - background: radial-gradient( center, $type cover, $inner 0%, $outer 100% ); -} - -@mixin light-bg-text-color( $color ) { - section.has-light-background { - &, h1, h2, h3, h4, h5, h6 { - color: $color; - } - } -} - -@mixin dark-bg-text-color( $color ) { - section.has-dark-background { - &, h1, h2, h3, h4, h5, h6 { - color: $color; - } - } -} \ No newline at end of file diff --git a/reveal.js/css/theme/template/settings.scss b/reveal.js/css/theme/template/settings.scss deleted file mode 100644 index 3d54ac8..0000000 --- a/reveal.js/css/theme/template/settings.scss +++ /dev/null @@ -1,50 +0,0 @@ -// Base settings for all themes that can optionally be -// overridden by the super-theme - -// Background of the presentation -$backgroundColor: #2b2b2b; - -// Primary/body text -$mainFont: 'Lato', sans-serif; -$mainFontSize: 40px; -$mainColor: #eee; - -// Vertical spacing between blocks of text -$blockMargin: 20px; - -// Headings -$headingMargin: 0 0 $blockMargin 0; -$headingFont: 'League Gothic', Impact, sans-serif; -$headingColor: #eee; -$headingLineHeight: 1.2; -$headingLetterSpacing: normal; -$headingTextTransform: uppercase; -$headingTextShadow: none; -$headingFontWeight: normal; -$heading1TextShadow: $headingTextShadow; - -$heading1Size: 3.77em; -$heading2Size: 2.11em; -$heading3Size: 1.55em; -$heading4Size: 1.00em; - -$codeFont: monospace; - -// Links and actions -$linkColor: #13DAEC; -$linkColorHover: lighten( $linkColor, 20% ); - -// Text selection -$selectionBackgroundColor: #FF5E99; -$selectionColor: #fff; - -// Colors used for UI elements that are overlaid on top of -// the presentation -$overlayElementBgColor: 240, 240, 240; -$overlayElementFgColor: 0, 0, 0; - -// Generates the presentation background, can be overridden -// to return a background image or gradient -@mixin bodyBackground() { - background: $backgroundColor; -} diff --git a/reveal.js/css/theme/template/theme.scss b/reveal.js/css/theme/template/theme.scss deleted file mode 100644 index bc377d3..0000000 --- a/reveal.js/css/theme/template/theme.scss +++ /dev/null @@ -1,331 +0,0 @@ -// Base theme template for reveal.js - -/********************************************* - * GLOBAL STYLES - *********************************************/ - -@import "./exposer"; - -.reveal-viewport { - @include bodyBackground(); - background-color: var(--r-background-color); -} - -.reveal { - font-family: var(--r-main-font); - font-size: var(--r-main-font-size); - font-weight: normal; - color: var(--r-main-color); -} - -.reveal ::selection { - color: var(--r-selection-color); - background: var(--r-selection-background-color); - text-shadow: none; -} - -.reveal ::-moz-selection { - color: var(--r-selection-color); - background: var(--r-selection-background-color); - text-shadow: none; -} - -.reveal .slides section, -.reveal .slides section>section { - line-height: 1.3; - font-weight: inherit; -} - -/********************************************* - * HEADERS - *********************************************/ - -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: var(--r-heading-margin); - color: var(--r-heading-color); - - font-family: var(--r-heading-font); - font-weight: var(--r-heading-font-weight); - line-height: var(--r-heading-line-height); - letter-spacing: var(--r-heading-letter-spacing); - - text-transform: var(--r-heading-text-transform); - text-shadow: var(--r-heading-text-shadow); - - word-wrap: break-word; -} - -.reveal h1 {font-size: var(--r-heading1-size); } -.reveal h2 {font-size: var(--r-heading2-size); } -.reveal h3 {font-size: var(--r-heading3-size); } -.reveal h4 {font-size: var(--r-heading4-size); } - -.reveal h1 { - text-shadow: var(--r-heading1-text-shadow); -} - - -/********************************************* - * OTHER - *********************************************/ - -.reveal p { - margin: var(--r-block-margin) 0; - line-height: 1.3; -} - -/* Remove trailing margins after titles */ -.reveal h1:last-child, -.reveal h2:last-child, -.reveal h3:last-child, -.reveal h4:last-child, -.reveal h5:last-child, -.reveal h6:last-child { - margin-bottom: 0; -} - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; -} -.reveal strong, -.reveal b { - font-weight: bold; -} - -.reveal em { - font-style: italic; -} - -.reveal ol, -.reveal dl, -.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 dt { - font-weight: bold; -} - -.reveal dd { - margin-left: 40px; -} - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: var(--r-block-margin) auto; - padding: 5px; - - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0,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: var(--r-block-margin) auto; - - text-align: left; - font-size: 0.55em; - font-family: var(--r-code-font); - line-height: 1.2em; - - word-wrap: break-word; - - box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); -} - -.reveal code { - font-family: var(--r-code-font); - text-transform: none; - tab-size: 2; -} - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; -} - -.reveal .code-wrapper { - white-space: normal; -} - -.reveal .code-wrapper code { - white-space: pre; -} - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; -} - -.reveal table th { - font-weight: bold; -} - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; -} - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; -} - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; -} - -.reveal table tbody tr:last-child th, -.reveal table tbody tr:last-child td { - border-bottom: none; -} - -.reveal sup { - vertical-align: super; - font-size: smaller; -} -.reveal sub { - vertical-align: sub; - font-size: smaller; -} - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; -} - -.reveal small * { - vertical-align: top; -} - -.reveal img { - margin: var(--r-block-margin) 0; -} - - -/********************************************* - * LINKS - *********************************************/ - -.reveal a { - color: var(--r-link-color); - text-decoration: none; - transition: color .15s ease; -} - .reveal a:hover { - color: var(--r-link-color-hover); - text-shadow: none; - border: none; - } - -.reveal .roll span:after { - color: #fff; - // background: darken( var(--r-link-color), 15% ); - background: var(--r-link-color-dark); - -} - - -/********************************************* - * Frame helper - *********************************************/ - -.reveal .r-frame { - border: 4px solid var(--r-main-color); - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); -} - -.reveal a .r-frame { - transition: all .15s linear; -} - -.reveal a:hover .r-frame { - border-color: var(--r-link-color); - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); -} - - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ - -.reveal .controls { - color: var(--r-link-color); -} - - -/********************************************* - * PROGRESS BAR - *********************************************/ - -.reveal .progress { - background: rgba(0,0,0,0.2); - color: var(--r-link-color); -} - -/********************************************* - * PRINT BACKGROUND - *********************************************/ - @media print { - .backgrounds { - background-color: var(--r-background-color); - } -} diff --git a/reveal.js/demo.html b/reveal.js/demo.html deleted file mode 100644 index 5a8ba36..0000000 --- a/reveal.js/demo.html +++ /dev/null @@ -1,481 +0,0 @@ - - - - - - - reveal.js – The HTML Presentation Framework - - - - - - - - - - - - - - - - - - - -
- - -
-
- - - -

The HTML Presentation Framework

-

- Created by Hakim El Hattab and contributors -

-
- -
-

Hello There

-

- reveal.js enables you to create beautiful interactive slide decks using HTML. This presentation will show you examples of what it can do. -

-
- - -
-
-

Vertical Slides

-

Slides can be nested inside of each other.

-

Use the Space key to navigate through all slides.

-
- - Down arrow - -
-
-

Basement Level 1

-

Nested slides are useful for adding additional detail underneath a high level horizontal slide.

-
-
-

Basement Level 2

-

That's it, time to go back up.

-
- - Up arrow - -
-
- -
-

Slides

-

- Not a coder? Not a problem. There's a fully-featured visual editor for authoring these, try it out at https://slides.com. -

-
- -
-

Hidden Slides

-

- This slide is visible in the source, but hidden when the presentation is viewed. You can show all hidden slides by setting the `showHiddenSlides` config option to `true`. -

-
- -
-

Pretty Code

-

-						import React, { useState } from 'react';
-
-						function Example() {
-						  const [count, setCount] = useState(0);
-
-						  return (
-						    ...
-						  );
-						}
-					
-

Code syntax highlighting courtesy of highlight.js.

-
- -
-

With Animations

-
-
- -
-

Point of View

-

- Press ESC to enter the slide overview. -

-

- Hold down the alt key (ctrl in Linux) and click on any element to zoom towards it using zoom.js. Click again to zoom back out. -

-

- (NOTE: Use ctrl + click in Linux.) -

-
- -
-

Auto-Animate

-

Automatically animate matching elements across slides with Auto-Animate.

-
-
-
-
-
-
-
-
-
-
-
-
-

Auto-Animate

-
-
-
-
-
-
-
-

Auto-Animate

-
- -
-

Touch Optimized

-

- Presentations look great on touch devices, like mobile phones and tablets. Simply swipe through your slides. -

-
- -
- -
- -
-

Add the r-fit-text class to auto-size text

-

FIT TEXT

-
- -
-
-

Fragments

-

Hit the next arrow...

-

... to step through ...

-

... a fragmented slide.

- - -
-
-

Fragment Styles

-

There's different types of fragments, like:

-

grow

-

shrink

-

fade-out

-

- fade-right, - up, - down, - left -

-

fade-in-then-out

-

fade-in-then-semi-out

-

Highlight red blue green

-
-
- -
-

Transition Styles

-

- You can select from different transitions, like:
- None - - Fade - - Slide - - Convex - - Concave - - Zoom -

-
- -
-

Themes

-

- reveal.js comes with a few themes built in:
- - Black (default) - - White - - League - - Sky - - Beige - - Simple
- Serif - - Blood - - Night - - Moon - - Solarized -

-
- -
-
-

Slide Backgrounds

-

- Set data-background="#dddddd" on a slide to change the background color. All CSS color formats are supported. -

- - Down arrow - -
-
-

Gradient Backgrounds

-
<section data-background-gradient=
-							"linear-gradient(to bottom, #ddd, #191919)">
-
-
-

Image Backgrounds

-
<section data-background="image.png">
-
-
-

Tiled Backgrounds

-
<section data-background="image.png" data-background-repeat="repeat" data-background-size="100px">
-
-
-
-

Video Backgrounds

-
<section data-background-video="video.mp4,video.webm">
-
-
-
-

... and GIFs!

-
-
- -
-

Background Transitions

-

- Different background transitions are available via the backgroundTransition option. This one's called "zoom". -

-
Reveal.configure({ backgroundTransition: 'zoom' })
-
- -
-

Background Transitions

-

- You can override background transitions per-slide. -

-
<section data-background-transition="zoom">
-
- -
-
-

Iframe Backgrounds

-

Since reveal.js runs on the web, you can easily embed other web content. Try interacting with the page in the background.

-
-
- -
-

Marvelous List

-
    -
  • No order here
  • -
  • Or here
  • -
  • Or here
  • -
  • Or here
  • -
-
- -
-

Fantastic Ordered List

-
    -
  1. One is smaller than...
  2. -
  3. Two is smaller than...
  4. -
  5. Three!
  6. -
-
- -
-

Tabular Tables

- - - - - - - - - - - - - - - - - - - - - - - - - -
ItemValueQuantity
Apples$17
Lemonade$218
Bread$32
-
- -
-

Clever Quotes

-

- These guys come in two forms, inline: The nice thing about standards is that there are so many to choose from and block: -

-
- “For years there has been a theory that millions of monkeys typing at random on millions of typewriters would - reproduce the entire works of Shakespeare. The Internet has proven this theory to be untrue.” -
-
- -
-

Intergalactic Interconnections

-

- You can link between slides internally, - like this. -

-
- -
-

Speaker View

-

There's a speaker view. It includes a timer, preview of the upcoming slide as well as your speaker notes.

-

Press the S key to try it out.

- - -
- -
-

Export to PDF

-

Presentations can be exported to PDF, here's an example:

- -
- -
-

Global State

-

- Set data-state="something" on a slide and "something" - will be added as a class to the document element when the slide is open. This lets you - apply broader style changes, like switching the page background. -

-
- -
-

State Events

-

- Additionally custom events can be triggered on a per slide basis by binding to the data-state name. -

-

-Reveal.on( 'customevent', function() {
-	console.log( '"customevent" has fired' );
-} );
-					
-
- -
-

Take a Moment

-

- Press B or . on your keyboard to pause the presentation. This is helpful when you're on stage and want to take distracting slides off the screen. -

-
- -
-

Much more

- -
- -
-

THE END

-

- - Try the online editor
- - Source code & documentation -

-
- -
- -
- - - - - - - - - - - diff --git a/reveal.js/dist/reset.css b/reveal.js/dist/reset.css deleted file mode 100644 index e238539..0000000 --- a/reveal.js/dist/reset.css +++ /dev/null @@ -1,30 +0,0 @@ -/* http://meyerweb.com/eric/tools/css/reset/ - v4.0 | 20180602 - License: none (public domain) -*/ - -html, body, div, span, applet, object, iframe, -h1, h2, h3, h4, h5, h6, p, blockquote, pre, -a, abbr, acronym, address, big, cite, code, -del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, -b, u, i, center, -dl, dt, dd, ol, ul, li, -fieldset, form, label, legend, -table, caption, tbody, tfoot, thead, tr, th, td, -article, aside, canvas, details, embed, -figure, figcaption, footer, header, hgroup, -main, menu, nav, output, ruby, section, summary, -time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, -footer, header, hgroup, main, menu, nav, section { - display: block; -} \ No newline at end of file diff --git a/reveal.js/dist/reveal.css b/reveal.js/dist/reveal.css deleted file mode 100644 index c71898a..0000000 --- a/reveal.js/dist/reveal.css +++ /dev/null @@ -1,8 +0,0 @@ -/*! -* reveal.js 5.0.3 -* https://revealjs.com -* MIT licensed -* -* Copyright (C) 2011-2023 Hakim El Hattab, https://hakim.se -*/ -.reveal .r-stretch,.reveal .stretch{max-width:none;max-height:none}.reveal pre.r-stretch code,.reveal pre.stretch code{height:100%;max-height:100%;box-sizing:border-box}.reveal .r-fit-text{display:inline-block;white-space:nowrap}.reveal .r-stack{display:grid}.reveal .r-stack>*{grid-area:1/1;margin:auto}.reveal .r-hstack,.reveal .r-vstack{display:flex}.reveal .r-hstack img,.reveal .r-hstack video,.reveal .r-vstack img,.reveal .r-vstack video{min-width:0;min-height:0;object-fit:contain}.reveal .r-vstack{flex-direction:column;align-items:center;justify-content:center}.reveal .r-hstack{flex-direction:row;align-items:center;justify-content:center}.reveal .items-stretch{align-items:stretch}.reveal .items-start{align-items:flex-start}.reveal .items-center{align-items:center}.reveal .items-end{align-items:flex-end}.reveal .justify-between{justify-content:space-between}.reveal .justify-around{justify-content:space-around}.reveal .justify-start{justify-content:flex-start}.reveal .justify-center{justify-content:center}.reveal .justify-end{justify-content:flex-end}html.reveal-full-page{width:100%;height:100%;height:100vh;height:calc(var(--vh,1vh) * 100);height:100svh;overflow:hidden}.reveal-viewport{height:100%;overflow:hidden;position:relative;line-height:1;margin:0;background-color:#fff;color:#000;--r-controls-spacing:12px}.reveal-viewport:fullscreen{top:0!important;left:0!important;width:100%!important;height:100%!important;transform:none!important}.reveal .fragment{transition:all .2s ease}.reveal .fragment:not(.custom){opacity:0;visibility:hidden;will-change:opacity}.reveal .fragment.visible{opacity:1;visibility:inherit}.reveal .fragment.disabled{transition:none}.reveal .fragment.grow{opacity:1;visibility:inherit}.reveal .fragment.grow.visible{transform:scale(1.3)}.reveal .fragment.shrink{opacity:1;visibility:inherit}.reveal .fragment.shrink.visible{transform:scale(.7)}.reveal .fragment.zoom-in{transform:scale(.1)}.reveal .fragment.zoom-in.visible{transform:none}.reveal .fragment.fade-out{opacity:1;visibility:inherit}.reveal .fragment.fade-out.visible{opacity:0;visibility:hidden}.reveal .fragment.semi-fade-out{opacity:1;visibility:inherit}.reveal .fragment.semi-fade-out.visible{opacity:.5;visibility:inherit}.reveal .fragment.strike{opacity:1;visibility:inherit}.reveal .fragment.strike.visible{text-decoration:line-through}.reveal .fragment.fade-up{transform:translate(0,40px)}.reveal .fragment.fade-up.visible{transform:translate(0,0)}.reveal .fragment.fade-down{transform:translate(0,-40px)}.reveal .fragment.fade-down.visible{transform:translate(0,0)}.reveal .fragment.fade-right{transform:translate(-40px,0)}.reveal .fragment.fade-right.visible{transform:translate(0,0)}.reveal .fragment.fade-left{transform:translate(40px,0)}.reveal .fragment.fade-left.visible{transform:translate(0,0)}.reveal .fragment.current-visible,.reveal .fragment.fade-in-then-out{opacity:0;visibility:hidden}.reveal .fragment.current-visible.current-fragment,.reveal .fragment.fade-in-then-out.current-fragment{opacity:1;visibility:inherit}.reveal .fragment.fade-in-then-semi-out{opacity:0;visibility:hidden}.reveal .fragment.fade-in-then-semi-out.visible{opacity:.5;visibility:inherit}.reveal .fragment.fade-in-then-semi-out.current-fragment{opacity:1;visibility:inherit}.reveal .fragment.highlight-blue,.reveal .fragment.highlight-current-blue,.reveal .fragment.highlight-current-green,.reveal .fragment.highlight-current-red,.reveal .fragment.highlight-green,.reveal .fragment.highlight-red{opacity:1;visibility:inherit}.reveal .fragment.highlight-red.visible{color:#ff2c2d}.reveal .fragment.highlight-green.visible{color:#17ff2e}.reveal .fragment.highlight-blue.visible{color:#1b91ff}.reveal .fragment.highlight-current-red.current-fragment{color:#ff2c2d}.reveal .fragment.highlight-current-green.current-fragment{color:#17ff2e}.reveal .fragment.highlight-current-blue.current-fragment{color:#1b91ff}.reveal:after{content:"";font-style:italic}.reveal iframe{z-index:1}.reveal a{position:relative}@keyframes bounce-right{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(10px)}30%{transform:translateX(-5px)}}@keyframes bounce-left{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(-10px)}30%{transform:translateX(5px)}}@keyframes bounce-down{0%,10%,25%,40%,50%{transform:translateY(0)}20%{transform:translateY(10px)}30%{transform:translateY(-5px)}}.reveal .controls{display:none;position:absolute;top:auto;bottom:var(--r-controls-spacing);right:var(--r-controls-spacing);left:auto;z-index:11;color:#000;pointer-events:none;font-size:10px}.reveal .controls button{position:absolute;padding:0;background-color:transparent;border:0;outline:0;cursor:pointer;color:currentColor;transform:scale(.9999);transition:color .2s ease,opacity .2s ease,transform .2s ease;z-index:2;pointer-events:auto;font-size:inherit;visibility:hidden;opacity:0;-webkit-appearance:none;-webkit-tap-highlight-color:transparent}.reveal .controls .controls-arrow:after,.reveal .controls .controls-arrow:before{content:"";position:absolute;top:0;left:0;width:2.6em;height:.5em;border-radius:.25em;background-color:currentColor;transition:all .15s ease,background-color .8s ease;transform-origin:.2em 50%;will-change:transform}.reveal .controls .controls-arrow{position:relative;width:3.6em;height:3.6em}.reveal .controls .controls-arrow:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal .controls .controls-arrow:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}.reveal .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(40deg)}.reveal .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-40deg)}.reveal .controls .controls-arrow:active:before{transform:translateX(.5em) translateY(1.55em) rotate(36deg)}.reveal .controls .controls-arrow:active:after{transform:translateX(.5em) translateY(1.55em) rotate(-36deg)}.reveal .controls .navigate-left{right:6.4em;bottom:3.2em;transform:translateX(-10px)}.reveal .controls .navigate-left.highlight{animation:bounce-left 2s 50 both ease-out}.reveal .controls .navigate-right{right:0;bottom:3.2em;transform:translateX(10px)}.reveal .controls .navigate-right .controls-arrow{transform:rotate(180deg)}.reveal .controls .navigate-right.highlight{animation:bounce-right 2s 50 both ease-out}.reveal .controls .navigate-up{right:3.2em;bottom:6.4em;transform:translateY(-10px)}.reveal .controls .navigate-up .controls-arrow{transform:rotate(90deg)}.reveal .controls .navigate-down{right:3.2em;bottom:-1.4em;padding-bottom:1.4em;transform:translateY(10px)}.reveal .controls .navigate-down .controls-arrow{transform:rotate(-90deg)}.reveal .controls .navigate-down.highlight{animation:bounce-down 2s 50 both ease-out}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled{opacity:.3}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled:hover{opacity:1}.reveal .controls[data-controls-back-arrows=hidden] .navigate-up.enabled{opacity:0;visibility:hidden}.reveal .controls .enabled{visibility:visible;opacity:.9;cursor:pointer;transform:none}.reveal .controls .enabled.fragmented{opacity:.5}.reveal .controls .enabled.fragmented:hover,.reveal .controls .enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled{opacity:.3}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=hidden] .navigate-left.enabled{opacity:0;visibility:hidden}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled{opacity:.3}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled:hover{opacity:1}.reveal.rtl .controls[data-controls-back-arrows=hidden] .navigate-right.enabled{opacity:0;visibility:hidden}.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-down,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-up{display:none}.reveal:not(.has-vertical-slides) .controls .navigate-left,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-left{bottom:1.4em;right:5.5em}.reveal:not(.has-vertical-slides) .controls .navigate-right,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-right{bottom:1.4em;right:.5em}.reveal:not(.has-horizontal-slides) .controls .navigate-up{right:1.4em;bottom:5em}.reveal:not(.has-horizontal-slides) .controls .navigate-down{right:1.4em;bottom:.5em}.reveal.has-dark-background .controls{color:#fff}.reveal.has-light-background .controls{color:#000}.reveal.no-hover .controls .controls-arrow:active:before,.reveal.no-hover .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal.no-hover .controls .controls-arrow:active:after,.reveal.no-hover .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}@media screen and (min-width:500px){.reveal-viewport{--r-controls-spacing:0.8em}.reveal .controls[data-controls-layout=edges]{top:0;right:0;bottom:0;left:0}.reveal .controls[data-controls-layout=edges] .navigate-down,.reveal .controls[data-controls-layout=edges] .navigate-left,.reveal .controls[data-controls-layout=edges] .navigate-right,.reveal .controls[data-controls-layout=edges] .navigate-up{bottom:auto;right:auto}.reveal .controls[data-controls-layout=edges] .navigate-left{top:50%;left:var(--r-controls-spacing);margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-right{top:50%;right:var(--r-controls-spacing);margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-up{top:var(--r-controls-spacing);left:50%;margin-left:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-down{bottom:calc(var(--r-controls-spacing) - 1.4em + .3em);left:50%;margin-left:-1.8em}}.reveal .progress{position:absolute;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10;background-color:rgba(0,0,0,.2);color:#fff}.reveal .progress:after{content:"";display:block;position:absolute;height:10px;width:100%;top:-10px}.reveal .progress span{display:block;height:100%;width:100%;background-color:currentColor;transition:transform .8s cubic-bezier(.26,.86,.44,.985);transform-origin:0 0;transform:scaleX(0)}.reveal .slide-number{position:absolute;display:block;right:8px;bottom:8px;z-index:31;font-family:Helvetica,sans-serif;font-size:12px;line-height:1;color:#fff;background-color:rgba(0,0,0,.4);padding:5px}.reveal .slide-number a{color:currentColor}.reveal .slide-number-delimiter{margin:0 3px}.reveal{position:relative;width:100%;height:100%;overflow:hidden;touch-action:pinch-zoom}.reveal.embedded{touch-action:pan-y}.reveal .slides{position:absolute;width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin:auto;pointer-events:none;overflow:visible;z-index:1;text-align:center;perspective:600px;perspective-origin:50% 40%}.reveal .slides>section{perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;pointer-events:auto;z-index:10;transform-style:flat;transition:transform-origin .8s cubic-bezier(.26,.86,.44,.985),transform .8s cubic-bezier(.26,.86,.44,.985),visibility .8s cubic-bezier(.26,.86,.44,.985),opacity .8s cubic-bezier(.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{transition-duration:.4s}.reveal[data-transition-speed=slow] .slides section{transition-duration:1.2s}.reveal .slides section[data-transition-speed=fast]{transition-duration:.4s}.reveal .slides section[data-transition-speed=slow]{transition-duration:1.2s}.reveal .slides>section.stack{padding-top:0;padding-bottom:0;pointer-events:none;height:100%}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal .slides>section:empty,.reveal .slides>section>section:empty,.reveal .slides>section>section[data-background-interactive],.reveal .slides>section[data-background-interactive]{pointer-events:none}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:0!important}.reveal .slides>section:not(.present),.reveal .slides>section>section:not(.present){pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section.future,.reveal .slides>section.future>section,.reveal .slides>section.past,.reveal .slides>section.past>section,.reveal .slides>section>section.future,.reveal .slides>section>section.past{opacity:0}.reveal .slides>section[data-transition=slide].past,.reveal .slides>section[data-transition~=slide-out].past,.reveal.slide .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=slide].future,.reveal .slides>section[data-transition~=slide-in].future,.reveal.slide .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=slide].past,.reveal .slides>section>section[data-transition~=slide-out].past,.reveal.slide .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=slide].future,.reveal .slides>section>section[data-transition~=slide-in].future,.reveal.slide .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides>section[data-transition=linear].past,.reveal .slides>section[data-transition~=linear-out].past,.reveal.linear .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal .slides>section[data-transition~=linear-in].future,.reveal.linear .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal .slides>section>section[data-transition~=linear-out].past,.reveal.linear .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal .slides>section>section[data-transition~=linear-in].future,.reveal.linear .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides section[data-transition=default].stack,.reveal.default .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=default].past,.reveal .slides>section[data-transition~=default-out].past,.reveal.default .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section[data-transition~=default-in].future,.reveal.default .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section[data-transition~=default-out].past,.reveal.default .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section[data-transition~=default-in].future,.reveal.default .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=convex].stack,.reveal.convex .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=convex].past,.reveal .slides>section[data-transition~=convex-out].past,.reveal.convex .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=convex].future,.reveal .slides>section[data-transition~=convex-in].future,.reveal.convex .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=convex].past,.reveal .slides>section>section[data-transition~=convex-out].past,.reveal.convex .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=convex].future,.reveal .slides>section>section[data-transition~=convex-in].future,.reveal.convex .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=concave].stack,.reveal.concave .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=concave].past,.reveal .slides>section[data-transition~=concave-out].past,.reveal.concave .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal .slides>section[data-transition~=concave-in].future,.reveal.concave .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal .slides>section>section[data-transition~=concave-out].past,.reveal.concave .slides>section>section:not([data-transition]).past{transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal .slides>section>section[data-transition~=concave-in].future,.reveal.concave .slides>section>section:not([data-transition]).future{transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides section[data-transition=zoom],.reveal.zoom .slides section:not([data-transition]){transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal .slides>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section:not([data-transition]).past{visibility:hidden;transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal .slides>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section:not([data-transition]).future{visibility:hidden;transform:scale(.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal .slides>section>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section>section:not([data-transition]).past{transform:scale(16)}.reveal .slides>section>section[data-transition=zoom].future,.reveal .slides>section>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section>section:not([data-transition]).future{transform:scale(.2)}.reveal.cube .slides{perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;backface-visibility:hidden;box-sizing:border-box;transform-style:preserve-3d}.reveal.center.cube .slides section{min-height:0}.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;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 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0 0}.reveal.cube .slides>section.past{transform-origin:100% 0;transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{transform-origin:0 0;transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{transform-origin:0 100%;transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{transform-origin:0 0;transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{perspective-origin:0 50%;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;box-sizing:border-box;transform-style:preserve-3d}.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);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 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 0}.reveal.page .slides>section.past{transform-origin:0 0;transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{transform-origin:100% 0;transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{transform-origin:0 0;transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{transform-origin:0 100%;transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section:not([data-transition]),.reveal.fade .slides>section>section:not([data-transition]){transform:none;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section{transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section:not([data-transition]){transform:none;transition:none}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;transition:all 1s ease}.reveal .pause-overlay .resume-button{position:absolute;bottom:20px;right:20px;color:#ccc;border-radius:2px;padding:6px 14px;border:2px solid #ccc;font-size:16px;background:0 0;cursor:pointer}.reveal .pause-overlay .resume-button:hover{color:#fff;border-color:#fff}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.reveal .no-transition,.reveal .no-transition *,.reveal .slides.disable-slide-transitions section{transition:none!important}.reveal .slides.disable-slide-transitions section{transform:none!important}.reveal .backgrounds{position:absolute;width:100%;height:100%;top:0;left:0;perspective:600px}.reveal .slide-background{display:none;position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;overflow:hidden;background-color:rgba(0,0,0,0);transition:all .8s cubic-bezier(.26,.86,.44,.985)}.reveal .slide-background-content{position:absolute;width:100%;height:100%;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.reveal .slide-background.stack{display:block}.reveal .slide-background.present{opacity:1;visibility:visible;z-index:2}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal .slide-background video{position:absolute;width:100%;height:100%;max-width:none;max-height:none;top:0;left:0;object-fit:cover}.reveal .slide-background[data-background-size=contain] video{object-fit:contain}.reveal>.backgrounds .slide-background[data-background-transition=none],.reveal[data-background-transition=none]>.backgrounds .slide-background:not([data-background-transition]){transition:none}.reveal>.backgrounds .slide-background[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background:not([data-background-transition]){opacity:1}.reveal>.backgrounds .slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.past:not([data-background-transition]){transform:translate(-100%,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.future:not([data-background-transition]){transform:translate(100%,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){transform:translate(0,-100%)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){transform:translate(0,100%)}.reveal>.backgrounds .slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background:not([data-background-transition]){transition-timing-function:ease}.reveal>.backgrounds .slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(.2)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{transition-duration:.4s}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{transition-duration:1.2s}.reveal [data-auto-animate-target^=unmatched]{will-change:opacity}.reveal section[data-auto-animate]:not(.stack):not([data-auto-animate=running]) [data-auto-animate-target^=unmatched]{opacity:0}.reveal.overview{perspective-origin:50% 50%;perspective:700px}.reveal.overview .slides{-moz-transform-style:preserve-3d}.reveal.overview .slides section{height:100%;top:0!important;opacity:1!important;overflow:hidden;visibility:visible!important;cursor:pointer;box-sizing:border-box}.reveal.overview .slides section.present,.reveal.overview .slides section:hover{outline:10px solid rgba(150,150,150,.4);outline-offset:10px}.reveal.overview .slides section .fragment{opacity:1;transition:none}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0 0;outline:0;overflow:visible}.reveal.overview .backgrounds{perspective:inherit;-moz-transform-style:preserve-3d}.reveal.overview .backgrounds .slide-background{opacity:1;visibility:visible;outline:10px solid rgba(150,150,150,.1);outline-offset:10px}.reveal.overview .backgrounds .slide-background.stack{overflow:visible}.reveal.overview .slides section,.reveal.overview-deactivating .slides section{transition:none}.reveal.overview .backgrounds .slide-background,.reveal.overview-deactivating .backgrounds .slide-background{transition:none}.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 code,.reveal.rtl pre{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{transform-origin:100% 0}.reveal.has-parallax-background .backgrounds{transition:all .8s ease}.reveal.has-parallax-background[data-transition-speed=fast] .backgrounds{transition-duration:.4s}.reveal.has-parallax-background[data-transition-speed=slow] .backgrounds{transition-duration:1.2s}.reveal>.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);transition:all .3s ease}.reveal>.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;transition:all .3s ease}.reveal>.overlay header{position:absolute;left:0;top:0;width:100%;padding:5px;z-index:2;box-sizing:border-box}.reveal>.overlay header a{display:inline-block;width:40px;height:40px;line-height:36px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal>.overlay header a:hover{opacity:1}.reveal>.overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal>.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>.overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal>.overlay .viewport{position:absolute;display:flex;top:50px;right:0;bottom:0;left:0}.reveal>.overlay.overlay-preview .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;transition:all .3s ease}.reveal>.overlay.overlay-preview.loaded .viewport iframe{opacity:1;visibility:visible}.reveal>.overlay.overlay-preview.loaded .viewport-inner{position:absolute;z-index:-1;left:0;top:45%;width:100%;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-preview .x-frame-error{opacity:0;transition:opacity .3s ease .3s}.reveal>.overlay.overlay-preview.loaded .x-frame-error{opacity:1}.reveal>.overlay.overlay-preview.loaded .spinner{opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.overlay.overlay-help .viewport{overflow:auto;color:#fff}.reveal>.overlay.overlay-help .viewport .viewport-inner{width:600px;margin:auto;padding:20px 20px 80px 20px;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-help .viewport .viewport-inner .title{font-size:20px}.reveal>.overlay.overlay-help .viewport .viewport-inner table{border:1px solid #fff;border-collapse:collapse;font-size:16px}.reveal>.overlay.overlay-help .viewport .viewport-inner table td,.reveal>.overlay.overlay-help .viewport .viewport-inner table th{width:200px;padding:14px;border:1px solid #fff;vertical-align:middle}.reveal>.overlay.overlay-help .viewport .viewport-inner table th{padding-top:20px;padding-bottom:20px}.reveal .playback{position:absolute;left:15px;bottom:20px;z-index:30;cursor:pointer;transition:all .4s ease;-webkit-tap-highlight-color:transparent}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .hljs{min-height:100%}.reveal .hljs table{margin:initial}.reveal .hljs-ln-code,.reveal .hljs-ln-numbers{padding:0;border:0}.reveal .hljs-ln-numbers{opacity:.6;padding-right:.75em;text-align:right;vertical-align:top}.reveal .hljs.has-highlights tr:not(.highlight-line){opacity:.4}.reveal .hljs.has-highlights.fragment{transition:all .2s ease}.reveal .hljs:not(:first-child).fragment{position:absolute;top:0;left:0;width:100%;box-sizing:border-box}.reveal pre[data-auto-animate-target]{overflow:hidden}.reveal pre[data-auto-animate-target] code{height:100%}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;perspective:400px;perspective-origin:50% 50%}.reveal .roll:hover{background:0 0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;transition:all .4s ease;transform-origin:50% 0;transform-style:preserve-3d;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);transform:translate3d(0,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;backface-visibility:hidden;transform-origin:50% 0;transform:translate3d(0,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.reveal .speaker-notes{display:none;position:absolute;width:33.3333333333%;height:100%;top:0;left:100%;padding:14px 18px 14px 18px;z-index:1;font-size:18px;line-height:1.4;border:1px solid rgba(0,0,0,.05);color:#222;background-color:#f5f5f5;overflow:auto;box-sizing:border-box;text-align:left;font-family:Helvetica,sans-serif;-webkit-overflow-scrolling:touch}.reveal .speaker-notes .notes-placeholder{color:#ccc;font-style:italic}.reveal .speaker-notes:focus{outline:0}.reveal .speaker-notes:before{content:"Speaker notes";display:block;margin-bottom:10px;opacity:.5}.reveal.show-notes{max-width:75%;overflow:visible}.reveal.show-notes .speaker-notes{display:block}@media screen and (min-width:1600px){.reveal .speaker-notes{font-size:20px}}@media screen and (max-width:1024px){.reveal.show-notes{border-left:0;max-width:none;max-height:70%;max-height:70vh;overflow:visible}.reveal.show-notes .speaker-notes{top:100%;left:0;width:100%;height:30vh;border:0}}@media screen and (max-width:600px){.reveal.show-notes{max-height:60%;max-height:60vh}.reveal.show-notes .speaker-notes{top:100%;height:40vh}.reveal .speaker-notes{font-size:14px}}.reveal .jump-to-slide{position:absolute;top:15px;left:15px;z-index:30;font-size:32px;-webkit-tap-highlight-color:transparent}.reveal .jump-to-slide-input{background:0 0;padding:8px;font-size:inherit;color:currentColor;border:0}.reveal .jump-to-slide-input::placeholder{color:currentColor;opacity:.5}.reveal.has-dark-background .jump-to-slide-input{color:#fff}.reveal.has-light-background .jump-to-slide-input{color:#222}.reveal .jump-to-slide-input:focus{outline:0}.zoomed .reveal *,.zoomed .reveal :after,.zoomed .reveal :before{backface-visibility:visible!important}.zoomed .reveal .controls,.zoomed .reveal .progress{opacity:0}.zoomed .reveal .roll span{background:0 0}.zoomed .reveal .roll span:after{visibility:hidden}.reveal-viewport.loading-scroll-mode{visibility:hidden}.reveal-viewport.reveal-scroll{margin:0 auto;overflow:auto;overflow-x:hidden;overflow-y:auto;z-index:1;--r-scrollbar-width:7px;--r-scrollbar-trigger-size:5px;--r-controls-spacing:8px}@media screen and (max-width:500px){.reveal-viewport.reveal-scroll{--r-scrollbar-width:3px;--r-scrollbar-trigger-size:3px}}.reveal-viewport.reveal-scroll .backgrounds,.reveal-viewport.reveal-scroll .controls,.reveal-viewport.reveal-scroll .playback,.reveal-viewport.reveal-scroll .progress,.reveal-viewport.reveal-scroll .slide-number,.reveal-viewport.reveal-scroll .speaker-notes{display:none!important}.reveal-viewport.reveal-scroll .reveal{overflow:visible;touch-action:manipulation}.reveal-viewport.reveal-scroll .slides{position:static;pointer-events:initial;left:auto;top:auto;width:100%!important;margin:0;padding:0;overflow:visible;display:block;perspective:none;perspective-origin:50% 50%}.reveal-viewport.reveal-scroll .scroll-page{position:relative;width:100%;height:calc(var(--page-height) + var(--page-scroll-padding));z-index:1;overflow:visible}.reveal-viewport.reveal-scroll .scroll-page-sticky{position:sticky;height:var(--page-height);top:0}.reveal-viewport.reveal-scroll .scroll-page-content{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden}.reveal-viewport.reveal-scroll .scroll-page section{visibility:visible!important;display:block!important;position:absolute!important;width:var(--slide-width)!important;height:var(--slide-height)!important;top:50%!important;left:50%!important;opacity:1!important;transform:scale(var(--slide-scale)) translate(-50%,-50%)!important;transform-style:flat!important;transform-origin:0 0!important}.reveal-viewport.reveal-scroll .slide-background{display:block!important;position:absolute;top:0;left:0;width:100%;height:100%;z-index:auto!important;visibility:visible;opacity:1;touch-action:manipulation}.reveal-viewport.reveal-scroll[data-scrollbar=auto]::-webkit-scrollbar,.reveal-viewport.reveal-scroll[data-scrollbar=true]::-webkit-scrollbar{display:none}.reveal-viewport.reveal-scroll[data-scrollbar=auto],.reveal-viewport.reveal-scroll[data-scrollbar=true]{scrollbar-width:none}.reveal-viewport.has-dark-background,.reveal.has-dark-background{--r-overlay-element-bg-color:240,240,240;--r-overlay-element-fg-color:0,0,0}.reveal-viewport.has-light-background,.reveal.has-light-background{--r-overlay-element-bg-color:0,0,0;--r-overlay-element-fg-color:240,240,240}.reveal-viewport.reveal-scroll .scrollbar{position:sticky;top:50%;z-index:20;opacity:0;transition:all .3s ease}.reveal-viewport.reveal-scroll .scrollbar.visible,.reveal-viewport.reveal-scroll .scrollbar:hover{opacity:1}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-inner{position:absolute;width:var(--r-scrollbar-width);height:calc(var(--viewport-height) - var(--r-controls-spacing) * 2);right:var(--r-controls-spacing);top:0;transform:translateY(-50%);border-radius:var(--r-scrollbar-width);z-index:10}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-playhead{position:absolute;width:var(--r-scrollbar-width);height:var(--r-scrollbar-width);top:0;left:0;border-radius:var(--r-scrollbar-width);background-color:rgba(var(--r-overlay-element-bg-color),1);z-index:11;transition:background-color .2s ease}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide{position:absolute;width:100%;background-color:rgba(var(--r-overlay-element-bg-color),.2);box-shadow:0 0 0 1px rgba(var(--r-overlay-element-fg-color),.1);border-radius:var(--r-scrollbar-width);transition:background-color .2s ease}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide:after{content:"";position:absolute;width:200%;height:100%;top:0;left:-50%;background:rgba(0,0,0,0);z-index:-1}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active,.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide:hover{background-color:rgba(var(--r-overlay-element-bg-color),.4)}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-trigger{position:absolute;width:100%;transition:background-color .2s ease}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active.has-triggers{background-color:rgba(var(--r-overlay-element-bg-color),.4);z-index:10}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active .scrollbar-trigger:after{content:"";position:absolute;width:var(--r-scrollbar-trigger-size);height:var(--r-scrollbar-trigger-size);border-radius:20px;top:50%;left:50%;transform:translate(-50%,-50%);background-color:rgba(var(--r-overlay-element-bg-color),1);transition:transform .2s ease,opacity .2s ease;opacity:.4}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active .scrollbar-trigger.active:after,.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active .scrollbar-trigger.active~.scrollbar-trigger:after{opacity:1}.reveal-viewport.reveal-scroll .scrollbar .scrollbar-slide.active .scrollbar-trigger~.scrollbar-trigger.active:after{transform:translate(calc(var(--r-scrollbar-width) * -2),0);background-color:rgba(var(--r-overlay-element-bg-color),1)}html.reveal-print *{-webkit-print-color-adjust:exact}html.reveal-print{width:100%;height:100%;overflow:visible}html.reveal-print body{margin:0 auto!important;border:0;padding:0;float:none!important;overflow:visible}html.reveal-print .nestedarrow,html.reveal-print .reveal .controls,html.reveal-print .reveal .playback,html.reveal-print .reveal .progress,html.reveal-print .reveal.overview,html.reveal-print .state-background{display:none!important}html.reveal-print .reveal pre code{overflow:hidden!important}html.reveal-print .reveal{width:auto!important;height:auto!important;overflow:hidden!important}html.reveal-print .reveal .slides{position:static;width:100%!important;height:auto!important;zoom:1!important;pointer-events:initial;left:auto;top:auto;margin:0!important;padding:0!important;overflow:visible;display:block;perspective:none;perspective-origin:50% 50%}html.reveal-print .reveal .slides .pdf-page{position:relative;overflow:hidden;z-index:1;page-break-after:always}html.reveal-print .reveal .slides .pdf-page:last-of-type{page-break-after:avoid}html.reveal-print .reveal .slides section{visibility:visible!important;display:block!important;position:absolute!important;margin:0!important;padding:0!important;box-sizing:border-box!important;min-height:1px;opacity:1!important;transform-style:flat!important;transform:none!important}html.reveal-print .reveal section.stack{position:relative!important;margin:0!important;padding:0!important;page-break-after:avoid!important;height:auto!important;min-height:auto!important}html.reveal-print .reveal img{box-shadow:none}html.reveal-print .reveal .backgrounds{display:none}html.reveal-print .reveal .slide-background{display:block!important;position:absolute;top:0;left:0;width:100%;height:100%;z-index:auto!important}html.reveal-print .reveal.show-notes{max-width:none;max-height:none}html.reveal-print .reveal .speaker-notes-pdf{display:block;width:100%;height:auto;max-height:none;top:auto;right:auto;bottom:auto;left:auto;z-index:100}html.reveal-print .reveal .speaker-notes-pdf[data-layout=separate-page]{position:relative;color:inherit;background-color:transparent;padding:20px;page-break-after:always;border:0}html.reveal-print .reveal .slide-number-pdf{display:block;position:absolute;font-size:14px;visibility:visible}html.reveal-print .aria-status{display:none}@media print{html:not(.print-pdf){overflow:visible;width:auto;height:auto}html:not(.print-pdf) body{margin:0;padding:0;overflow:visible}html:not(.print-pdf) .reveal{background:#fff;font-size:20pt}html:not(.print-pdf) .reveal .backgrounds,html:not(.print-pdf) .reveal .controls,html:not(.print-pdf) .reveal .progress,html:not(.print-pdf) .reveal .slide-number,html:not(.print-pdf) .reveal .state-background{display:none!important}html:not(.print-pdf) .reveal li,html:not(.print-pdf) .reveal p,html:not(.print-pdf) .reveal td{font-size:20pt!important;color:#000}html:not(.print-pdf) .reveal h1,html:not(.print-pdf) .reveal h2,html:not(.print-pdf) .reveal h3,html:not(.print-pdf) .reveal h4,html:not(.print-pdf) .reveal h5,html:not(.print-pdf) .reveal h6{color:#000!important;height:auto;line-height:normal;text-align:left;letter-spacing:normal}html:not(.print-pdf) .reveal h1{font-size:28pt!important}html:not(.print-pdf) .reveal h2{font-size:24pt!important}html:not(.print-pdf) .reveal h3{font-size:22pt!important}html:not(.print-pdf) .reveal h4{font-size:22pt!important;font-variant:small-caps}html:not(.print-pdf) .reveal h5{font-size:21pt!important}html:not(.print-pdf) .reveal h6{font-size:20pt!important;font-style:italic}html:not(.print-pdf) .reveal a:link,html:not(.print-pdf) .reveal a:visited{color:#000!important;font-weight:700;text-decoration:underline}html:not(.print-pdf) .reveal div,html:not(.print-pdf) .reveal ol,html:not(.print-pdf) .reveal p,html:not(.print-pdf) .reveal ul{visibility:visible;position:static;width:auto;height:auto;display:block;overflow:visible;margin:0;text-align:left!important}html:not(.print-pdf) .reveal pre,html:not(.print-pdf) .reveal table{margin-left:0;margin-right:0}html:not(.print-pdf) .reveal pre code{padding:20px}html:not(.print-pdf) .reveal blockquote{margin:20px 0}html:not(.print-pdf) .reveal .slides{position:static!important;width:auto!important;height:auto!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:0!important;zoom:1!important;transform:none!important;overflow:visible!important;display:block!important;text-align:left!important;perspective:none;perspective-origin:50% 50%}html:not(.print-pdf) .reveal .slides section{visibility:visible!important;position:static!important;width:auto!important;height:auto!important;display:block!important;overflow:visible!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:60px 20px!important;z-index:auto!important;opacity:1!important;page-break-after:always!important;transform-style:flat!important;transform:none!important;transition:none!important}html:not(.print-pdf) .reveal .slides section.stack{padding:0!important}html:not(.print-pdf) .reveal .slides section:last-of-type{page-break-after:avoid!important}html:not(.print-pdf) .reveal .slides section .fragment{opacity:1!important;visibility:visible!important;transform:none!important}html:not(.print-pdf) .reveal .r-fit-text{white-space:normal!important}html:not(.print-pdf) .reveal section img{display:block;margin:15px 0;background:#fff;border:1px solid #666;box-shadow:none}html:not(.print-pdf) .reveal section small{font-size:.8em}html:not(.print-pdf) .reveal .hljs{max-height:100%;white-space:pre-wrap;word-wrap:break-word;word-break:break-word;font-size:15pt}html:not(.print-pdf) .reveal .hljs .hljs-ln-numbers{white-space:nowrap}html:not(.print-pdf) .reveal .hljs td{font-size:inherit!important;color:inherit!important}} \ No newline at end of file diff --git a/reveal.js/dist/reveal.esm.js b/reveal.js/dist/reveal.esm.js deleted file mode 100644 index 8398b71..0000000 --- a/reveal.js/dist/reveal.esm.js +++ /dev/null @@ -1,9 +0,0 @@ -/*! -* reveal.js 5.0.3 -* https://revealjs.com -* MIT licensed -* -* Copyright (C) 2011-2023 Hakim El Hattab, https://hakim.se -*/ -const e=(e,t)=>{for(let i in t)e[i]=t[i];return e},t=(e,t)=>Array.from(e.querySelectorAll(t)),i=(e,t,i)=>{i?e.classList.add(t):e.classList.remove(t)},s=e=>{if("string"==typeof e){if("null"===e)return null;if("true"===e)return!0;if("false"===e)return!1;if(e.match(/^-?[\d\.]+$/))return parseFloat(e)}return e},a=(e,t)=>{e.style.transform=t},n=(e,t)=>{let i=e.matches||e.matchesSelector||e.msMatchesSelector;return!(!i||!i.call(e,t))},r=(e,t)=>{if("function"==typeof e.closest)return e.closest(t);for(;e;){if(n(e,t))return e;e=e.parentNode}return null},o=e=>{let t=document.createElement("style");return t.type="text/css",e&&e.length>0&&(t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e))),document.head.appendChild(t),t},l=()=>{let e={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,(t=>{e[t.split("=").shift()]=t.split("=").pop()}));for(let t in e){let i=e[t];e[t]=s(unescape(i))}return void 0!==e.dependencies&&delete e.dependencies,e},d={mp4:"video/mp4",m4a:"video/mp4",ogv:"video/ogg",mpeg:"video/mpeg",webm:"video/webm"},c=navigator.userAgent,h=/(iphone|ipod|ipad|android)/gi.test(c)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1,u=/android/gi.test(c);var g=function(e){if(e){var t=function(e){return[].slice.call(e)},i=3,s=[],a=null,n="requestAnimationFrame"in e?function(){e.cancelAnimationFrame(a),a=e.requestAnimationFrame((function(){return o(s.filter((function(e){return e.dirty&&e.active})))}))}:function(){},r=function(e){return function(){s.forEach((function(t){return t.dirty=e})),n()}},o=function(e){e.filter((function(e){return!e.styleComputed})).forEach((function(e){e.styleComputed=h(e)})),e.filter(u).forEach(g);var t=e.filter(c);t.forEach(d),t.forEach((function(e){g(e),l(e)})),t.forEach(p)},l=function(e){return e.dirty=0},d=function(e){e.availableWidth=e.element.parentNode.clientWidth,e.currentWidth=e.element.scrollWidth,e.previousFontSize=e.currentFontSize,e.currentFontSize=Math.min(Math.max(e.minSize,e.availableWidth/e.currentWidth*e.previousFontSize),e.maxSize),e.whiteSpace=e.multiLine&&e.currentFontSize===e.minSize?"normal":"nowrap"},c=function(e){return 2!==e.dirty||2===e.dirty&&e.element.parentNode.clientWidth!==e.availableWidth},h=function(t){var i=e.getComputedStyle(t.element,null);return t.currentFontSize=parseFloat(i.getPropertyValue("font-size")),t.display=i.getPropertyValue("display"),t.whiteSpace=i.getPropertyValue("white-space"),!0},u=function(e){var t=!1;return!e.preStyleTestCompleted&&(/inline-/.test(e.display)||(t=!0,e.display="inline-block"),"nowrap"!==e.whiteSpace&&(t=!0,e.whiteSpace="nowrap"),e.preStyleTestCompleted=!0,t)},g=function(e){e.element.style.whiteSpace=e.whiteSpace,e.element.style.display=e.display,e.element.style.fontSize=e.currentFontSize+"px"},p=function(e){e.element.dispatchEvent(new CustomEvent("fit",{detail:{oldValue:e.previousFontSize,newValue:e.currentFontSize,scaleFactor:e.currentFontSize/e.previousFontSize}}))},v=function(e,t){return function(){e.dirty=t,e.active&&n()}},m=function(e){return function(){s=s.filter((function(t){return t.element!==e.element})),e.observeMutations&&e.observer.disconnect(),e.element.style.whiteSpace=e.originalStyle.whiteSpace,e.element.style.display=e.originalStyle.display,e.element.style.fontSize=e.originalStyle.fontSize}},f=function(e){return function(){e.active||(e.active=!0,n())}},y=function(e){return function(){return e.active=!1}},b=function(e){e.observeMutations&&(e.observer=new MutationObserver(v(e,1)),e.observer.observe(e.element,e.observeMutations))},w={minSize:16,maxSize:512,multiLine:!0,observeMutations:"MutationObserver"in e&&{subtree:!0,childList:!0,characterData:!0}},E=null,S=function(){e.clearTimeout(E),E=e.setTimeout(r(2),k.observeWindowDelay)},A=["resize","orientationchange"];return Object.defineProperty(k,"observeWindow",{set:function(t){var i="".concat(t?"add":"remove","EventListener");A.forEach((function(t){e[i](t,S)}))}}),k.observeWindow=!0,k.observeWindowDelay=100,k.fitAll=r(i),k}function R(e,t){var a=Object.assign({},w,t),r=e.map((function(e){var t=Object.assign({},a,{element:e,active:!0});return function(e){e.originalStyle={whiteSpace:e.element.style.whiteSpace,display:e.element.style.display,fontSize:e.element.style.fontSize},b(e),e.newbie=!0,e.dirty=!0,s.push(e)}(t),{element:e,fit:v(t,i),unfreeze:f(t),freeze:y(t),unsubscribe:m(t)}}));return n(),r}function k(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"string"==typeof e?R(t(document.querySelectorAll(e)),i):R([e],i)[0]}}("undefined"==typeof window?null:window);class p{constructor(e){this.Reveal=e,this.startEmbeddedIframe=this.startEmbeddedIframe.bind(this)}shouldPreload(e){if(this.Reveal.isScrollView())return!0;let t=this.Reveal.getConfig().preloadIframes;return"boolean"!=typeof t&&(t=e.hasAttribute("data-preload")),t}load(e,i={}){e.style.display=this.Reveal.getConfig().display,t(e,"img[data-src], video[data-src], audio[data-src], iframe[data-src]").forEach((e=>{("IFRAME"!==e.tagName||this.shouldPreload(e))&&(e.setAttribute("src",e.getAttribute("data-src")),e.setAttribute("data-lazy-loaded",""),e.removeAttribute("data-src"))})),t(e,"video, audio").forEach((e=>{let i=0;t(e,"source[data-src]").forEach((e=>{e.setAttribute("src",e.getAttribute("data-src")),e.removeAttribute("data-src"),e.setAttribute("data-lazy-loaded",""),i+=1})),h&&"VIDEO"===e.tagName&&e.setAttribute("playsinline",""),i>0&&e.load()}));let s=e.slideBackgroundElement;if(s){s.style.display="block";let t=e.slideBackgroundContentElement,a=e.getAttribute("data-background-iframe");if(!1===s.hasAttribute("data-loaded")){s.setAttribute("data-loaded","true");let n=e.getAttribute("data-background-image"),r=e.getAttribute("data-background-video"),o=e.hasAttribute("data-background-video-loop"),l=e.hasAttribute("data-background-video-muted");if(n)/^data:/.test(n.trim())?t.style.backgroundImage=`url(${n.trim()})`:t.style.backgroundImage=n.split(",").map((e=>`url(${((e="")=>encodeURI(e).replace(/%5B/g,"[").replace(/%5D/g,"]").replace(/[!'()*]/g,(e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)))(decodeURI(e.trim()))})`)).join(",");else if(r&&!this.Reveal.isSpeakerNotes()){let e=document.createElement("video");o&&e.setAttribute("loop",""),l&&(e.muted=!0),h&&(e.muted=!0,e.setAttribute("playsinline","")),r.split(",").forEach((t=>{let i=((e="")=>d[e.split(".").pop()])(t);e.innerHTML+=i?``:``})),t.appendChild(e)}else if(a&&!0!==i.excludeIframes){let e=document.createElement("iframe");e.setAttribute("allowfullscreen",""),e.setAttribute("mozallowfullscreen",""),e.setAttribute("webkitallowfullscreen",""),e.setAttribute("allow","autoplay"),e.setAttribute("data-src",a),e.style.width="100%",e.style.height="100%",e.style.maxHeight="100%",e.style.maxWidth="100%",t.appendChild(e)}}let n=t.querySelector("iframe[data-src]");n&&this.shouldPreload(s)&&!/autoplay=(1|true|yes)/gi.test(a)&&n.getAttribute("src")!==a&&n.setAttribute("src",a)}this.layout(e)}layout(e){Array.from(e.querySelectorAll(".r-fit-text")).forEach((e=>{g(e,{minSize:24,maxSize:.8*this.Reveal.getConfig().height,observeMutations:!1,observeWindow:!1})}))}unload(e){e.style.display="none";let i=this.Reveal.getSlideBackground(e);i&&(i.style.display="none",t(i,"iframe[src]").forEach((e=>{e.removeAttribute("src")}))),t(e,"video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]").forEach((e=>{e.setAttribute("data-src",e.getAttribute("src")),e.removeAttribute("src")})),t(e,"video[data-lazy-loaded] source[src], audio source[src]").forEach((e=>{e.setAttribute("data-src",e.getAttribute("src")),e.removeAttribute("src")}))}formatEmbeddedContent(){let e=(e,i,s)=>{t(this.Reveal.getSlidesElement(),"iframe["+e+'*="'+i+'"]').forEach((t=>{let i=t.getAttribute(e);i&&-1===i.indexOf(s)&&t.setAttribute(e,i+(/\?/.test(i)?"&":"?")+s)}))};e("src","youtube.com/embed/","enablejsapi=1"),e("data-src","youtube.com/embed/","enablejsapi=1"),e("src","player.vimeo.com/","api=1"),e("data-src","player.vimeo.com/","api=1")}startEmbeddedContent(e){e&&!this.Reveal.isSpeakerNotes()&&(t(e,'img[src$=".gif"]').forEach((e=>{e.setAttribute("src",e.getAttribute("src"))})),t(e,"video, audio").forEach((e=>{if(r(e,".fragment")&&!r(e,".fragment.visible"))return;let t=this.Reveal.getConfig().autoPlayMedia;if("boolean"!=typeof t&&(t=e.hasAttribute("data-autoplay")||!!r(e,".slide-background")),t&&"function"==typeof e.play)if(e.readyState>1)this.startEmbeddedMedia({target:e});else if(h){let t=e.play();t&&"function"==typeof t.catch&&!1===e.controls&&t.catch((()=>{e.controls=!0,e.addEventListener("play",(()=>{e.controls=!1}))}))}else e.removeEventListener("loadeddata",this.startEmbeddedMedia),e.addEventListener("loadeddata",this.startEmbeddedMedia)})),t(e,"iframe[src]").forEach((e=>{r(e,".fragment")&&!r(e,".fragment.visible")||this.startEmbeddedIframe({target:e})})),t(e,"iframe[data-src]").forEach((e=>{r(e,".fragment")&&!r(e,".fragment.visible")||e.getAttribute("src")!==e.getAttribute("data-src")&&(e.removeEventListener("load",this.startEmbeddedIframe),e.addEventListener("load",this.startEmbeddedIframe),e.setAttribute("src",e.getAttribute("data-src")))})))}startEmbeddedMedia(e){let t=!!r(e.target,"html"),i=!!r(e.target,".present");t&&i&&(e.target.currentTime=0,e.target.play()),e.target.removeEventListener("loadeddata",this.startEmbeddedMedia)}startEmbeddedIframe(e){let t=e.target;if(t&&t.contentWindow){let i=!!r(e.target,"html"),s=!!r(e.target,".present");if(i&&s){let e=this.Reveal.getConfig().autoPlayMedia;"boolean"!=typeof e&&(e=t.hasAttribute("data-autoplay")||!!r(t,".slide-background")),/youtube\.com\/embed\//.test(t.getAttribute("src"))&&e?t.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*"):/player\.vimeo\.com\//.test(t.getAttribute("src"))&&e?t.contentWindow.postMessage('{"method":"play"}',"*"):t.contentWindow.postMessage("slide:start","*")}}}stopEmbeddedContent(i,s={}){s=e({unloadIframes:!0},s),i&&i.parentNode&&(t(i,"video, audio").forEach((e=>{e.hasAttribute("data-ignore")||"function"!=typeof e.pause||(e.setAttribute("data-paused-by-reveal",""),e.pause())})),t(i,"iframe").forEach((e=>{e.contentWindow&&e.contentWindow.postMessage("slide:stop","*"),e.removeEventListener("load",this.startEmbeddedIframe)})),t(i,'iframe[src*="youtube.com/embed/"]').forEach((e=>{!e.hasAttribute("data-ignore")&&e.contentWindow&&"function"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")})),t(i,'iframe[src*="player.vimeo.com/"]').forEach((e=>{!e.hasAttribute("data-ignore")&&e.contentWindow&&"function"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{"method":"pause"}',"*")})),!0===s.unloadIframes&&t(i,"iframe[data-src]").forEach((e=>{e.setAttribute("src","about:blank"),e.removeAttribute("src")})))}}const v=".slides section",m=".slides>section",f=".slides>section.present>section",y=/registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener|showPreview/,b=/fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/;class w{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="slide-number",this.Reveal.getRevealElement().appendChild(this.element)}configure(e,t){let i="none";e.slideNumber&&!this.Reveal.isPrintView()&&("all"===e.showSlideNumber||"speaker"===e.showSlideNumber&&this.Reveal.isSpeakerNotes())&&(i="block"),this.element.style.display=i}update(){this.Reveal.getConfig().slideNumber&&this.element&&(this.element.innerHTML=this.getSlideNumber())}getSlideNumber(e=this.Reveal.getCurrentSlide()){let t,i=this.Reveal.getConfig(),s="h.v";if("function"==typeof i.slideNumber)t=i.slideNumber(e);else{"string"==typeof i.slideNumber&&(s=i.slideNumber),/c/.test(s)||1!==this.Reveal.getHorizontalSlides().length||(s="c");let a=e&&"uncounted"===e.dataset.visibility?0:1;switch(t=[],s){case"c":t.push(this.Reveal.getSlidePastCount(e)+a);break;case"c/t":t.push(this.Reveal.getSlidePastCount(e)+a,"/",this.Reveal.getTotalSlides());break;default:let i=this.Reveal.getIndices(e);t.push(i.h+a);let n="h/v"===s?"/":".";this.Reveal.isVerticalSlide(e)&&t.push(n,i.v+1)}}let a="#"+this.Reveal.location.getHash(e);return this.formatNumber(t[0],t[1],t[2],a)}formatNumber(e,t,i,s="#"+this.Reveal.location.getHash()){return"number"!=typeof i||isNaN(i)?`\n\t\t\t\t\t${e}\n\t\t\t\t\t`:`\n\t\t\t\t\t${e}\n\t\t\t\t\t${t}\n\t\t\t\t\t${i}\n\t\t\t\t\t`}destroy(){this.element.remove()}}class E{constructor(e){this.Reveal=e,this.onInput=this.onInput.bind(this),this.onBlur=this.onBlur.bind(this),this.onKeyDown=this.onKeyDown.bind(this)}render(){this.element=document.createElement("div"),this.element.className="jump-to-slide",this.jumpInput=document.createElement("input"),this.jumpInput.type="text",this.jumpInput.className="jump-to-slide-input",this.jumpInput.placeholder="Jump to slide",this.jumpInput.addEventListener("input",this.onInput),this.jumpInput.addEventListener("keydown",this.onKeyDown),this.jumpInput.addEventListener("blur",this.onBlur),this.element.appendChild(this.jumpInput)}show(){this.indicesOnShow=this.Reveal.getIndices(),this.Reveal.getRevealElement().appendChild(this.element),this.jumpInput.focus()}hide(){this.isVisible()&&(this.element.remove(),this.jumpInput.value="",clearTimeout(this.jumpTimeout),delete this.jumpTimeout)}isVisible(){return!!this.element.parentNode}jump(){clearTimeout(this.jumpTimeout),delete this.jumpTimeout;let e,t=this.jumpInput.value.trim("");if(/^\d+$/.test(t)){const i=this.Reveal.getConfig().slideNumber;if("c"===i||"c/t"===i){const i=this.Reveal.getSlides()[parseInt(t,10)-1];i&&(e=this.Reveal.getIndices(i))}}return e||(/^\d+\.\d+$/.test(t)&&(t=t.replace(".","/")),e=this.Reveal.location.getIndicesFromHash(t,{oneBasedIndex:!0})),!e&&/\S+/i.test(t)&&t.length>1&&(e=this.search(t)),e&&""!==t?(this.Reveal.slide(e.h,e.v,e.f),!0):(this.Reveal.slide(this.indicesOnShow.h,this.indicesOnShow.v,this.indicesOnShow.f),!1)}jumpAfter(e){clearTimeout(this.jumpTimeout),this.jumpTimeout=setTimeout((()=>this.jump()),e)}search(e){const t=new RegExp("\\b"+e.trim()+"\\b","i"),i=this.Reveal.getSlides().find((e=>t.test(e.innerText)));return i?this.Reveal.getIndices(i):null}cancel(){this.Reveal.slide(this.indicesOnShow.h,this.indicesOnShow.v,this.indicesOnShow.f),this.hide()}confirm(){this.jump(),this.hide()}destroy(){this.jumpInput.removeEventListener("input",this.onInput),this.jumpInput.removeEventListener("keydown",this.onKeyDown),this.jumpInput.removeEventListener("blur",this.onBlur),this.element.remove()}onKeyDown(e){13===e.keyCode?this.confirm():27===e.keyCode&&(this.cancel(),e.stopImmediatePropagation())}onInput(e){this.jumpAfter(200)}onBlur(){setTimeout((()=>this.hide()),1)}}const S=e=>{let t=e.match(/^#([0-9a-f]{3})$/i);if(t&&t[1])return t=t[1],{r:17*parseInt(t.charAt(0),16),g:17*parseInt(t.charAt(1),16),b:17*parseInt(t.charAt(2),16)};let i=e.match(/^#([0-9a-f]{6})$/i);if(i&&i[1])return i=i[1],{r:parseInt(i.slice(0,2),16),g:parseInt(i.slice(2,4),16),b:parseInt(i.slice(4,6),16)};let s=e.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);if(s)return{r:parseInt(s[1],10),g:parseInt(s[2],10),b:parseInt(s[3],10)};let a=e.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i);return a?{r:parseInt(a[1],10),g:parseInt(a[2],10),b:parseInt(a[3],10),a:parseFloat(a[4])}:null};class A{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="backgrounds",this.Reveal.getRevealElement().appendChild(this.element)}create(){this.element.innerHTML="",this.element.classList.add("no-transition"),this.Reveal.getHorizontalSlides().forEach((e=>{let i=this.createBackground(e,this.element);t(e,"section").forEach((e=>{this.createBackground(e,i),i.classList.add("stack")}))})),this.Reveal.getConfig().parallaxBackgroundImage?(this.element.style.backgroundImage='url("'+this.Reveal.getConfig().parallaxBackgroundImage+'")',this.element.style.backgroundSize=this.Reveal.getConfig().parallaxBackgroundSize,this.element.style.backgroundRepeat=this.Reveal.getConfig().parallaxBackgroundRepeat,this.element.style.backgroundPosition=this.Reveal.getConfig().parallaxBackgroundPosition,setTimeout((()=>{this.Reveal.getRevealElement().classList.add("has-parallax-background")}),1)):(this.element.style.backgroundImage="",this.Reveal.getRevealElement().classList.remove("has-parallax-background"))}createBackground(e,t){let i=document.createElement("div");i.className="slide-background "+e.className.replace(/present|past|future/,"");let s=document.createElement("div");return s.className="slide-background-content",i.appendChild(s),t.appendChild(i),e.slideBackgroundElement=i,e.slideBackgroundContentElement=s,this.sync(e),i}sync(e){const t=e.slideBackgroundElement,i=e.slideBackgroundContentElement,s={background:e.getAttribute("data-background"),backgroundSize:e.getAttribute("data-background-size"),backgroundImage:e.getAttribute("data-background-image"),backgroundVideo:e.getAttribute("data-background-video"),backgroundIframe:e.getAttribute("data-background-iframe"),backgroundColor:e.getAttribute("data-background-color"),backgroundGradient:e.getAttribute("data-background-gradient"),backgroundRepeat:e.getAttribute("data-background-repeat"),backgroundPosition:e.getAttribute("data-background-position"),backgroundTransition:e.getAttribute("data-background-transition"),backgroundOpacity:e.getAttribute("data-background-opacity")},a=e.hasAttribute("data-preload");e.classList.remove("has-dark-background"),e.classList.remove("has-light-background"),t.removeAttribute("data-loaded"),t.removeAttribute("data-background-hash"),t.removeAttribute("data-background-size"),t.removeAttribute("data-background-transition"),t.style.backgroundColor="",i.style.backgroundSize="",i.style.backgroundRepeat="",i.style.backgroundPosition="",i.style.backgroundImage="",i.style.opacity="",i.innerHTML="",s.background&&(/^(http|file|\/\/)/gi.test(s.background)||/\.(svg|png|jpg|jpeg|gif|bmp|webp)([?#\s]|$)/gi.test(s.background)?e.setAttribute("data-background-image",s.background):t.style.background=s.background),(s.background||s.backgroundColor||s.backgroundGradient||s.backgroundImage||s.backgroundVideo||s.backgroundIframe)&&t.setAttribute("data-background-hash",s.background+s.backgroundSize+s.backgroundImage+s.backgroundVideo+s.backgroundIframe+s.backgroundColor+s.backgroundGradient+s.backgroundRepeat+s.backgroundPosition+s.backgroundTransition+s.backgroundOpacity),s.backgroundSize&&t.setAttribute("data-background-size",s.backgroundSize),s.backgroundColor&&(t.style.backgroundColor=s.backgroundColor),s.backgroundGradient&&(t.style.backgroundImage=s.backgroundGradient),s.backgroundTransition&&t.setAttribute("data-background-transition",s.backgroundTransition),a&&t.setAttribute("data-preload",""),s.backgroundSize&&(i.style.backgroundSize=s.backgroundSize),s.backgroundRepeat&&(i.style.backgroundRepeat=s.backgroundRepeat),s.backgroundPosition&&(i.style.backgroundPosition=s.backgroundPosition),s.backgroundOpacity&&(i.style.opacity=s.backgroundOpacity);const n=this.getContrastClass(e);"string"==typeof n&&e.classList.add(n)}getContrastClass(e){const t=e.slideBackgroundElement;let i=e.getAttribute("data-background-color");if(!i||!S(i)){let e=window.getComputedStyle(t);e&&e.backgroundColor&&(i=e.backgroundColor)}if(i){const e=S(i);if(e&&0!==e.a)return"string"==typeof(s=i)&&(s=S(s)),(s?(299*s.r+587*s.g+114*s.b)/1e3:null)<128?"has-dark-background":"has-light-background"}var s;return null}bubbleSlideContrastClassToElement(e,t){["has-light-background","has-dark-background"].forEach((i=>{e.classList.contains(i)?t.classList.add(i):t.classList.remove(i)}),this)}update(e=!1){let i=this.Reveal.getCurrentSlide(),s=this.Reveal.getIndices(),a=null,n=this.Reveal.getConfig().rtl?"future":"past",r=this.Reveal.getConfig().rtl?"past":"future";if(Array.from(this.element.childNodes).forEach(((i,o)=>{i.classList.remove("past","present","future"),os.h?i.classList.add(r):(i.classList.add("present"),a=i),(e||o===s.h)&&t(i,".slide-background").forEach(((e,t)=>{e.classList.remove("past","present","future");const i="number"==typeof s.v?s.v:0;ti?e.classList.add("future"):(e.classList.add("present"),o===s.h&&(a=e))}))})),this.previousBackground&&this.Reveal.slideContent.stopEmbeddedContent(this.previousBackground,{unloadIframes:!this.Reveal.slideContent.shouldPreload(this.previousBackground)}),a){this.Reveal.slideContent.startEmbeddedContent(a);let e=a.querySelector(".slide-background-content");if(e){let t=e.style.backgroundImage||"";/\.gif/i.test(t)&&(e.style.backgroundImage="",window.getComputedStyle(e).opacity,e.style.backgroundImage=t)}let t=this.previousBackground?this.previousBackground.getAttribute("data-background-hash"):null,i=a.getAttribute("data-background-hash");i&&i===t&&a!==this.previousBackground&&this.element.classList.add("no-transition"),this.previousBackground=a}i&&this.bubbleSlideContrastClassToElement(i,this.Reveal.getRevealElement()),setTimeout((()=>{this.element.classList.remove("no-transition")}),1)}updateParallax(){let e=this.Reveal.getIndices();if(this.Reveal.getConfig().parallaxBackgroundImage){let t,i,s=this.Reveal.getHorizontalSlides(),a=this.Reveal.getVerticalSlides(),n=this.element.style.backgroundSize.split(" ");1===n.length?t=i=parseInt(n[0],10):(t=parseInt(n[0],10),i=parseInt(n[1],10));let r,o,l=this.element.offsetWidth,d=s.length;r="number"==typeof this.Reveal.getConfig().parallaxBackgroundHorizontal?this.Reveal.getConfig().parallaxBackgroundHorizontal:d>1?(t-l)/(d-1):0,o=r*e.h*-1;let c,h,u=this.element.offsetHeight,g=a.length;c="number"==typeof this.Reveal.getConfig().parallaxBackgroundVertical?this.Reveal.getConfig().parallaxBackgroundVertical:(i-u)/(g-1),h=g>0?c*e.v:0,this.element.style.backgroundPosition=o+"px "+-h+"px"}}destroy(){this.element.remove()}}let R=0;class k{constructor(e){this.Reveal=e}run(e,t){this.reset();let i=this.Reveal.getSlides(),s=i.indexOf(t),a=i.indexOf(e);if(e.hasAttribute("data-auto-animate")&&t.hasAttribute("data-auto-animate")&&e.getAttribute("data-auto-animate-id")===t.getAttribute("data-auto-animate-id")&&!(s>a?t:e).hasAttribute("data-auto-animate-restart")){this.autoAnimateStyleSheet=this.autoAnimateStyleSheet||o();let i=this.getAutoAnimateOptions(t);e.dataset.autoAnimate="pending",t.dataset.autoAnimate="pending",i.slideDirection=s>a?"forward":"backward";let n="none"===e.style.display;n&&(e.style.display=this.Reveal.getConfig().display);let r=this.getAutoAnimatableElements(e,t).map((e=>this.autoAnimateElements(e.from,e.to,e.options||{},i,R++)));if(n&&(e.style.display="none"),"false"!==t.dataset.autoAnimateUnmatched&&!0===this.Reveal.getConfig().autoAnimateUnmatched){let e=.8*i.duration,s=.2*i.duration;this.getUnmatchedAutoAnimateElements(t).forEach((e=>{let t=this.getAutoAnimateOptions(e,i),s="unmatched";t.duration===i.duration&&t.delay===i.delay||(s="unmatched-"+R++,r.push(`[data-auto-animate="running"] [data-auto-animate-target="${s}"] { transition: opacity ${t.duration}s ease ${t.delay}s; }`)),e.dataset.autoAnimateTarget=s}),this),r.push(`[data-auto-animate="running"] [data-auto-animate-target="unmatched"] { transition: opacity ${e}s ease ${s}s; }`)}this.autoAnimateStyleSheet.innerHTML=r.join(""),requestAnimationFrame((()=>{this.autoAnimateStyleSheet&&(getComputedStyle(this.autoAnimateStyleSheet).fontWeight,t.dataset.autoAnimate="running")})),this.Reveal.dispatchEvent({type:"autoanimate",data:{fromSlide:e,toSlide:t,sheet:this.autoAnimateStyleSheet}})}}reset(){t(this.Reveal.getRevealElement(),'[data-auto-animate]:not([data-auto-animate=""])').forEach((e=>{e.dataset.autoAnimate=""})),t(this.Reveal.getRevealElement(),"[data-auto-animate-target]").forEach((e=>{delete e.dataset.autoAnimateTarget})),this.autoAnimateStyleSheet&&this.autoAnimateStyleSheet.parentNode&&(this.autoAnimateStyleSheet.parentNode.removeChild(this.autoAnimateStyleSheet),this.autoAnimateStyleSheet=null)}autoAnimateElements(e,t,i,s,a){e.dataset.autoAnimateTarget="",t.dataset.autoAnimateTarget=a;let n=this.getAutoAnimateOptions(t,s);void 0!==i.delay&&(n.delay=i.delay),void 0!==i.duration&&(n.duration=i.duration),void 0!==i.easing&&(n.easing=i.easing);let r=this.getAutoAnimatableProperties("from",e,i),o=this.getAutoAnimatableProperties("to",t,i);if(t.classList.contains("fragment")&&(delete o.styles.opacity,e.classList.contains("fragment"))){(e.className.match(b)||[""])[0]===(t.className.match(b)||[""])[0]&&"forward"===s.slideDirection&&t.classList.add("visible","disabled")}if(!1!==i.translate||!1!==i.scale){let e=this.Reveal.getScale(),t={x:(r.x-o.x)/e,y:(r.y-o.y)/e,scaleX:r.width/o.width,scaleY:r.height/o.height};t.x=Math.round(1e3*t.x)/1e3,t.y=Math.round(1e3*t.y)/1e3,t.scaleX=Math.round(1e3*t.scaleX)/1e3,t.scaleX=Math.round(1e3*t.scaleX)/1e3;let s=!1!==i.translate&&(0!==t.x||0!==t.y),a=!1!==i.scale&&(0!==t.scaleX||0!==t.scaleY);if(s||a){let e=[];s&&e.push(`translate(${t.x}px, ${t.y}px)`),a&&e.push(`scale(${t.scaleX}, ${t.scaleY})`),r.styles.transform=e.join(" "),r.styles["transform-origin"]="top left",o.styles.transform="none"}}for(let e in o.styles){const t=o.styles[e],i=r.styles[e];t===i?delete o.styles[e]:(!0===t.explicitValue&&(o.styles[e]=t.value),!0===i.explicitValue&&(r.styles[e]=i.value))}let l="",d=Object.keys(o.styles);if(d.length>0){r.styles.transition="none",o.styles.transition=`all ${n.duration}s ${n.easing} ${n.delay}s`,o.styles["transition-property"]=d.join(", "),o.styles["will-change"]=d.join(", "),l='[data-auto-animate-target="'+a+'"] {'+Object.keys(r.styles).map((e=>e+": "+r.styles[e]+" !important;")).join("")+'}[data-auto-animate="running"] [data-auto-animate-target="'+a+'"] {'+Object.keys(o.styles).map((e=>e+": "+o.styles[e]+" !important;")).join("")+"}"}return l}getAutoAnimateOptions(t,i){let s={easing:this.Reveal.getConfig().autoAnimateEasing,duration:this.Reveal.getConfig().autoAnimateDuration,delay:0};if(s=e(s,i),t.parentNode){let e=r(t.parentNode,"[data-auto-animate-target]");e&&(s=this.getAutoAnimateOptions(e,s))}return t.dataset.autoAnimateEasing&&(s.easing=t.dataset.autoAnimateEasing),t.dataset.autoAnimateDuration&&(s.duration=parseFloat(t.dataset.autoAnimateDuration)),t.dataset.autoAnimateDelay&&(s.delay=parseFloat(t.dataset.autoAnimateDelay)),s}getAutoAnimatableProperties(e,t,i){let s=this.Reveal.getConfig(),a={styles:[]};if(!1!==i.translate||!1!==i.scale){let e;if("function"==typeof i.measure)e=i.measure(t);else if(s.center)e=t.getBoundingClientRect();else{let i=this.Reveal.getScale();e={x:t.offsetLeft*i,y:t.offsetTop*i,width:t.offsetWidth*i,height:t.offsetHeight*i}}a.x=e.x,a.y=e.y,a.width=e.width,a.height=e.height}const n=getComputedStyle(t);return(i.styles||s.autoAnimateStyles).forEach((t=>{let i;"string"==typeof t&&(t={property:t}),void 0!==t.from&&"from"===e?i={value:t.from,explicitValue:!0}:void 0!==t.to&&"to"===e?i={value:t.to,explicitValue:!0}:("line-height"===t.property&&(i=parseFloat(n["line-height"])/parseFloat(n["font-size"])),isNaN(i)&&(i=n[t.property])),""!==i&&(a.styles[t.property]=i)})),a}getAutoAnimatableElements(e,t){let i=("function"==typeof this.Reveal.getConfig().autoAnimateMatcher?this.Reveal.getConfig().autoAnimateMatcher:this.getAutoAnimatePairs).call(this,e,t),s=[];return i.filter(((e,t)=>{if(-1===s.indexOf(e.to))return s.push(e.to),!0}))}getAutoAnimatePairs(e,t){let i=[];const s="h1, h2, h3, h4, h5, h6, p, li";return this.findAutoAnimateMatches(i,e,t,"[data-id]",(e=>e.nodeName+":::"+e.getAttribute("data-id"))),this.findAutoAnimateMatches(i,e,t,s,(e=>e.nodeName+":::"+e.innerText)),this.findAutoAnimateMatches(i,e,t,"img, video, iframe",(e=>e.nodeName+":::"+(e.getAttribute("src")||e.getAttribute("data-src")))),this.findAutoAnimateMatches(i,e,t,"pre",(e=>e.nodeName+":::"+e.innerText)),i.forEach((e=>{n(e.from,s)?e.options={scale:!1}:n(e.from,"pre")&&(e.options={scale:!1,styles:["width","height"]},this.findAutoAnimateMatches(i,e.from,e.to,".hljs .hljs-ln-code",(e=>e.textContent),{scale:!1,styles:[],measure:this.getLocalBoundingBox.bind(this)}),this.findAutoAnimateMatches(i,e.from,e.to,".hljs .hljs-ln-numbers[data-line-number]",(e=>e.getAttribute("data-line-number")),{scale:!1,styles:["width"],measure:this.getLocalBoundingBox.bind(this)}))}),this),i}getLocalBoundingBox(e){const t=this.Reveal.getScale();return{x:Math.round(e.offsetLeft*t*100)/100,y:Math.round(e.offsetTop*t*100)/100,width:Math.round(e.offsetWidth*t*100)/100,height:Math.round(e.offsetHeight*t*100)/100}}findAutoAnimateMatches(e,t,i,s,a,n){let r={},o={};[].slice.call(t.querySelectorAll(s)).forEach(((e,t)=>{const i=a(e);"string"==typeof i&&i.length&&(r[i]=r[i]||[],r[i].push(e))})),[].slice.call(i.querySelectorAll(s)).forEach(((t,i)=>{const s=a(t);let l;if(o[s]=o[s]||[],o[s].push(t),r[s]){const e=o[s].length-1,t=r[s].length-1;r[s][e]?(l=r[s][e],r[s][e]=null):r[s][t]&&(l=r[s][t],r[s][t]=null)}l&&e.push({from:l,to:t,options:n})}))}getUnmatchedAutoAnimateElements(e){return[].slice.call(e.children).reduce(((e,t)=>{const i=t.querySelector("[data-auto-animate-target]");return t.hasAttribute("data-auto-animate-target")||i||e.push(t),t.querySelector("[data-auto-animate-target]")&&(e=e.concat(this.getUnmatchedAutoAnimateElements(t))),e}),[])}}class L{constructor(e){this.Reveal=e,this.active=!1,this.activatedCallbacks=[],this.onScroll=this.onScroll.bind(this)}activate(){if(this.active)return;const e=this.Reveal.getState();this.active=!0,this.slideHTMLBeforeActivation=this.Reveal.getSlidesElement().innerHTML;const i=t(this.Reveal.getRevealElement(),m);let s;this.viewportElement.classList.add("loading-scroll-mode","reveal-scroll");const a=window.getComputedStyle(this.viewportElement);a&&a.background&&(s=a.background);const n=[],r=i[0].parentNode;let o;const l=(e,t,i)=>{let a;if(o&&this.Reveal.shouldAutoAnimateBetween(o,e))a=document.createElement("div"),a.className="scroll-page-content scroll-auto-animate-page",a.style.display="none",o.closest(".scroll-page-content").parentNode.appendChild(a);else{const e=document.createElement("div");e.className="scroll-page",n.push(e),s&&(e.style.background=s);const t=document.createElement("div");t.className="scroll-page-sticky",e.appendChild(t),a=document.createElement("div"),a.className="scroll-page-content",t.appendChild(a)}a.appendChild(e),e.classList.remove("past","future"),e.setAttribute("data-index-h",t),e.setAttribute("data-index-v",i),e.slideBackgroundElement&&(e.slideBackgroundElement.remove("past","future"),a.insertBefore(e.slideBackgroundElement,e)),o=e};i.forEach(((e,t)=>{this.Reveal.isVerticalStack(e)?e.querySelectorAll("section").forEach(((e,i)=>{l(e,t,i)})):l(e,t,0)}),this),this.createProgressBar(),t(this.Reveal.getRevealElement(),".stack").forEach((e=>e.remove())),n.forEach((e=>r.appendChild(e))),this.Reveal.slideContent.layout(this.Reveal.getSlidesElement()),this.Reveal.layout(),this.Reveal.setState(e),this.activatedCallbacks.forEach((e=>e())),this.activatedCallbacks=[],this.restoreScrollPosition(),this.viewportElement.classList.remove("loading-scroll-mode"),this.viewportElement.addEventListener("scroll",this.onScroll,{passive:!0})}deactivate(){if(!this.active)return;const e=this.Reveal.getState();this.active=!1,this.viewportElement.removeEventListener("scroll",this.onScroll),this.viewportElement.classList.remove("reveal-scroll"),this.removeProgressBar(),this.Reveal.getSlidesElement().innerHTML=this.slideHTMLBeforeActivation,this.Reveal.sync(),this.Reveal.setState(e),this.slideHTMLBeforeActivation=null}toggle(e){"boolean"==typeof e?e?this.activate():this.deactivate():this.isActive()?this.deactivate():this.activate()}isActive(){return this.active}createProgressBar(){this.progressBar=document.createElement("div"),this.progressBar.className="scrollbar",this.progressBarInner=document.createElement("div"),this.progressBarInner.className="scrollbar-inner",this.progressBar.appendChild(this.progressBarInner),this.progressBarPlayhead=document.createElement("div"),this.progressBarPlayhead.className="scrollbar-playhead",this.progressBarInner.appendChild(this.progressBarPlayhead),this.viewportElement.insertBefore(this.progressBar,this.viewportElement.firstChild);const e=e=>{let t=(e.clientY-this.progressBarInner.getBoundingClientRect().top)/this.progressBarHeight;t=Math.max(Math.min(t,1),0),this.viewportElement.scrollTop=t*(this.viewportElement.scrollHeight-this.viewportElement.offsetHeight)},t=i=>{this.draggingProgressBar=!1,this.showProgressBar(),document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",t)};this.progressBarInner.addEventListener("mousedown",(i=>{i.preventDefault(),this.draggingProgressBar=!0,document.addEventListener("mousemove",e),document.addEventListener("mouseup",t),e(i)}))}removeProgressBar(){this.progressBar&&(this.progressBar.remove(),this.progressBar=null)}layout(){this.isActive()&&(this.syncPages(),this.syncScrollPosition())}syncPages(){const e=this.Reveal.getConfig(),t=this.Reveal.getComputedSlideSize(window.innerWidth,window.innerHeight),i=this.Reveal.getScale(),s="compact"===e.scrollLayout,a=this.viewportElement.offsetHeight,n=t.height*i,r=s?n:a,o=s?n:a;this.viewportElement.style.setProperty("--page-height",r+"px"),this.viewportElement.style.scrollSnapType="string"==typeof e.scrollSnap?`y ${e.scrollSnap}`:"",this.slideTriggers=[];const l=Array.from(this.Reveal.getRevealElement().querySelectorAll(".scroll-page"));this.pages=l.map((i=>{const n=this.createPage({pageElement:i,slideElement:i.querySelector("section"),stickyElement:i.querySelector(".scroll-page-sticky"),contentElement:i.querySelector(".scroll-page-content"),backgroundElement:i.querySelector(".slide-background"),autoAnimateElements:i.querySelectorAll(".scroll-auto-animate-page"),autoAnimatePages:[]});n.pageElement.style.setProperty("--slide-height",!0===e.center?"auto":t.height+"px"),this.slideTriggers.push({page:n,activate:()=>this.activatePage(n),deactivate:()=>this.deactivatePage(n)}),this.createFragmentTriggersForPage(n),n.autoAnimateElements.length>0&&this.createAutoAnimateTriggersForPage(n);let l=Math.max(n.scrollTriggers.length-1,0);l+=n.autoAnimatePages.reduce(((e,t)=>e+Math.max(t.scrollTriggers.length-1,0)),n.autoAnimatePages.length),n.pageElement.querySelectorAll(".scroll-snap-point").forEach((e=>e.remove()));for(let e=0;e0?(n.pageHeight=a,n.pageElement.style.setProperty("--page-height",a+"px")):(n.pageHeight=r,n.pageElement.style.removeProperty("--page-height")),n.scrollPadding=o*l,n.totalHeight=n.pageHeight+n.scrollPadding,n.pageElement.style.setProperty("--page-scroll-padding",n.scrollPadding+"px"),l>0?(n.stickyElement.style.position="sticky",n.stickyElement.style.top=Math.max((a-n.pageHeight)/2,0)+"px"):(n.stickyElement.style.position="relative",n.pageElement.style.scrollSnapAlign=n.pageHeight1?(this.progressBar||this.createProgressBar(),this.syncProgressBar()):this.removeProgressBar()}setTriggerRanges(){this.totalScrollTriggerCount=this.slideTriggers.reduce(((e,t)=>e+Math.max(t.page.scrollTriggers.length,1)),0);let e=0;this.slideTriggers.forEach(((t,i)=>{t.range=[e,e+Math.max(t.page.scrollTriggers.length,1)/this.totalScrollTriggerCount];const s=(t.range[1]-t.range[0])/t.page.scrollTriggers.length;t.page.scrollTriggers.forEach(((t,i)=>{t.range=[e+i*s,e+(i+1)*s]})),e=t.range[1]}))}createFragmentTriggersForPage(e,t){t=t||e.slideElement;const i=this.Reveal.fragments.sort(t.querySelectorAll(".fragment"),!0);return i.length&&(e.fragments=this.Reveal.fragments.sort(t.querySelectorAll(".fragment:not(.disabled)")),e.scrollTriggers.push({activate:()=>{this.Reveal.fragments.update(-1,e.fragments,t)}},...i.map(((i,s)=>({activate:()=>{this.Reveal.fragments.update(s,e.fragments,t)}}))))),e.scrollTriggers.length}createAutoAnimateTriggersForPage(e){e.autoAnimateElements.length>0&&this.slideTriggers.push(...Array.from(e.autoAnimateElements).map(((t,i)=>{let s=this.createPage({slideElement:t.querySelector("section"),contentElement:t,backgroundElement:t.querySelector(".slide-background")});return this.createFragmentTriggersForPage(s,s.slideElement),e.autoAnimatePages.push(s),{page:s,activate:()=>this.activatePage(s),deactivate:()=>this.deactivatePage(s)}})))}createPage(e){return e.scrollTriggers=[],e.indexh=parseInt(e.slideElement.getAttribute("data-index-h"),10),e.indexv=parseInt(e.slideElement.getAttribute("data-index-v"),10),e}syncProgressBar(){this.progressBarInner.querySelectorAll(".scrollbar-slide").forEach((e=>e.remove()));const e=this.viewportElement.scrollHeight,t=this.viewportElement.offsetHeight,i=t/e;this.progressBarHeight=this.progressBarInner.offsetHeight,this.playheadHeight=Math.max(i*this.progressBarHeight,8),this.progressBarScrollableHeight=this.progressBarHeight-this.playheadHeight;const s=t/e*this.progressBarHeight,a=Math.min(s/8,4);this.progressBarPlayhead.style.height=this.playheadHeight-a+"px",s>6?this.slideTriggers.forEach((e=>{const{page:t}=e;t.progressBarSlide=document.createElement("div"),t.progressBarSlide.className="scrollbar-slide",t.progressBarSlide.style.top=e.range[0]*this.progressBarHeight+"px",t.progressBarSlide.style.height=(e.range[1]-e.range[0])*this.progressBarHeight-a+"px",t.progressBarSlide.classList.toggle("has-triggers",t.scrollTriggers.length>0),this.progressBarInner.appendChild(t.progressBarSlide),t.scrollTriggerElements=t.scrollTriggers.map(((i,s)=>{const n=document.createElement("div");return n.className="scrollbar-trigger",n.style.top=(i.range[0]-e.range[0])*this.progressBarHeight+"px",n.style.height=(i.range[1]-i.range[0])*this.progressBarHeight-a+"px",t.progressBarSlide.appendChild(n),0===s&&(n.style.display="none"),n}))})):this.pages.forEach((e=>e.progressBarSlide=null))}syncScrollPosition(){const e=this.viewportElement.offsetHeight,t=e/this.viewportElement.scrollHeight,i=this.viewportElement.scrollTop,s=this.viewportElement.scrollHeight-e,a=Math.max(Math.min(i/s,1),0),n=Math.max(Math.min((i+e/2)/this.viewportElement.scrollHeight,1),0);let r;this.slideTriggers.forEach((e=>{const{page:i}=e;a>=e.range[0]-2*t&&a<=e.range[1]+2*t&&!i.loaded?(i.loaded=!0,this.Reveal.slideContent.load(i.slideElement)):i.loaded&&(i.loaded=!1,this.Reveal.slideContent.unload(i.slideElement)),a>=e.range[0]&&a<=e.range[1]?(this.activateTrigger(e),r=e.page):e.active&&this.deactivateTrigger(e)})),r&&r.scrollTriggers.forEach((e=>{n>=e.range[0]&&n<=e.range[1]?this.activateTrigger(e):e.active&&this.deactivateTrigger(e)})),this.setProgressBarValue(i/(this.viewportElement.scrollHeight-e))}setProgressBarValue(e){this.progressBar&&(this.progressBarPlayhead.style.transform=`translateY(${e*this.progressBarScrollableHeight}px)`,this.getAllPages().filter((e=>e.progressBarSlide)).forEach((e=>{e.progressBarSlide.classList.toggle("active",!0===e.active),e.scrollTriggers.forEach(((t,i)=>{e.scrollTriggerElements[i].classList.toggle("active",!0===e.active&&!0===t.active)}))})),this.showProgressBar())}showProgressBar(){this.progressBar.classList.add("visible"),clearTimeout(this.hideProgressBarTimeout),"auto"!==this.Reveal.getConfig().scrollProgress||this.draggingProgressBar||(this.hideProgressBarTimeout=setTimeout((()=>{this.progressBar&&this.progressBar.classList.remove("visible")}),500))}scrollToSlide(e){if(this.active){const t=this.getScrollTriggerBySlide(e);t&&(this.viewportElement.scrollTop=t.range[0]*(this.viewportElement.scrollHeight-this.viewportElement.offsetHeight))}else this.activatedCallbacks.push((()=>this.scrollToSlide(e)))}storeScrollPosition(){clearTimeout(this.storeScrollPositionTimeout),this.storeScrollPositionTimeout=setTimeout((()=>{sessionStorage.setItem("reveal-scroll-top",this.viewportElement.scrollTop),sessionStorage.setItem("reveal-scroll-origin",location.origin+location.pathname),this.storeScrollPositionTimeout=null}),50)}restoreScrollPosition(){const e=sessionStorage.getItem("reveal-scroll-top"),t=sessionStorage.getItem("reveal-scroll-origin");e&&t===location.origin+location.pathname&&(this.viewportElement.scrollTop=parseInt(e,10))}activatePage(e){if(!e.active){e.active=!0;const{slideElement:t,backgroundElement:i,contentElement:s,indexh:a,indexv:n}=e;s.style.display="block",t.classList.add("present"),i&&i.classList.add("present"),this.Reveal.setCurrentScrollPage(t,a,n),this.Reveal.backgrounds.bubbleSlideContrastClassToElement(t,this.viewportElement),Array.from(s.parentNode.querySelectorAll(".scroll-page-content")).forEach((e=>{e!==s&&(e.style.display="none")}))}}deactivatePage(e){e.active&&(e.active=!1,e.slideElement.classList.remove("present"),e.backgroundElement.classList.remove("present"))}activateTrigger(e){e.active||(e.active=!0,e.activate())}deactivateTrigger(e){e.active&&(e.active=!1,e.deactivate&&e.deactivate())}getSlideByIndices(e,t){const i=this.getAllPages().find((i=>i.indexh===e&&i.indexv===t));return i?i.slideElement:null}getScrollTriggerBySlide(e){return this.slideTriggers.find((t=>t.page.slideElement===e))}getAllPages(){return this.pages.flatMap((e=>[e,...e.autoAnimatePages||[]]))}onScroll(){this.syncScrollPosition(),this.storeScrollPosition()}get viewportElement(){return this.Reveal.getViewportElement()}}class C{constructor(e){this.Reveal=e}async activate(){const e=this.Reveal.getConfig(),i=t(this.Reveal.getRevealElement(),v),s=e.slideNumber&&/all|print/i.test(e.showSlideNumber),a=this.Reveal.getComputedSlideSize(window.innerWidth,window.innerHeight),n=Math.floor(a.width*(1+e.margin)),r=Math.floor(a.height*(1+e.margin)),l=a.width,d=a.height;await new Promise(requestAnimationFrame),o("@page{size:"+n+"px "+r+"px; margin: 0px;}"),o(".reveal section>img, .reveal section>video, .reveal section>iframe{max-width: "+l+"px; max-height:"+d+"px}"),document.documentElement.classList.add("reveal-print","print-pdf"),document.body.style.width=n+"px",document.body.style.height=r+"px";const c=this.Reveal.getViewportElement();let h;if(c){const e=window.getComputedStyle(c);e&&e.background&&(h=e.background)}await new Promise(requestAnimationFrame),this.Reveal.layoutSlideContents(l,d),await new Promise(requestAnimationFrame);const u=i.map((e=>e.scrollHeight)),g=[],p=i[0].parentNode;let m=1;i.forEach((function(i,a){if(!1===i.classList.contains("stack")){let o=(n-l)/2,c=(r-d)/2;const p=u[a];let v=Math.max(Math.ceil(p/r),1);v=Math.min(v,e.pdfMaxPagesPerSlide),(1===v&&e.center||i.classList.contains("center"))&&(c=Math.max((r-p)/2,0));const f=document.createElement("div");if(g.push(f),f.className="pdf-page",f.style.height=(r+e.pdfPageHeightOffset)*v+"px",h&&(f.style.background=h),f.appendChild(i),i.style.left=o+"px",i.style.top=c+"px",i.style.width=l+"px",this.Reveal.slideContent.layout(i),i.slideBackgroundElement&&f.insertBefore(i.slideBackgroundElement,i),e.showNotes){const t=this.Reveal.getSlideNotes(i);if(t){const i=8,s="string"==typeof e.showNotes?e.showNotes:"inline",a=document.createElement("div");a.classList.add("speaker-notes"),a.classList.add("speaker-notes-pdf"),a.setAttribute("data-layout",s),a.innerHTML=t,"separate-page"===s?g.push(a):(a.style.left=i+"px",a.style.bottom=i+"px",a.style.width=n-2*i+"px",f.appendChild(a))}}if(s){const e=document.createElement("div");e.classList.add("slide-number"),e.classList.add("slide-number-pdf"),e.innerHTML=m++,f.appendChild(e)}if(e.pdfSeparateFragments){const e=this.Reveal.fragments.sort(f.querySelectorAll(".fragment"),!0);let t;e.forEach((function(e,i){t&&t.forEach((function(e){e.classList.remove("current-fragment")})),e.forEach((function(e){e.classList.add("visible","current-fragment")}),this);const a=f.cloneNode(!0);if(s){const e=i+1;a.querySelector(".slide-number-pdf").innerHTML+="."+e}g.push(a),t=e}),this),e.forEach((function(e){e.forEach((function(e){e.classList.remove("visible","current-fragment")}))}))}else t(f,".fragment:not(.fade-out)").forEach((function(e){e.classList.add("visible")}))}}),this),await new Promise(requestAnimationFrame),g.forEach((e=>p.appendChild(e))),this.Reveal.slideContent.layout(this.Reveal.getSlidesElement()),this.Reveal.dispatchEvent({type:"pdf-ready"}),c.classList.remove("loading-scroll-mode")}isActive(){return"print"===this.Reveal.getConfig().view}}class x{constructor(e){this.Reveal=e}configure(e,t){!1===e.fragments?this.disable():!1===t.fragments&&this.enable()}disable(){t(this.Reveal.getSlidesElement(),".fragment").forEach((e=>{e.classList.add("visible"),e.classList.remove("current-fragment")}))}enable(){t(this.Reveal.getSlidesElement(),".fragment").forEach((e=>{e.classList.remove("visible"),e.classList.remove("current-fragment")}))}availableRoutes(){let e=this.Reveal.getCurrentSlide();if(e&&this.Reveal.getConfig().fragments){let t=e.querySelectorAll(".fragment:not(.disabled)"),i=e.querySelectorAll(".fragment:not(.disabled):not(.visible)");return{prev:t.length-i.length>0,next:!!i.length}}return{prev:!1,next:!1}}sort(e,t=!1){e=Array.from(e);let i=[],s=[],a=[];e.forEach((e=>{if(e.hasAttribute("data-fragment-index")){let t=parseInt(e.getAttribute("data-fragment-index"),10);i[t]||(i[t]=[]),i[t].push(e)}else s.push([e])})),i=i.concat(s);let n=0;return i.forEach((e=>{e.forEach((e=>{a.push(e),e.setAttribute("data-fragment-index",n)})),n++})),!0===t?i:a}sortAll(){this.Reveal.getHorizontalSlides().forEach((e=>{let i=t(e,"section");i.forEach(((e,t)=>{this.sort(e.querySelectorAll(".fragment"))}),this),0===i.length&&this.sort(e.querySelectorAll(".fragment"))}))}update(e,t,i=this.Reveal.getCurrentSlide()){let s={shown:[],hidden:[]};if(i&&this.Reveal.getConfig().fragments&&(t=t||this.sort(i.querySelectorAll(".fragment"))).length){let a=0;if("number"!=typeof e){let t=this.sort(i.querySelectorAll(".fragment.visible")).pop();t&&(e=parseInt(t.getAttribute("data-fragment-index")||0,10))}Array.from(t).forEach(((t,i)=>{if(t.hasAttribute("data-fragment-index")&&(i=parseInt(t.getAttribute("data-fragment-index"),10)),a=Math.max(a,i),i<=e){let a=t.classList.contains("visible");t.classList.add("visible"),t.classList.remove("current-fragment"),i===e&&(this.Reveal.announceStatus(this.Reveal.getStatusText(t)),t.classList.add("current-fragment"),this.Reveal.slideContent.startEmbeddedContent(t)),a||(s.shown.push(t),this.Reveal.dispatchEvent({target:t,type:"visible",bubbles:!1}))}else{let e=t.classList.contains("visible");t.classList.remove("visible"),t.classList.remove("current-fragment"),e&&(this.Reveal.slideContent.stopEmbeddedContent(t),s.hidden.push(t),this.Reveal.dispatchEvent({target:t,type:"hidden",bubbles:!1}))}})),e="number"==typeof e?e:-1,e=Math.max(Math.min(e,a),-1),i.setAttribute("data-fragment",e)}return s}sync(e=this.Reveal.getCurrentSlide()){return this.sort(e.querySelectorAll(".fragment"))}goto(e,t=0){let i=this.Reveal.getCurrentSlide();if(i&&this.Reveal.getConfig().fragments){let s=this.sort(i.querySelectorAll(".fragment:not(.disabled)"));if(s.length){if("number"!=typeof e){let t=this.sort(i.querySelectorAll(".fragment:not(.disabled).visible")).pop();e=t?parseInt(t.getAttribute("data-fragment-index")||0,10):-1}e+=t;let a=this.update(e,s);return a.hidden.length&&this.Reveal.dispatchEvent({type:"fragmenthidden",data:{fragment:a.hidden[0],fragments:a.hidden}}),a.shown.length&&this.Reveal.dispatchEvent({type:"fragmentshown",data:{fragment:a.shown[0],fragments:a.shown}}),this.Reveal.controls.update(),this.Reveal.progress.update(),this.Reveal.getConfig().fragmentInURL&&this.Reveal.location.writeURL(),!(!a.shown.length&&!a.hidden.length)}}return!1}next(){return this.goto(null,1)}prev(){return this.goto(null,-1)}}class P{constructor(e){this.Reveal=e,this.active=!1,this.onSlideClicked=this.onSlideClicked.bind(this)}activate(){if(this.Reveal.getConfig().overview&&!this.Reveal.isScrollView()&&!this.isActive()){this.active=!0,this.Reveal.getRevealElement().classList.add("overview"),this.Reveal.cancelAutoSlide(),this.Reveal.getSlidesElement().appendChild(this.Reveal.getBackgroundsElement()),t(this.Reveal.getRevealElement(),v).forEach((e=>{e.classList.contains("stack")||e.addEventListener("click",this.onSlideClicked,!0)}));const e=70,i=this.Reveal.getComputedSlideSize();this.overviewSlideWidth=i.width+e,this.overviewSlideHeight=i.height+e,this.Reveal.getConfig().rtl&&(this.overviewSlideWidth=-this.overviewSlideWidth),this.Reveal.updateSlidesVisibility(),this.layout(),this.update(),this.Reveal.layout();const s=this.Reveal.getIndices();this.Reveal.dispatchEvent({type:"overviewshown",data:{indexh:s.h,indexv:s.v,currentSlide:this.Reveal.getCurrentSlide()}})}}layout(){this.Reveal.getHorizontalSlides().forEach(((e,i)=>{e.setAttribute("data-index-h",i),a(e,"translate3d("+i*this.overviewSlideWidth+"px, 0, 0)"),e.classList.contains("stack")&&t(e,"section").forEach(((e,t)=>{e.setAttribute("data-index-h",i),e.setAttribute("data-index-v",t),a(e,"translate3d(0, "+t*this.overviewSlideHeight+"px, 0)")}))})),Array.from(this.Reveal.getBackgroundsElement().childNodes).forEach(((e,i)=>{a(e,"translate3d("+i*this.overviewSlideWidth+"px, 0, 0)"),t(e,".slide-background").forEach(((e,t)=>{a(e,"translate3d(0, "+t*this.overviewSlideHeight+"px, 0)")}))}))}update(){const e=Math.min(window.innerWidth,window.innerHeight),t=Math.max(e/5,150)/e,i=this.Reveal.getIndices();this.Reveal.transformSlides({overview:["scale("+t+")","translateX("+-i.h*this.overviewSlideWidth+"px)","translateY("+-i.v*this.overviewSlideHeight+"px)"].join(" ")})}deactivate(){if(this.Reveal.getConfig().overview){this.active=!1,this.Reveal.getRevealElement().classList.remove("overview"),this.Reveal.getRevealElement().classList.add("overview-deactivating"),setTimeout((()=>{this.Reveal.getRevealElement().classList.remove("overview-deactivating")}),1),this.Reveal.getRevealElement().appendChild(this.Reveal.getBackgroundsElement()),t(this.Reveal.getRevealElement(),v).forEach((e=>{a(e,""),e.removeEventListener("click",this.onSlideClicked,!0)})),t(this.Reveal.getBackgroundsElement(),".slide-background").forEach((e=>{a(e,"")})),this.Reveal.transformSlides({overview:""});const e=this.Reveal.getIndices();this.Reveal.slide(e.h,e.v),this.Reveal.layout(),this.Reveal.cueAutoSlide(),this.Reveal.dispatchEvent({type:"overviewhidden",data:{indexh:e.h,indexv:e.v,currentSlide:this.Reveal.getCurrentSlide()}})}}toggle(e){"boolean"==typeof e?e?this.activate():this.deactivate():this.isActive()?this.deactivate():this.activate()}isActive(){return this.active}onSlideClicked(e){if(this.isActive()){e.preventDefault();let t=e.target;for(;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(this.deactivate(),t.nodeName.match(/section/gi))){let e=parseInt(t.getAttribute("data-index-h"),10),i=parseInt(t.getAttribute("data-index-v"),10);this.Reveal.slide(e,i)}}}}class T{constructor(e){this.Reveal=e,this.shortcuts={},this.bindings={},this.onDocumentKeyDown=this.onDocumentKeyDown.bind(this)}configure(e,t){"linear"===e.navigationMode?(this.shortcuts["→ , ↓ , SPACE , N , L , J"]="Next slide",this.shortcuts["← , ↑ , P , H , K"]="Previous slide"):(this.shortcuts["N , SPACE"]="Next slide",this.shortcuts["P , Shift SPACE"]="Previous slide",this.shortcuts["← , H"]="Navigate left",this.shortcuts["→ , L"]="Navigate right",this.shortcuts["↑ , K"]="Navigate up",this.shortcuts["↓ , J"]="Navigate down"),this.shortcuts["Alt + ←/↑/→/↓"]="Navigate without fragments",this.shortcuts["Shift + ←/↑/→/↓"]="Jump to first/last slide",this.shortcuts["B , ."]="Pause",this.shortcuts.F="Fullscreen",this.shortcuts.G="Jump to slide",this.shortcuts["ESC, O"]="Slide overview"}bind(){document.addEventListener("keydown",this.onDocumentKeyDown,!1)}unbind(){document.removeEventListener("keydown",this.onDocumentKeyDown,!1)}addKeyBinding(e,t){"object"==typeof e&&e.keyCode?this.bindings[e.keyCode]={callback:t,key:e.key,description:e.description}:this.bindings[e]={callback:t,key:null,description:null}}removeKeyBinding(e){delete this.bindings[e]}triggerKey(e){this.onDocumentKeyDown({keyCode:e})}registerKeyboardShortcut(e,t){this.shortcuts[e]=t}getShortcuts(){return this.shortcuts}getBindings(){return this.bindings}onDocumentKeyDown(e){let t=this.Reveal.getConfig();if("function"==typeof t.keyboardCondition&&!1===t.keyboardCondition(e))return!0;if("focused"===t.keyboardCondition&&!this.Reveal.isFocused())return!0;let i=e.keyCode,s=!this.Reveal.isAutoSliding();this.Reveal.onUserInput(e);let a=document.activeElement&&!0===document.activeElement.isContentEditable,n=document.activeElement&&document.activeElement.tagName&&/input|textarea/i.test(document.activeElement.tagName),r=document.activeElement&&document.activeElement.className&&/speaker-notes/i.test(document.activeElement.className),o=!(-1!==[32,37,38,39,40,78,80,191].indexOf(e.keyCode)&&e.shiftKey||e.altKey)&&(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey);if(a||n||r||o)return;let l,d=[66,86,190,191];if("object"==typeof t.keyboard)for(l in t.keyboard)"togglePause"===t.keyboard[l]&&d.push(parseInt(l,10));if(this.Reveal.isPaused()&&-1===d.indexOf(i))return!1;let c="linear"===t.navigationMode||!this.Reveal.hasHorizontalSlides()||!this.Reveal.hasVerticalSlides(),h=!1;if("object"==typeof t.keyboard)for(l in t.keyboard)if(parseInt(l,10)===i){let i=t.keyboard[l];"function"==typeof i?i.apply(null,[e]):"string"==typeof i&&"function"==typeof this.Reveal[i]&&this.Reveal[i].call(),h=!0}if(!1===h)for(l in this.bindings)if(parseInt(l,10)===i){let t=this.bindings[l].callback;"function"==typeof t?t.apply(null,[e]):"string"==typeof t&&"function"==typeof this.Reveal[t]&&this.Reveal[t].call(),h=!0}!1===h&&(h=!0,80===i||33===i?this.Reveal.prev({skipFragments:e.altKey}):78===i||34===i?this.Reveal.next({skipFragments:e.altKey}):72===i||37===i?e.shiftKey?this.Reveal.slide(0):!this.Reveal.overview.isActive()&&c?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.left({skipFragments:e.altKey}):76===i||39===i?e.shiftKey?this.Reveal.slide(this.Reveal.getHorizontalSlides().length-1):!this.Reveal.overview.isActive()&&c?this.Reveal.next({skipFragments:e.altKey}):this.Reveal.right({skipFragments:e.altKey}):75===i||38===i?e.shiftKey?this.Reveal.slide(void 0,0):!this.Reveal.overview.isActive()&&c?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.up({skipFragments:e.altKey}):74===i||40===i?e.shiftKey?this.Reveal.slide(void 0,Number.MAX_VALUE):!this.Reveal.overview.isActive()&&c?this.Reveal.next({skipFragments:e.altKey}):this.Reveal.down({skipFragments:e.altKey}):36===i?this.Reveal.slide(0):35===i?this.Reveal.slide(this.Reveal.getHorizontalSlides().length-1):32===i?(this.Reveal.overview.isActive()&&this.Reveal.overview.deactivate(),e.shiftKey?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.next({skipFragments:e.altKey})):[58,59,66,86,190].includes(i)||191===i&&!e.shiftKey?this.Reveal.togglePause():70===i?(e=>{let t=(e=e||document.documentElement).requestFullscreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullscreen;t&&t.apply(e)})(t.embedded?this.Reveal.getViewportElement():document.documentElement):65===i?t.autoSlideStoppable&&this.Reveal.toggleAutoSlide(s):71===i?t.jumpToSlide&&this.Reveal.toggleJumpToSlide():191===i&&e.shiftKey?this.Reveal.toggleHelp():h=!1),h?e.preventDefault&&e.preventDefault():27!==i&&79!==i||(!1===this.Reveal.closeOverlay()&&this.Reveal.overview.toggle(),e.preventDefault&&e.preventDefault()),this.Reveal.cueAutoSlide()}}class N{MAX_REPLACE_STATE_FREQUENCY=1e3;constructor(e){this.Reveal=e,this.writeURLTimeout=0,this.replaceStateTimestamp=0,this.onWindowHashChange=this.onWindowHashChange.bind(this)}bind(){window.addEventListener("hashchange",this.onWindowHashChange,!1)}unbind(){window.removeEventListener("hashchange",this.onWindowHashChange,!1)}getIndicesFromHash(e=window.location.hash,t={}){let i=e.replace(/^#\/?/,""),s=i.split("/");if(/^[0-9]*$/.test(s[0])||!i.length){const e=this.Reveal.getConfig();let i,a=e.hashOneBasedIndex||t.oneBasedIndex?1:0,n=parseInt(s[0],10)-a||0,r=parseInt(s[1],10)-a||0;return e.fragmentInURL&&(i=parseInt(s[2],10),isNaN(i)&&(i=void 0)),{h:n,v:r,f:i}}{let e,t;/\/[-\d]+$/g.test(i)&&(t=parseInt(i.split("/").pop(),10),t=isNaN(t)?void 0:t,i=i.split("/").shift());try{e=document.getElementById(decodeURIComponent(i)).closest(".slides section")}catch(e){}if(e)return{...this.Reveal.getIndices(e),f:t}}return null}readURL(){const e=this.Reveal.getIndices(),t=this.getIndicesFromHash();t?t.h===e.h&&t.v===e.v&&void 0===t.f||this.Reveal.slide(t.h,t.v,t.f):this.Reveal.slide(e.h||0,e.v||0)}writeURL(e){let t=this.Reveal.getConfig(),i=this.Reveal.getCurrentSlide();if(clearTimeout(this.writeURLTimeout),"number"==typeof e)this.writeURLTimeout=setTimeout(this.writeURL,e);else if(i){let e=this.getHash();t.history?window.location.hash=e:t.hash&&("/"===e?this.debouncedReplaceState(window.location.pathname+window.location.search):this.debouncedReplaceState("#"+e))}}replaceState(e){window.history.replaceState(null,null,e),this.replaceStateTimestamp=Date.now()}debouncedReplaceState(e){clearTimeout(this.replaceStateTimeout),Date.now()-this.replaceStateTimestamp>this.MAX_REPLACE_STATE_FREQUENCY?this.replaceState(e):this.replaceStateTimeout=setTimeout((()=>this.replaceState(e)),this.MAX_REPLACE_STATE_FREQUENCY)}getHash(e){let t="/",i=e||this.Reveal.getCurrentSlide(),s=i?i.getAttribute("id"):null;s&&(s=encodeURIComponent(s));let a=this.Reveal.getIndices(e);if(this.Reveal.getConfig().fragmentInURL||(a.f=void 0),"string"==typeof s&&s.length)t="/"+s,a.f>=0&&(t+="/"+a.f);else{let e=this.Reveal.getConfig().hashOneBasedIndex?1:0;(a.h>0||a.v>0||a.f>=0)&&(t+=a.h+e),(a.v>0||a.f>=0)&&(t+="/"+(a.v+e)),a.f>=0&&(t+="/"+a.f)}return t}onWindowHashChange(e){this.readURL()}}class M{constructor(e){this.Reveal=e,this.onNavigateLeftClicked=this.onNavigateLeftClicked.bind(this),this.onNavigateRightClicked=this.onNavigateRightClicked.bind(this),this.onNavigateUpClicked=this.onNavigateUpClicked.bind(this),this.onNavigateDownClicked=this.onNavigateDownClicked.bind(this),this.onNavigatePrevClicked=this.onNavigatePrevClicked.bind(this),this.onNavigateNextClicked=this.onNavigateNextClicked.bind(this)}render(){const e=this.Reveal.getConfig().rtl,i=this.Reveal.getRevealElement();this.element=document.createElement("aside"),this.element.className="controls",this.element.innerHTML=`\n\t\t\t\n\t\t\t\n\t\t\t`,this.Reveal.getRevealElement().appendChild(this.element),this.controlsLeft=t(i,".navigate-left"),this.controlsRight=t(i,".navigate-right"),this.controlsUp=t(i,".navigate-up"),this.controlsDown=t(i,".navigate-down"),this.controlsPrev=t(i,".navigate-prev"),this.controlsNext=t(i,".navigate-next"),this.controlsRightArrow=this.element.querySelector(".navigate-right"),this.controlsLeftArrow=this.element.querySelector(".navigate-left"),this.controlsDownArrow=this.element.querySelector(".navigate-down")}configure(e,t){this.element.style.display=e.controls?"block":"none",this.element.setAttribute("data-controls-layout",e.controlsLayout),this.element.setAttribute("data-controls-back-arrows",e.controlsBackArrows)}bind(){let e=["touchstart","click"];u&&(e=["touchstart"]),e.forEach((e=>{this.controlsLeft.forEach((t=>t.addEventListener(e,this.onNavigateLeftClicked,!1))),this.controlsRight.forEach((t=>t.addEventListener(e,this.onNavigateRightClicked,!1))),this.controlsUp.forEach((t=>t.addEventListener(e,this.onNavigateUpClicked,!1))),this.controlsDown.forEach((t=>t.addEventListener(e,this.onNavigateDownClicked,!1))),this.controlsPrev.forEach((t=>t.addEventListener(e,this.onNavigatePrevClicked,!1))),this.controlsNext.forEach((t=>t.addEventListener(e,this.onNavigateNextClicked,!1)))}))}unbind(){["touchstart","click"].forEach((e=>{this.controlsLeft.forEach((t=>t.removeEventListener(e,this.onNavigateLeftClicked,!1))),this.controlsRight.forEach((t=>t.removeEventListener(e,this.onNavigateRightClicked,!1))),this.controlsUp.forEach((t=>t.removeEventListener(e,this.onNavigateUpClicked,!1))),this.controlsDown.forEach((t=>t.removeEventListener(e,this.onNavigateDownClicked,!1))),this.controlsPrev.forEach((t=>t.removeEventListener(e,this.onNavigatePrevClicked,!1))),this.controlsNext.forEach((t=>t.removeEventListener(e,this.onNavigateNextClicked,!1)))}))}update(){let e=this.Reveal.availableRoutes();[...this.controlsLeft,...this.controlsRight,...this.controlsUp,...this.controlsDown,...this.controlsPrev,...this.controlsNext].forEach((e=>{e.classList.remove("enabled","fragmented"),e.setAttribute("disabled","disabled")})),e.left&&this.controlsLeft.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.right&&this.controlsRight.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.up&&this.controlsUp.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.down&&this.controlsDown.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),(e.left||e.up)&&this.controlsPrev.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),(e.right||e.down)&&this.controlsNext.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")}));let t=this.Reveal.getCurrentSlide();if(t){let e=this.Reveal.fragments.availableRoutes();e.prev&&this.controlsPrev.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsNext.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),this.Reveal.isVerticalSlide(t)?(e.prev&&this.controlsUp.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsDown.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")}))):(e.prev&&this.controlsLeft.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsRight.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})))}if(this.Reveal.getConfig().controlsTutorial){let t=this.Reveal.getIndices();!this.Reveal.hasNavigatedVertically()&&e.down?this.controlsDownArrow.classList.add("highlight"):(this.controlsDownArrow.classList.remove("highlight"),this.Reveal.getConfig().rtl?!this.Reveal.hasNavigatedHorizontally()&&e.left&&0===t.v?this.controlsLeftArrow.classList.add("highlight"):this.controlsLeftArrow.classList.remove("highlight"):!this.Reveal.hasNavigatedHorizontally()&&e.right&&0===t.v?this.controlsRightArrow.classList.add("highlight"):this.controlsRightArrow.classList.remove("highlight"))}}destroy(){this.unbind(),this.element.remove()}onNavigateLeftClicked(e){e.preventDefault(),this.Reveal.onUserInput(),"linear"===this.Reveal.getConfig().navigationMode?this.Reveal.prev():this.Reveal.left()}onNavigateRightClicked(e){e.preventDefault(),this.Reveal.onUserInput(),"linear"===this.Reveal.getConfig().navigationMode?this.Reveal.next():this.Reveal.right()}onNavigateUpClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.up()}onNavigateDownClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.down()}onNavigatePrevClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.prev()}onNavigateNextClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.next()}}class I{constructor(e){this.Reveal=e,this.onProgressClicked=this.onProgressClicked.bind(this)}render(){this.element=document.createElement("div"),this.element.className="progress",this.Reveal.getRevealElement().appendChild(this.element),this.bar=document.createElement("span"),this.element.appendChild(this.bar)}configure(e,t){this.element.style.display=e.progress?"block":"none"}bind(){this.Reveal.getConfig().progress&&this.element&&this.element.addEventListener("click",this.onProgressClicked,!1)}unbind(){this.Reveal.getConfig().progress&&this.element&&this.element.removeEventListener("click",this.onProgressClicked,!1)}update(){if(this.Reveal.getConfig().progress&&this.bar){let e=this.Reveal.getProgress();this.Reveal.getTotalSlides()<2&&(e=0),this.bar.style.transform="scaleX("+e+")"}}getMaxWidth(){return this.Reveal.getRevealElement().offsetWidth}onProgressClicked(e){this.Reveal.onUserInput(e),e.preventDefault();let t=this.Reveal.getSlides(),i=t.length,s=Math.floor(e.clientX/this.getMaxWidth()*i);this.Reveal.getConfig().rtl&&(s=i-s);let a=this.Reveal.getIndices(t[s]);this.Reveal.slide(a.h,a.v)}destroy(){this.element.remove()}}class B{constructor(e){this.Reveal=e,this.lastMouseWheelStep=0,this.cursorHidden=!1,this.cursorInactiveTimeout=0,this.onDocumentCursorActive=this.onDocumentCursorActive.bind(this),this.onDocumentMouseScroll=this.onDocumentMouseScroll.bind(this)}configure(e,t){e.mouseWheel?document.addEventListener("wheel",this.onDocumentMouseScroll,!1):document.removeEventListener("wheel",this.onDocumentMouseScroll,!1),e.hideInactiveCursor?(document.addEventListener("mousemove",this.onDocumentCursorActive,!1),document.addEventListener("mousedown",this.onDocumentCursorActive,!1)):(this.showCursor(),document.removeEventListener("mousemove",this.onDocumentCursorActive,!1),document.removeEventListener("mousedown",this.onDocumentCursorActive,!1))}showCursor(){this.cursorHidden&&(this.cursorHidden=!1,this.Reveal.getRevealElement().style.cursor="")}hideCursor(){!1===this.cursorHidden&&(this.cursorHidden=!0,this.Reveal.getRevealElement().style.cursor="none")}destroy(){this.showCursor(),document.removeEventListener("wheel",this.onDocumentMouseScroll,!1),document.removeEventListener("mousemove",this.onDocumentCursorActive,!1),document.removeEventListener("mousedown",this.onDocumentCursorActive,!1)}onDocumentCursorActive(e){this.showCursor(),clearTimeout(this.cursorInactiveTimeout),this.cursorInactiveTimeout=setTimeout(this.hideCursor.bind(this),this.Reveal.getConfig().hideCursorTime)}onDocumentMouseScroll(e){if(Date.now()-this.lastMouseWheelStep>1e3){this.lastMouseWheelStep=Date.now();let t=e.detail||-e.wheelDelta;t>0?this.Reveal.next():t<0&&this.Reveal.prev()}}}const H=(e,t)=>{const i=document.createElement("script");i.type="text/javascript",i.async=!1,i.defer=!1,i.src=e,"function"==typeof t&&(i.onload=i.onreadystatechange=e=>{("load"===e.type||/loaded|complete/.test(i.readyState))&&(i.onload=i.onreadystatechange=i.onerror=null,t())},i.onerror=e=>{i.onload=i.onreadystatechange=i.onerror=null,t(new Error("Failed loading script: "+i.src+"\n"+e))});const s=document.querySelector("head");s.insertBefore(i,s.lastChild)};class D{constructor(e){this.Reveal=e,this.state="idle",this.registeredPlugins={},this.asyncDependencies=[]}load(e,t){return this.state="loading",e.forEach(this.registerPlugin.bind(this)),new Promise((e=>{let i=[],s=0;if(t.forEach((e=>{e.condition&&!e.condition()||(e.async?this.asyncDependencies.push(e):i.push(e))})),i.length){s=i.length;const t=t=>{t&&"function"==typeof t.callback&&t.callback(),0==--s&&this.initPlugins().then(e)};i.forEach((e=>{"string"==typeof e.id?(this.registerPlugin(e),t(e)):"string"==typeof e.src?H(e.src,(()=>t(e))):(console.warn("Unrecognized plugin format",e),t())}))}else this.initPlugins().then(e)}))}initPlugins(){return new Promise((e=>{let t=Object.values(this.registeredPlugins),i=t.length;if(0===i)this.loadAsync().then(e);else{let s,a=()=>{0==--i?this.loadAsync().then(e):s()},n=0;s=()=>{let e=t[n++];if("function"==typeof e.init){let t=e.init(this.Reveal);t&&"function"==typeof t.then?t.then(a):a()}else a()},s()}}))}loadAsync(){return this.state="loaded",this.asyncDependencies.length&&this.asyncDependencies.forEach((e=>{H(e.src,e.callback)})),Promise.resolve()}registerPlugin(e){2===arguments.length&&"string"==typeof arguments[0]?(e=arguments[1]).id=arguments[0]:"function"==typeof e&&(e=e());let t=e.id;"string"!=typeof t?console.warn("Unrecognized plugin format; can't find plugin.id",e):void 0===this.registeredPlugins[t]?(this.registeredPlugins[t]=e,"loaded"===this.state&&"function"==typeof e.init&&e.init(this.Reveal)):console.warn('reveal.js: "'+t+'" plugin has already been registered')}hasPlugin(e){return!!this.registeredPlugins[e]}getPlugin(e){return this.registeredPlugins[e]}getRegisteredPlugins(){return this.registeredPlugins}destroy(){Object.values(this.registeredPlugins).forEach((e=>{"function"==typeof e.destroy&&e.destroy()})),this.registeredPlugins={},this.asyncDependencies=[]}}class F{constructor(e){this.Reveal=e,this.touchStartX=0,this.touchStartY=0,this.touchStartCount=0,this.touchCaptured=!1,this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),this.onTouchStart=this.onTouchStart.bind(this),this.onTouchMove=this.onTouchMove.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this)}bind(){let e=this.Reveal.getRevealElement();"onpointerdown"in window?(e.addEventListener("pointerdown",this.onPointerDown,!1),e.addEventListener("pointermove",this.onPointerMove,!1),e.addEventListener("pointerup",this.onPointerUp,!1)):window.navigator.msPointerEnabled?(e.addEventListener("MSPointerDown",this.onPointerDown,!1),e.addEventListener("MSPointerMove",this.onPointerMove,!1),e.addEventListener("MSPointerUp",this.onPointerUp,!1)):(e.addEventListener("touchstart",this.onTouchStart,!1),e.addEventListener("touchmove",this.onTouchMove,!1),e.addEventListener("touchend",this.onTouchEnd,!1))}unbind(){let e=this.Reveal.getRevealElement();e.removeEventListener("pointerdown",this.onPointerDown,!1),e.removeEventListener("pointermove",this.onPointerMove,!1),e.removeEventListener("pointerup",this.onPointerUp,!1),e.removeEventListener("MSPointerDown",this.onPointerDown,!1),e.removeEventListener("MSPointerMove",this.onPointerMove,!1),e.removeEventListener("MSPointerUp",this.onPointerUp,!1),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1)}isSwipePrevented(e){if(n(e,"video, audio"))return!0;for(;e&&"function"==typeof e.hasAttribute;){if(e.hasAttribute("data-prevent-swipe"))return!0;e=e.parentNode}return!1}onTouchStart(e){if(this.isSwipePrevented(e.target))return!0;this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY,this.touchStartCount=e.touches.length}onTouchMove(e){if(this.isSwipePrevented(e.target))return!0;let t=this.Reveal.getConfig();if(this.touchCaptured)u&&e.preventDefault();else{this.Reveal.onUserInput(e);let i=e.touches[0].clientX,s=e.touches[0].clientY;if(1===e.touches.length&&2!==this.touchStartCount){let a=this.Reveal.availableRoutes({includeFragments:!0}),n=i-this.touchStartX,r=s-this.touchStartY;n>40&&Math.abs(n)>Math.abs(r)?(this.touchCaptured=!0,"linear"===t.navigationMode?t.rtl?this.Reveal.next():this.Reveal.prev():this.Reveal.left()):n<-40&&Math.abs(n)>Math.abs(r)?(this.touchCaptured=!0,"linear"===t.navigationMode?t.rtl?this.Reveal.prev():this.Reveal.next():this.Reveal.right()):r>40&&a.up?(this.touchCaptured=!0,"linear"===t.navigationMode?this.Reveal.prev():this.Reveal.up()):r<-40&&a.down&&(this.touchCaptured=!0,"linear"===t.navigationMode?this.Reveal.next():this.Reveal.down()),t.embedded?(this.touchCaptured||this.Reveal.isVerticalSlide())&&e.preventDefault():e.preventDefault()}}}onTouchEnd(e){this.touchCaptured=!1}onPointerDown(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchStart(e))}onPointerMove(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchMove(e))}onPointerUp(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchEnd(e))}}const z="focus",q="blur";class O{constructor(e){this.Reveal=e,this.onRevealPointerDown=this.onRevealPointerDown.bind(this),this.onDocumentPointerDown=this.onDocumentPointerDown.bind(this)}configure(e,t){e.embedded?this.blur():(this.focus(),this.unbind())}bind(){this.Reveal.getConfig().embedded&&this.Reveal.getRevealElement().addEventListener("pointerdown",this.onRevealPointerDown,!1)}unbind(){this.Reveal.getRevealElement().removeEventListener("pointerdown",this.onRevealPointerDown,!1),document.removeEventListener("pointerdown",this.onDocumentPointerDown,!1)}focus(){this.state!==z&&(this.Reveal.getRevealElement().classList.add("focused"),document.addEventListener("pointerdown",this.onDocumentPointerDown,!1)),this.state=z}blur(){this.state!==q&&(this.Reveal.getRevealElement().classList.remove("focused"),document.removeEventListener("pointerdown",this.onDocumentPointerDown,!1)),this.state=q}isFocused(){return this.state===z}destroy(){this.Reveal.getRevealElement().classList.remove("focused")}onRevealPointerDown(e){this.focus()}onDocumentPointerDown(e){let t=r(e.target,".reveal");t&&t===this.Reveal.getRevealElement()||this.blur()}}class W{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="speaker-notes",this.element.setAttribute("data-prevent-swipe",""),this.element.setAttribute("tabindex","0"),this.Reveal.getRevealElement().appendChild(this.element)}configure(e,t){e.showNotes&&this.element.setAttribute("data-layout","string"==typeof e.showNotes?e.showNotes:"inline")}update(){this.Reveal.getConfig().showNotes&&this.element&&this.Reveal.getCurrentSlide()&&!this.Reveal.isScrollView()&&!this.Reveal.isPrintView()&&(this.element.innerHTML=this.getSlideNotes()||'No notes on this slide.')}updateVisibility(){this.Reveal.getConfig().showNotes&&this.hasNotes()&&!this.Reveal.isScrollView()&&!this.Reveal.isPrintView()?this.Reveal.getRevealElement().classList.add("show-notes"):this.Reveal.getRevealElement().classList.remove("show-notes")}hasNotes(){return this.Reveal.getSlidesElement().querySelectorAll("[data-notes], aside.notes").length>0}isSpeakerNotesWindow(){return!!window.location.search.match(/receiver/gi)}getSlideNotes(e=this.Reveal.getCurrentSlide()){if(e.hasAttribute("data-notes"))return e.getAttribute("data-notes");let t=e.querySelectorAll("aside.notes");return t?Array.from(t).map((e=>e.innerHTML)).join("\n"):null}destroy(){this.element.remove()}}class U{constructor(e,t){this.diameter=100,this.diameter2=this.diameter/2,this.thickness=6,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=e,this.progressCheck=t,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.canvas.style.width=this.diameter2+"px",this.canvas.style.height=this.diameter2+"px",this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}setPlaying(e){const t=this.playing;this.playing=e,!t&&this.playing?this.animate():this.render()}animate(){const e=this.progress;this.progress=this.progressCheck(),e>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&requestAnimationFrame(this.animate.bind(this))}render(){let e=this.playing?this.progress:0,t=this.diameter2-this.thickness,i=this.diameter2,s=this.diameter2,a=28;this.progressOffset+=.1*(1-this.progressOffset);const n=-Math.PI/2+e*(2*Math.PI),r=-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(i,s,t+4,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(i,s,t,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="rgba( 255, 255, 255, 0.2 )",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(i,s,t,r,n,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(i-14,s-14),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,10,a),this.context.fillRect(18,0,10,a)):(this.context.beginPath(),this.context.translate(4,0),this.context.moveTo(0,0),this.context.lineTo(24,14),this.context.lineTo(0,a),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()}on(e,t){this.canvas.addEventListener(e,t,!1)}off(e,t){this.canvas.removeEventListener(e,t,!1)}destroy(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)}}var V={width:960,height:700,margin:.04,minScale:.2,maxScale:2,controls:!0,controlsTutorial:!0,controlsLayout:"bottom-right",controlsBackArrows:"faded",progress:!0,slideNumber:!1,showSlideNumber:"all",hashOneBasedIndex:!1,hash:!1,respondToHashChanges:!0,jumpToSlide:!0,history:!1,keyboard:!0,keyboardCondition:null,disableLayout:!1,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,navigationMode:"default",shuffle:!1,fragments:!0,fragmentInURL:!0,embedded:!1,help:!0,pause:!0,showNotes:!1,showHiddenSlides:!1,autoPlayMedia:null,preloadIframes:null,autoAnimate:!0,autoAnimateMatcher:null,autoAnimateEasing:"ease",autoAnimateDuration:1,autoAnimateUnmatched:!0,autoAnimateStyles:["opacity","color","background-color","padding","font-size","line-height","letter-spacing","border-width","border-color","border-radius","outline","outline-offset"],autoSlide:0,autoSlideStoppable:!0,autoSlideMethod:null,defaultTiming:null,mouseWheel:!1,previewLinks:!1,postMessage:!0,postMessageEvents:!1,focusBodyOnPageVisibilityChange:!0,transition:"slide",transitionSpeed:"default",backgroundTransition:"fade",parallaxBackgroundImage:"",parallaxBackgroundSize:"",parallaxBackgroundRepeat:"",parallaxBackgroundPosition:"",parallaxBackgroundHorizontal:null,parallaxBackgroundVertical:null,view:null,scrollLayout:"full",scrollSnap:"mandatory",scrollProgress:"auto",scrollActivationWidth:435,pdfMaxPagesPerSlide:Number.POSITIVE_INFINITY,pdfSeparateFragments:!0,pdfPageHeightOffset:-1,viewDistance:3,mobileViewDistance:2,display:"block",hideInactiveCursor:!0,hideCursorTime:5e3,sortFragmentsOnSync:!0,dependencies:[],plugins:[]};const j="5.0.1";function K(n,o){arguments.length<2&&(o=arguments[0],n=document.querySelector(".reveal"));const d={};let c,u,g,b,S,R={},H=!1,z={hasNavigatedHorizontally:!1,hasNavigatedVertically:!1},q=[],K=1,$={layout:"",overview:""},X={},Y="idle",_=0,J=0,G=-1,Q=!1,Z=new p(d),ee=new w(d),te=new E(d),ie=new k(d),se=new A(d),ae=new L(d),ne=new C(d),re=new x(d),oe=new P(d),le=new T(d),de=new N(d),ce=new M(d),he=new I(d),ue=new B(d),ge=new D(d),pe=new O(d),ve=new F(d),me=new W(d);function fe(){H=!0,R.showHiddenSlides||t(X.wrapper,'section[data-visibility="hidden"]').forEach((e=>{const t=e.parentNode;1===t.childElementCount&&/section/i.test(t.nodeName)?t.remove():e.remove()})),function(){X.slides.classList.add("no-transition"),h?X.wrapper.classList.add("no-hover"):X.wrapper.classList.remove("no-hover");se.render(),ee.render(),te.render(),ce.render(),he.render(),me.render(),X.pauseOverlay=((e,t,i,s="")=>{let a=e.querySelectorAll("."+i);for(let t=0;tResume presentation':null),X.statusElement=function(){let e=X.wrapper.querySelector(".aria-status");e||(e=document.createElement("div"),e.style.position="absolute",e.style.height="1px",e.style.width="1px",e.style.overflow="hidden",e.style.clip="rect( 1px, 1px, 1px, 1px )",e.classList.add("aria-status"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),X.wrapper.appendChild(e));return e}(),X.wrapper.setAttribute("role","application")}(),R.postMessage&&window.addEventListener("message",St,!1),setInterval((()=>{(!ae.isActive()&&0!==X.wrapper.scrollTop||0!==X.wrapper.scrollLeft)&&(X.wrapper.scrollTop=0,X.wrapper.scrollLeft=0)}),1e3),document.addEventListener("fullscreenchange",Ct),document.addEventListener("webkitfullscreenchange",Ct),nt().forEach((e=>{t(e,"section").forEach(((e,t)=>{t>0&&(e.classList.remove("present"),e.classList.remove("past"),e.classList.add("future"),e.setAttribute("aria-hidden","true"))}))})),we(),se.update(!0),function(){const e="print"===R.view,t="scroll"===R.view||"reader"===R.view;(e||t)&&(e?Se():ve.unbind(),X.viewport.classList.add("loading-scroll-mode"),e?"complete"===document.readyState?ne.activate():window.addEventListener("load",(()=>ne.activate())):ae.activate())}(),de.readURL(),setTimeout((()=>{X.slides.classList.remove("no-transition"),X.wrapper.classList.add("ready"),Le({type:"ready",data:{indexh:c,indexv:u,currentSlide:b}})}),1)}function ye(e){X.statusElement.textContent=e}function be(e){let t="";if(3===e.nodeType)t+=e.textContent;else if(1===e.nodeType){let i=e.getAttribute("aria-hidden"),s="none"===window.getComputedStyle(e).display;"true"===i||s||Array.from(e.childNodes).forEach((e=>{t+=be(e)}))}return t=t.trim(),""===t?"":t+" "}function we(t){const s={...R};if("object"==typeof t&&e(R,t),!1===d.isReady())return;const a=X.wrapper.querySelectorAll(v).length;X.wrapper.classList.remove(s.transition),X.wrapper.classList.add(R.transition),X.wrapper.setAttribute("data-transition-speed",R.transitionSpeed),X.wrapper.setAttribute("data-background-transition",R.backgroundTransition),X.viewport.style.setProperty("--slide-width","string"==typeof R.width?R.width:R.width+"px"),X.viewport.style.setProperty("--slide-height","string"==typeof R.height?R.height:R.height+"px"),R.shuffle&&Je(),i(X.wrapper,"embedded",R.embedded),i(X.wrapper,"rtl",R.rtl),i(X.wrapper,"center",R.center),!1===R.pause&&je(),R.previewLinks?(Pe(),Te("[data-preview-link=false]")):(Te(),Pe("[data-preview-link]:not([data-preview-link=false])")),ie.reset(),S&&(S.destroy(),S=null),a>1&&R.autoSlide&&R.autoSlideStoppable&&(S=new U(X.wrapper,(()=>Math.min(Math.max((Date.now()-G)/_,0),1))),S.on("click",Pt),Q=!1),"default"!==R.navigationMode?X.wrapper.setAttribute("data-navigation-mode",R.navigationMode):X.wrapper.removeAttribute("data-navigation-mode"),me.configure(R,s),pe.configure(R,s),ue.configure(R,s),ce.configure(R,s),he.configure(R,s),le.configure(R,s),re.configure(R,s),ee.configure(R,s),_e()}function Ee(){window.addEventListener("resize",kt,!1),R.touch&&ve.bind(),R.keyboard&&le.bind(),R.progress&&he.bind(),R.respondToHashChanges&&de.bind(),ce.bind(),pe.bind(),X.slides.addEventListener("click",Rt,!1),X.slides.addEventListener("transitionend",At,!1),X.pauseOverlay.addEventListener("click",je,!1),R.focusBodyOnPageVisibilityChange&&document.addEventListener("visibilitychange",Lt,!1)}function Se(){ve.unbind(),pe.unbind(),le.unbind(),ce.unbind(),he.unbind(),de.unbind(),window.removeEventListener("resize",kt,!1),X.slides.removeEventListener("click",Rt,!1),X.slides.removeEventListener("transitionend",At,!1),X.pauseOverlay.removeEventListener("click",je,!1)}function Ae(e,t,i){n.addEventListener(e,t,i)}function Re(e,t,i){n.removeEventListener(e,t,i)}function ke(e){"string"==typeof e.layout&&($.layout=e.layout),"string"==typeof e.overview&&($.overview=e.overview),$.layout?a(X.slides,$.layout+" "+$.overview):a(X.slides,$.overview)}function Le({target:t=X.wrapper,type:i,data:s,bubbles:a=!0}){let n=document.createEvent("HTMLEvents",1,2);return n.initEvent(i,a,!0),e(n,s),t.dispatchEvent(n),t===X.wrapper&&xe(i),n}function Ce(e){Le({type:"slidechanged",data:{indexh:c,indexv:u,previousSlide:g,currentSlide:b,origin:e}})}function xe(t,i){if(R.postMessageEvents&&window.parent!==window.self){let s={namespace:"reveal",eventName:t,state:ht()};e(s,i),window.parent.postMessage(JSON.stringify(s),"*")}}function Pe(e="a"){Array.from(X.wrapper.querySelectorAll(e)).forEach((e=>{/^(http|www)/gi.test(e.getAttribute("href"))&&e.addEventListener("click",xt,!1)}))}function Te(e="a"){Array.from(X.wrapper.querySelectorAll(e)).forEach((e=>{/^(http|www)/gi.test(e.getAttribute("href"))&&e.removeEventListener("click",xt,!1)}))}function Ne(e){Ie(),X.overlay=document.createElement("div"),X.overlay.classList.add("overlay"),X.overlay.classList.add("overlay-preview"),X.wrapper.appendChild(X.overlay),X.overlay.innerHTML=`
\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tUnable to load iframe. This is likely due to the site's policy (x-frame-options).\n\t\t\t\t\n\t\t\t
`,X.overlay.querySelector("iframe").addEventListener("load",(e=>{X.overlay.classList.add("loaded")}),!1),X.overlay.querySelector(".close").addEventListener("click",(e=>{Ie(),e.preventDefault()}),!1),X.overlay.querySelector(".external").addEventListener("click",(e=>{Ie()}),!1)}function Me(){if(R.help){Ie(),X.overlay=document.createElement("div"),X.overlay.classList.add("overlay"),X.overlay.classList.add("overlay-help"),X.wrapper.appendChild(X.overlay);let e='

Keyboard Shortcuts


',t=le.getShortcuts(),i=le.getBindings();e+="";for(let i in t)e+=``;for(let t in i)i[t].key&&i[t].description&&(e+=``);e+="
KEYACTION
${i}${t[i]}
${i[t].key}${i[t].description}
",X.overlay.innerHTML=`\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
${e}
\n\t\t\t\t
\n\t\t\t`,X.overlay.querySelector(".close").addEventListener("click",(e=>{Ie(),e.preventDefault()}),!1)}}function Ie(){return!!X.overlay&&(X.overlay.parentNode.removeChild(X.overlay),X.overlay=null,!0)}function Be(){if(X.wrapper&&!ne.isActive()){const e=X.viewport.offsetWidth,t=X.viewport.offsetHeight;if(!R.disableLayout){h&&!R.embedded&&document.documentElement.style.setProperty("--vh",.01*window.innerHeight+"px");const i=ae.isActive()?De(e,t):De(),s=K;He(R.width,R.height),X.slides.style.width=i.width+"px",X.slides.style.height=i.height+"px",K=Math.min(i.presentationWidth/i.width,i.presentationHeight/i.height),K=Math.max(K,R.minScale),K=Math.min(K,R.maxScale),1===K||ae.isActive()?(X.slides.style.zoom="",X.slides.style.left="",X.slides.style.top="",X.slides.style.bottom="",X.slides.style.right="",ke({layout:""})):(X.slides.style.zoom="",X.slides.style.left="50%",X.slides.style.top="50%",X.slides.style.bottom="auto",X.slides.style.right="auto",ke({layout:"translate(-50%, -50%) scale("+K+")"}));const a=Array.from(X.wrapper.querySelectorAll(v));for(let e=0,t=a.length;e0&&i.presentationWidth<=R.scrollActivationWidth?ae.isActive()||ae.activate():ae.isActive()&&ae.deactivate())}X.viewport.style.setProperty("--slide-scale",K),X.viewport.style.setProperty("--viewport-width",e+"px"),X.viewport.style.setProperty("--viewport-height",t+"px"),ae.layout(),he.update(),se.updateParallax(),oe.isActive()&&oe.update()}}function He(e,i){t(X.slides,"section > .stretch, section > .r-stretch").forEach((t=>{let s=((e,t=0)=>{if(e){let i,s=e.style.height;return e.style.height="0px",e.parentNode.style.height="auto",i=t-e.parentNode.offsetHeight,e.style.height=s+"px",e.parentNode.style.removeProperty("height"),i}return t})(t,i);if(/(img|video)/gi.test(t.nodeName)){const i=t.naturalWidth||t.videoWidth,a=t.naturalHeight||t.videoHeight,n=Math.min(e/i,s/a);t.style.width=i*n+"px",t.style.height=a*n+"px"}else t.style.width=e+"px",t.style.height=s+"px"}))}function De(e,t){let i=R.width,s=R.height;R.disableLayout&&(i=X.slides.offsetWidth,s=X.slides.offsetHeight);const a={width:i,height:s,presentationWidth:e||X.wrapper.offsetWidth,presentationHeight:t||X.wrapper.offsetHeight};return a.presentationWidth-=a.presentationWidth*R.margin,a.presentationHeight-=a.presentationHeight*R.margin,"string"==typeof a.width&&/%$/.test(a.width)&&(a.width=parseInt(a.width,10)/100*a.presentationWidth),"string"==typeof a.height&&/%$/.test(a.height)&&(a.height=parseInt(a.height,10)/100*a.presentationHeight),a}function Fe(e,t){"object"==typeof e&&"function"==typeof e.setAttribute&&e.setAttribute("data-previous-indexv",t||0)}function ze(e){if("object"==typeof e&&"function"==typeof e.setAttribute&&e.classList.contains("stack")){const t=e.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(e.getAttribute(t)||0,10)}return 0}function qe(e=b){return e&&e.parentNode&&!!e.parentNode.nodeName.match(/section/i)}function Oe(){return!(!b||!qe(b))&&!b.nextElementSibling}function We(){return 0===c&&0===u}function Ue(){return!!b&&(!b.nextElementSibling&&(!qe(b)||!b.parentNode.nextElementSibling))}function Ve(){if(R.pause){const e=X.wrapper.classList.contains("paused");gt(),X.wrapper.classList.add("paused"),!1===e&&Le({type:"paused"})}}function je(){const e=X.wrapper.classList.contains("paused");X.wrapper.classList.remove("paused"),ut(),e&&Le({type:"resumed"})}function Ke(e){"boolean"==typeof e?e?Ve():je():$e()?je():Ve()}function $e(){return X.wrapper.classList.contains("paused")}function Xe(e,i,s,a){if(Le({type:"beforeslidechange",data:{indexh:void 0===e?c:e,indexv:void 0===i?u:i,origin:a}}).defaultPrevented)return;g=b;const n=X.wrapper.querySelectorAll(m);if(ae.isActive()){const t=ae.getSlideByIndices(e,i);return void(t&&ae.scrollToSlide(t))}if(0===n.length)return;void 0!==i||oe.isActive()||(i=ze(n[e])),g&&g.parentNode&&g.parentNode.classList.contains("stack")&&Fe(g.parentNode,u);const r=q.concat();q.length=0;let o=c||0,l=u||0;c=Ge(m,void 0===e?c:e),u=Ge(f,void 0===i?u:i);let d=c!==o||u!==l;d||(g=null);let h=n[c],p=h.querySelectorAll("section");b=p[u]||h;let v=!1;d&&g&&b&&!oe.isActive()&&(Y="running",v=Ye(g,b,o,l),v&&X.slides.classList.add("disable-slide-transitions")),et(),Be(),oe.isActive()&&oe.update(),void 0!==s&&re.goto(s),g&&g!==b&&(g.classList.remove("present"),g.setAttribute("aria-hidden","true"),We()&&setTimeout((()=>{t(X.wrapper,m+".stack").forEach((e=>{Fe(e,0)}))}),0));e:for(let e=0,t=q.length;e{ye(be(b))})),he.update(),ce.update(),me.update(),se.update(),se.updateParallax(),ee.update(),re.update(),de.writeURL(),ut(),v&&(setTimeout((()=>{X.slides.classList.remove("disable-slide-transitions")}),0),R.autoAnimate&&ie.run(g,b))}function Ye(e,t,i,s){return e.hasAttribute("data-auto-animate")&&t.hasAttribute("data-auto-animate")&&e.getAttribute("data-auto-animate-id")===t.getAttribute("data-auto-animate-id")&&!(c>i||u>s?t:e).hasAttribute("data-auto-animate-restart")}function _e(){Se(),Ee(),Be(),_=R.autoSlide,ut(),se.create(),de.writeURL(),!0===R.sortFragmentsOnSync&&re.sortAll(),ce.update(),he.update(),et(),me.update(),me.updateVisibility(),se.update(!0),ee.update(),Z.formatEmbeddedContent(),!1===R.autoPlayMedia?Z.stopEmbeddedContent(b,{unloadIframes:!1}):Z.startEmbeddedContent(b),oe.isActive()&&oe.layout()}function Je(e=nt()){e.forEach(((t,i)=>{let s=e[Math.floor(Math.random()*e.length)];s.parentNode===t.parentNode&&t.parentNode.insertBefore(t,s);let a=t.querySelectorAll("section");a.length&&Je(a)}))}function Ge(e,i){let s=t(X.wrapper,e),a=s.length,n=ae.isActive()||ne.isActive(),r=!1,o=!1;if(a){R.loop&&(i>=a&&(r=!0),(i%=a)<0&&(i=a+i,o=!0)),i=Math.max(Math.min(i,a-1),0);for(let e=0;ei?(t.classList.add(a?"past":"future"),R.fragments&&Ze(t)):e===i&&R.fragments&&(r?Ze(t):o&&Qe(t))}let e=s[i],t=e.classList.contains("present");e.classList.add("present"),e.removeAttribute("hidden"),e.removeAttribute("aria-hidden"),t||Le({target:e,type:"visible",bubbles:!1});let l=e.getAttribute("data-state");l&&(q=q.concat(l.split(" ")))}else i=0;return i}function Qe(e){t(e,".fragment").forEach((e=>{e.classList.add("visible"),e.classList.remove("current-fragment")}))}function Ze(e){t(e,".fragment.visible").forEach((e=>{e.classList.remove("visible","current-fragment")}))}function et(){let e,i,s=nt(),a=s.length;if(a&&void 0!==c){let n=oe.isActive()?10:R.viewDistance;h&&(n=oe.isActive()?6:R.mobileViewDistance),ne.isActive()&&(n=Number.MAX_VALUE);for(let r=0;r0,right:c0,down:u1&&(s.left=!0,s.right=!0),i.length>1&&(s.up=!0,s.down=!0)),t.length>1&&"linear"===R.navigationMode&&(s.right=s.right||s.down,s.left=s.left||s.up),!0===e){let e=re.availableRoutes();s.left=s.left||e.prev,s.up=s.up||e.prev,s.down=s.down||e.next,s.right=s.right||e.next}if(R.rtl){let e=s.left;s.left=s.right,s.right=e}return s}function it(e=b){let t=nt(),i=0;e:for(let s=0;s0){let e=b.querySelector(".current-fragment");i=e&&e.hasAttribute("data-fragment-index")?parseInt(e.getAttribute("data-fragment-index"),10):b.querySelectorAll(".fragment.visible").length-1}}return{h:s,v:a,f:i}}function at(){return t(X.wrapper,v+':not(.stack):not([data-visibility="uncounted"])')}function nt(){return t(X.wrapper,m)}function rt(){return t(X.wrapper,".slides>section>section")}function ot(){return nt().length>1}function lt(){return rt().length>1}function dt(){return at().length}function ct(e,t){let i=nt()[e],s=i&&i.querySelectorAll("section");return s&&s.length&&"number"==typeof t?s?s[t]:void 0:i}function ht(){let e=st();return{indexh:e.h,indexv:e.v,indexf:e.f,paused:$e(),overview:oe.isActive()}}function ut(){if(gt(),b&&!1!==R.autoSlide){let e=b.querySelector(".current-fragment[data-autoslide]"),i=e?e.getAttribute("data-autoslide"):null,s=b.parentNode?b.parentNode.getAttribute("data-autoslide"):null,a=b.getAttribute("data-autoslide");i?_=parseInt(i,10):a?_=parseInt(a,10):s?_=parseInt(s,10):(_=R.autoSlide,0===b.querySelectorAll(".fragment").length&&t(b,"video, audio").forEach((e=>{e.hasAttribute("data-autoplay")&&_&&1e3*e.duration/e.playbackRate>_&&(_=1e3*e.duration/e.playbackRate+1e3)}))),!_||Q||$e()||oe.isActive()||Ue()&&!re.availableRoutes().next&&!0!==R.loop||(J=setTimeout((()=>{"function"==typeof R.autoSlideMethod?R.autoSlideMethod():Et(),ut()}),_),G=Date.now()),S&&S.setPlaying(-1!==J)}}function gt(){clearTimeout(J),J=-1}function pt(){_&&!Q&&(Q=!0,Le({type:"autoslidepaused"}),clearTimeout(J),S&&S.setPlaying(!1))}function vt(){_&&Q&&(Q=!1,Le({type:"autoslideresumed"}),ut())}function mt({skipFragments:e=!1}={}){z.hasNavigatedHorizontally=!0,R.rtl?(oe.isActive()||e||!1===re.next())&&tt().left&&Xe(c+1,"grid"===R.navigationMode?u:void 0):(oe.isActive()||e||!1===re.prev())&&tt().left&&Xe(c-1,"grid"===R.navigationMode?u:void 0)}function ft({skipFragments:e=!1}={}){z.hasNavigatedHorizontally=!0,R.rtl?(oe.isActive()||e||!1===re.prev())&&tt().right&&Xe(c-1,"grid"===R.navigationMode?u:void 0):(oe.isActive()||e||!1===re.next())&&tt().right&&Xe(c+1,"grid"===R.navigationMode?u:void 0)}function yt({skipFragments:e=!1}={}){(oe.isActive()||e||!1===re.prev())&&tt().up&&Xe(c,u-1)}function bt({skipFragments:e=!1}={}){z.hasNavigatedVertically=!0,(oe.isActive()||e||!1===re.next())&&tt().down&&Xe(c,u+1)}function wt({skipFragments:e=!1}={}){if(e||!1===re.prev())if(tt().up)yt({skipFragments:e});else{let i;if(i=R.rtl?t(X.wrapper,m+".future").pop():t(X.wrapper,m+".past").pop(),i&&i.classList.contains("stack")){let e=i.querySelectorAll("section").length-1||void 0;Xe(c-1,e)}else mt({skipFragments:e})}}function Et({skipFragments:e=!1}={}){if(z.hasNavigatedHorizontally=!0,z.hasNavigatedVertically=!0,e||!1===re.next()){let t=tt();t.down&&t.right&&R.loop&&Oe()&&(t.down=!1),t.down?bt({skipFragments:e}):R.rtl?mt({skipFragments:e}):ft({skipFragments:e})}}function St(e){let t=e.data;if("string"==typeof t&&"{"===t.charAt(0)&&"}"===t.charAt(t.length-1)&&(t=JSON.parse(t),t.method&&"function"==typeof d[t.method]))if(!1===y.test(t.method)){const e=d[t.method].apply(d,t.args);xe("callback",{method:t.method,result:e})}else console.warn('reveal.js: "'+t.method+'" is is blacklisted from the postMessage API')}function At(e){"running"===Y&&/section/gi.test(e.target.nodeName)&&(Y="idle",Le({type:"slidetransitionend",data:{indexh:c,indexv:u,previousSlide:g,currentSlide:b}}))}function Rt(e){const t=r(e.target,'a[href^="#"]');if(t){const i=t.getAttribute("href"),s=de.getIndicesFromHash(i);s&&(d.slide(s.h,s.v,s.f),e.preventDefault())}}function kt(e){Be()}function Lt(e){!1===document.hidden&&document.activeElement!==document.body&&("function"==typeof document.activeElement.blur&&document.activeElement.blur(),document.body.focus())}function Ct(e){(document.fullscreenElement||document.webkitFullscreenElement)===X.wrapper&&(e.stopImmediatePropagation(),setTimeout((()=>{d.layout(),d.focus.focus()}),1))}function xt(e){if(e.currentTarget&&e.currentTarget.hasAttribute("href")){let t=e.currentTarget.getAttribute("href");t&&(Ne(t),e.preventDefault())}}function Pt(e){Ue()&&!1===R.loop?(Xe(0,0),vt()):Q?vt():pt()}const Tt={VERSION:j,initialize:function(e){if(!n)throw'Unable to find presentation root (
).';if(X.wrapper=n,X.slides=n.querySelector(".slides"),!X.slides)throw'Unable to find slides container (
).';return R={...V,...R,...o,...e,...l()},/print-pdf/gi.test(window.location.search)&&(R.view="print"),function(){!0===R.embedded?X.viewport=r(n,".reveal-viewport")||n:(X.viewport=document.body,document.documentElement.classList.add("reveal-full-page"));X.viewport.classList.add("reveal-viewport")}(),window.addEventListener("load",Be,!1),ge.load(R.plugins,R.dependencies).then(fe),new Promise((e=>d.on("ready",e)))},configure:we,destroy:function(){Se(),gt(),Te(),me.destroy(),pe.destroy(),ge.destroy(),ue.destroy(),ce.destroy(),he.destroy(),se.destroy(),ee.destroy(),te.destroy(),document.removeEventListener("fullscreenchange",Ct),document.removeEventListener("webkitfullscreenchange",Ct),document.removeEventListener("visibilitychange",Lt,!1),window.removeEventListener("message",St,!1),window.removeEventListener("load",Be,!1),X.pauseOverlay&&X.pauseOverlay.remove(),X.statusElement&&X.statusElement.remove(),document.documentElement.classList.remove("reveal-full-page"),X.wrapper.classList.remove("ready","center","has-horizontal-slides","has-vertical-slides"),X.wrapper.removeAttribute("data-transition-speed"),X.wrapper.removeAttribute("data-background-transition"),X.viewport.classList.remove("reveal-viewport"),X.viewport.style.removeProperty("--slide-width"),X.viewport.style.removeProperty("--slide-height"),X.slides.style.removeProperty("width"),X.slides.style.removeProperty("height"),X.slides.style.removeProperty("zoom"),X.slides.style.removeProperty("left"),X.slides.style.removeProperty("top"),X.slides.style.removeProperty("bottom"),X.slides.style.removeProperty("right"),X.slides.style.removeProperty("transform"),Array.from(X.wrapper.querySelectorAll(v)).forEach((e=>{e.style.removeProperty("display"),e.style.removeProperty("top"),e.removeAttribute("hidden"),e.removeAttribute("aria-hidden")}))},sync:_e,syncSlide:function(e=b){se.sync(e),re.sync(e),Z.load(e),se.update(),me.update()},syncFragments:re.sync.bind(re),slide:Xe,left:mt,right:ft,up:yt,down:bt,prev:wt,next:Et,navigateLeft:mt,navigateRight:ft,navigateUp:yt,navigateDown:bt,navigatePrev:wt,navigateNext:Et,navigateFragment:re.goto.bind(re),prevFragment:re.prev.bind(re),nextFragment:re.next.bind(re),on:Ae,off:Re,addEventListener:Ae,removeEventListener:Re,layout:Be,shuffle:Je,availableRoutes:tt,availableFragments:re.availableRoutes.bind(re),toggleHelp:function(e){"boolean"==typeof e?e?Me():Ie():X.overlay?Ie():Me()},toggleOverview:oe.toggle.bind(oe),toggleScrollView:ae.toggle.bind(ae),togglePause:Ke,toggleAutoSlide:function(e){"boolean"==typeof e?e?vt():pt():Q?vt():pt()},toggleJumpToSlide:function(e){"boolean"==typeof e?e?te.show():te.hide():te.isVisible()?te.hide():te.show()},isFirstSlide:We,isLastSlide:Ue,isLastVerticalSlide:Oe,isVerticalSlide:qe,isVerticalStack:function(e=b){return e.classList.contains(".stack")||null!==e.querySelector("section")},isPaused:$e,isAutoSliding:function(){return!(!_||Q)},isSpeakerNotes:me.isSpeakerNotesWindow.bind(me),isOverview:oe.isActive.bind(oe),isFocused:pe.isFocused.bind(pe),isScrollView:ae.isActive.bind(ae),isPrintView:ne.isActive.bind(ne),isReady:()=>H,loadSlide:Z.load.bind(Z),unloadSlide:Z.unload.bind(Z),startEmbeddedContent:()=>Z.startEmbeddedContent(b),stopEmbeddedContent:()=>Z.stopEmbeddedContent(b,{unloadIframes:!1}),showPreview:Ne,hidePreview:Ie,addEventListeners:Ee,removeEventListeners:Se,dispatchEvent:Le,getState:ht,setState:function(e){if("object"==typeof e){Xe(s(e.indexh),s(e.indexv),s(e.indexf));let t=s(e.paused),i=s(e.overview);"boolean"==typeof t&&t!==$e()&&Ke(t),"boolean"==typeof i&&i!==oe.isActive()&&oe.toggle(i)}},getProgress:function(){let e=dt(),t=it();if(b){let e=b.querySelectorAll(".fragment");if(e.length>0){let i=.9;t+=b.querySelectorAll(".fragment.visible").length/e.length*i}}return Math.min(t/(e-1),1)},getIndices:st,getSlidesAttributes:function(){return at().map((e=>{let t={};for(let i=0;ig,getCurrentSlide:()=>b,getSlideBackground:function(e,t){let i="number"==typeof e?ct(e,t):e;if(i)return i.slideBackgroundElement},getSlideNotes:me.getSlideNotes.bind(me),getSlides:at,getHorizontalSlides:nt,getVerticalSlides:rt,hasHorizontalSlides:ot,hasVerticalSlides:lt,hasNavigatedHorizontally:()=>z.hasNavigatedHorizontally,hasNavigatedVertically:()=>z.hasNavigatedVertically,shouldAutoAnimateBetween:Ye,addKeyBinding:le.addKeyBinding.bind(le),removeKeyBinding:le.removeKeyBinding.bind(le),triggerKey:le.triggerKey.bind(le),registerKeyboardShortcut:le.registerKeyboardShortcut.bind(le),getComputedSlideSize:De,setCurrentScrollPage:function(e,t,i){let s=c||0;c=t,u=i;const a=b!==e;g=b,b=e,b&&g&&R.autoAnimate&&Ye(g,b,s,u)&&ie.run(g,b),a&&(g&&(Z.stopEmbeddedContent(g),Z.stopEmbeddedContent(g.slideBackgroundElement)),Z.startEmbeddedContent(b),Z.startEmbeddedContent(b.slideBackgroundElement)),requestAnimationFrame((()=>{ye(be(b))})),Ce()},getScale:()=>K,getConfig:()=>R,getQueryHash:l,getSlidePath:de.getHash.bind(de),getRevealElement:()=>n,getSlidesElement:()=>X.slides,getViewportElement:()=>X.viewport,getBackgroundsElement:()=>se.element,registerPlugin:ge.registerPlugin.bind(ge),hasPlugin:ge.hasPlugin.bind(ge),getPlugin:ge.getPlugin.bind(ge),getPlugins:ge.getRegisteredPlugins.bind(ge)};return e(d,{...Tt,announceStatus:ye,getStatusText:be,focus:pe,scroll:ae,progress:he,controls:ce,location:de,overview:oe,fragments:re,backgrounds:se,slideContent:Z,slideNumber:ee,onUserInput:function(e){R.autoSlideStoppable&&pt()},closeOverlay:Ie,updateSlidesVisibility:et,layoutSlideContents:He,transformSlides:ke,cueAutoSlide:ut,cancelAutoSlide:gt}),Tt}let $=K,X=[];$.initialize=e=>(Object.assign($,new K(document.querySelector(".reveal"),e)),X.map((e=>e($))),$.initialize()),["configure","on","off","addEventListener","removeEventListener","registerPlugin"].forEach((e=>{$[e]=(...t)=>{X.push((i=>i[e].call(null,...t)))}})),$.isReady=()=>!1,$.VERSION=j;export{$ as default}; -//# sourceMappingURL=reveal.esm.js.map diff --git a/reveal.js/dist/reveal.esm.js.map b/reveal.js/dist/reveal.esm.js.map deleted file mode 100644 index 3ad3af6..0000000 --- a/reveal.js/dist/reveal.esm.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"reveal.esm.js","sources":["../js/utils/util.js","../js/utils/device.js","../node_modules/fitty/dist/fitty.module.js","../js/controllers/slidecontent.js","../js/utils/constants.js","../js/controllers/slidenumber.js","../js/controllers/jumptoslide.js","../js/utils/color.js","../js/controllers/backgrounds.js","../js/controllers/autoanimate.js","../js/controllers/scrollview.js","../js/controllers/printview.js","../js/controllers/fragments.js","../js/controllers/overview.js","../js/controllers/keyboard.js","../js/controllers/location.js","../js/controllers/controls.js","../js/controllers/progress.js","../js/controllers/pointer.js","../js/utils/loader.js","../js/controllers/plugins.js","../js/controllers/touch.js","../js/controllers/focus.js","../js/controllers/notes.js","../js/components/playback.js","../js/config.js","../js/reveal.js","../js/index.js"],"sourcesContent":["/**\n * Extend object a with the properties of object b.\n * If there's a conflict, object b takes precedence.\n *\n * @param {object} a\n * @param {object} b\n */\nexport const extend = ( a, b ) => {\n\n\tfor( let i in b ) {\n\t\ta[ i ] = b[ i ];\n\t}\n\n\treturn a;\n\n}\n\n/**\n * querySelectorAll but returns an Array.\n */\nexport const queryAll = ( el, selector ) => {\n\n\treturn Array.from( el.querySelectorAll( selector ) );\n\n}\n\n/**\n * classList.toggle() with cross browser support\n */\nexport const toggleClass = ( el, className, value ) => {\n\tif( value ) {\n\t\tel.classList.add( className );\n\t}\n\telse {\n\t\tel.classList.remove( className );\n\t}\n}\n\n/**\n * Utility for deserializing a value.\n *\n * @param {*} value\n * @return {*}\n */\nexport const deserialize = ( value ) => {\n\n\tif( typeof value === 'string' ) {\n\t\tif( value === 'null' ) return null;\n\t\telse if( value === 'true' ) return true;\n\t\telse if( value === 'false' ) return false;\n\t\telse if( value.match( /^-?[\\d\\.]+$/ ) ) return parseFloat( value );\n\t}\n\n\treturn value;\n\n}\n\n/**\n * Measures the distance in pixels between point a\n * and point b.\n *\n * @param {object} a point with x/y properties\n * @param {object} b point with x/y properties\n *\n * @return {number}\n */\nexport const distanceBetween = ( a, b ) => {\n\n\tlet dx = a.x - b.x,\n\t\tdy = a.y - b.y;\n\n\treturn Math.sqrt( dx*dx + dy*dy );\n\n}\n\n/**\n * Applies a CSS transform to the target element.\n *\n * @param {HTMLElement} element\n * @param {string} transform\n */\nexport const transformElement = ( element, transform ) => {\n\n\telement.style.transform = transform;\n\n}\n\n/**\n * Element.matches with IE support.\n *\n * @param {HTMLElement} target The element to match\n * @param {String} selector The CSS selector to match\n * the element against\n *\n * @return {Boolean}\n */\nexport const matches = ( target, selector ) => {\n\n\tlet matchesMethod = target.matches || target.matchesSelector || target.msMatchesSelector;\n\n\treturn !!( matchesMethod && matchesMethod.call( target, selector ) );\n\n}\n\n/**\n * Find the closest parent that matches the given\n * selector.\n *\n * @param {HTMLElement} target The child element\n * @param {String} selector The CSS selector to match\n * the parents against\n *\n * @return {HTMLElement} The matched parent or null\n * if no matching parent was found\n */\nexport const closest = ( target, selector ) => {\n\n\t// Native Element.closest\n\tif( typeof target.closest === 'function' ) {\n\t\treturn target.closest( selector );\n\t}\n\n\t// Polyfill\n\twhile( target ) {\n\t\tif( matches( target, selector ) ) {\n\t\t\treturn target;\n\t\t}\n\n\t\t// Keep searching\n\t\ttarget = target.parentNode;\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Handling the fullscreen functionality via the fullscreen API\n *\n * @see http://fullscreen.spec.whatwg.org/\n * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode\n */\nexport const enterFullscreen = element => {\n\n\telement = element || document.documentElement;\n\n\t// Check which implementation is available\n\tlet requestMethod = element.requestFullscreen ||\n\t\t\t\t\t\telement.webkitRequestFullscreen ||\n\t\t\t\t\t\telement.webkitRequestFullScreen ||\n\t\t\t\t\t\telement.mozRequestFullScreen ||\n\t\t\t\t\t\telement.msRequestFullscreen;\n\n\tif( requestMethod ) {\n\t\trequestMethod.apply( element );\n\t}\n\n}\n\n/**\n * Creates an HTML element and returns a reference to it.\n * If the element already exists the existing instance will\n * be returned.\n *\n * @param {HTMLElement} container\n * @param {string} tagname\n * @param {string} classname\n * @param {string} innerHTML\n *\n * @return {HTMLElement}\n */\nexport const createSingletonNode = ( container, tagname, classname, innerHTML='' ) => {\n\n\t// Find all nodes matching the description\n\tlet nodes = container.querySelectorAll( '.' + classname );\n\n\t// Check all matches to find one which is a direct child of\n\t// the specified container\n\tfor( let i = 0; i < nodes.length; i++ ) {\n\t\tlet testNode = nodes[i];\n\t\tif( testNode.parentNode === container ) {\n\t\t\treturn testNode;\n\t\t}\n\t}\n\n\t// If no node was found, create it now\n\tlet node = document.createElement( tagname );\n\tnode.className = classname;\n\tnode.innerHTML = innerHTML;\n\tcontainer.appendChild( node );\n\n\treturn node;\n\n}\n\n/**\n * Injects the given CSS styles into the DOM.\n *\n * @param {string} value\n */\nexport const createStyleSheet = ( value ) => {\n\n\tlet tag = document.createElement( 'style' );\n\ttag.type = 'text/css';\n\n\tif( value && value.length > 0 ) {\n\t\tif( tag.styleSheet ) {\n\t\t\ttag.styleSheet.cssText = value;\n\t\t}\n\t\telse {\n\t\t\ttag.appendChild( document.createTextNode( value ) );\n\t\t}\n\t}\n\n\tdocument.head.appendChild( tag );\n\n\treturn tag;\n\n}\n\n/**\n * Returns a key:value hash of all query params.\n */\nexport const getQueryHash = () => {\n\n\tlet query = {};\n\n\tlocation.search.replace( /[A-Z0-9]+?=([\\w\\.%-]*)/gi, a => {\n\t\tquery[ a.split( '=' ).shift() ] = a.split( '=' ).pop();\n\t} );\n\n\t// Basic deserialization\n\tfor( let i in query ) {\n\t\tlet value = query[ i ];\n\n\t\tquery[ i ] = deserialize( unescape( value ) );\n\t}\n\n\t// Do not accept new dependencies via query config to avoid\n\t// the potential of malicious script injection\n\tif( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies'];\n\n\treturn query;\n\n}\n\n/**\n * Returns the remaining height within the parent of the\n * target element.\n *\n * remaining height = [ configured parent height ] - [ current parent height ]\n *\n * @param {HTMLElement} element\n * @param {number} [height]\n */\nexport const getRemainingHeight = ( element, height = 0 ) => {\n\n\tif( element ) {\n\t\tlet newHeight, oldHeight = element.style.height;\n\n\t\t// Change the .stretch element height to 0 in order find the height of all\n\t\t// the other elements\n\t\telement.style.height = '0px';\n\n\t\t// In Overview mode, the parent (.slide) height is set of 700px.\n\t\t// Restore it temporarily to its natural height.\n\t\telement.parentNode.style.height = 'auto';\n\n\t\tnewHeight = height - element.parentNode.offsetHeight;\n\n\t\t// Restore the old height, just in case\n\t\telement.style.height = oldHeight + 'px';\n\n\t\t// Clear the parent (.slide) height. .removeProperty works in IE9+\n\t\telement.parentNode.style.removeProperty('height');\n\n\t\treturn newHeight;\n\t}\n\n\treturn height;\n\n}\n\nconst fileExtensionToMimeMap = {\n\t'mp4': 'video/mp4',\n\t'm4a': 'video/mp4',\n\t'ogv': 'video/ogg',\n\t'mpeg': 'video/mpeg',\n\t'webm': 'video/webm'\n}\n\n/**\n * Guess the MIME type for common file formats.\n */\nexport const getMimeTypeFromFile = ( filename='' ) => {\n\treturn fileExtensionToMimeMap[filename.split('.').pop()]\n}\n\n/**\n * Encodes a string for RFC3986-compliant URL format.\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI#encoding_for_rfc3986\n *\n * @param {string} url\n */\nexport const encodeRFC3986URI = ( url='' ) => {\n\treturn encodeURI(url)\n\t .replace(/%5B/g, \"[\")\n\t .replace(/%5D/g, \"]\")\n\t .replace(\n\t\t/[!'()*]/g,\n\t\t(c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`\n\t );\n}","const UA = navigator.userAgent;\n\nexport const isMobile = /(iphone|ipod|ipad|android)/gi.test( UA ) ||\n\t\t\t\t\t\t( navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1 ); // iPadOS\n\nexport const isChrome = /chrome/i.test( UA ) && !/edge/i.test( UA );\n\nexport const isAndroid = /android/gi.test( UA );","/**\n * fitty v2.3.7 - Snugly resizes text to fit its parent container\n * Copyright (c) 2023 Rik Schennink (https://pqina.nl/)\n */\n\nvar e=function(e){if(e){var t=function(e){return[].slice.call(e)},n=0,i=1,r=2,o=3,a=[],l=null,u=\"requestAnimationFrame\"in e?function(){e.cancelAnimationFrame(l),l=e.requestAnimationFrame((function(){return s(a.filter((function(e){return e.dirty&&e.active})))}))}:function(){},c=function(e){return function(){a.forEach((function(t){return t.dirty=e})),u()}},s=function(e){e.filter((function(e){return!e.styleComputed})).forEach((function(e){e.styleComputed=m(e)})),e.filter(y).forEach(v);var t=e.filter(p);t.forEach(d),t.forEach((function(e){v(e),f(e)})),t.forEach(S)},f=function(e){return e.dirty=n},d=function(e){e.availableWidth=e.element.parentNode.clientWidth,e.currentWidth=e.element.scrollWidth,e.previousFontSize=e.currentFontSize,e.currentFontSize=Math.min(Math.max(e.minSize,e.availableWidth/e.currentWidth*e.previousFontSize),e.maxSize),e.whiteSpace=e.multiLine&&e.currentFontSize===e.minSize?\"normal\":\"nowrap\"},p=function(e){return e.dirty!==r||e.dirty===r&&e.element.parentNode.clientWidth!==e.availableWidth},m=function(t){var n=e.getComputedStyle(t.element,null);return t.currentFontSize=parseFloat(n.getPropertyValue(\"font-size\")),t.display=n.getPropertyValue(\"display\"),t.whiteSpace=n.getPropertyValue(\"white-space\"),!0},y=function(e){var t=!1;return!e.preStyleTestCompleted&&(/inline-/.test(e.display)||(t=!0,e.display=\"inline-block\"),\"nowrap\"!==e.whiteSpace&&(t=!0,e.whiteSpace=\"nowrap\"),e.preStyleTestCompleted=!0,t)},v=function(e){e.element.style.whiteSpace=e.whiteSpace,e.element.style.display=e.display,e.element.style.fontSize=e.currentFontSize+\"px\"},S=function(e){e.element.dispatchEvent(new CustomEvent(\"fit\",{detail:{oldValue:e.previousFontSize,newValue:e.currentFontSize,scaleFactor:e.currentFontSize/e.previousFontSize}}))},h=function(e,t){return function(){e.dirty=t,e.active&&u()}},w=function(e){return function(){a=a.filter((function(t){return t.element!==e.element})),e.observeMutations&&e.observer.disconnect(),e.element.style.whiteSpace=e.originalStyle.whiteSpace,e.element.style.display=e.originalStyle.display,e.element.style.fontSize=e.originalStyle.fontSize}},b=function(e){return function(){e.active||(e.active=!0,u())}},z=function(e){return function(){return e.active=!1}},F=function(e){e.observeMutations&&(e.observer=new MutationObserver(h(e,i)),e.observer.observe(e.element,e.observeMutations))},g={minSize:16,maxSize:512,multiLine:!0,observeMutations:\"MutationObserver\"in e&&{subtree:!0,childList:!0,characterData:!0}},W=null,E=function(){e.clearTimeout(W),W=e.setTimeout(c(r),x.observeWindowDelay)},M=[\"resize\",\"orientationchange\"];return Object.defineProperty(x,\"observeWindow\",{set:function(t){var n=\"\".concat(t?\"add\":\"remove\",\"EventListener\");M.forEach((function(t){e[n](t,E)}))}}),x.observeWindow=!0,x.observeWindowDelay=100,x.fitAll=c(o),x}function C(e,t){var n=Object.assign({},g,t),i=e.map((function(e){var t=Object.assign({},n,{element:e,active:!0});return function(e){e.originalStyle={whiteSpace:e.element.style.whiteSpace,display:e.element.style.display,fontSize:e.element.style.fontSize},F(e),e.newbie=!0,e.dirty=!0,a.push(e)}(t),{element:e,fit:h(t,o),unfreeze:b(t),freeze:z(t),unsubscribe:w(t)}}));return u(),i}function x(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return\"string\"==typeof e?C(t(document.querySelectorAll(e)),n):C([e],n)[0]}}(\"undefined\"==typeof window?null:window);export default e;\n","import { extend, queryAll, closest, getMimeTypeFromFile, encodeRFC3986URI } from '../utils/util.js'\nimport { isMobile } from '../utils/device.js'\n\nimport fitty from 'fitty';\n\n/**\n * Handles loading, unloading and playback of slide\n * content such as images, videos and iframes.\n */\nexport default class SlideContent {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.startEmbeddedIframe = this.startEmbeddedIframe.bind( this );\n\n\t}\n\n\t/**\n\t * Should the given element be preloaded?\n\t * Decides based on local element attributes and global config.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tshouldPreload( element ) {\n\n\t\tif( this.Reveal.isScrollView() ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Prefer an explicit global preload setting\n\t\tlet preload = this.Reveal.getConfig().preloadIframes;\n\n\t\t// If no global setting is available, fall back on the element's\n\t\t// own preload setting\n\t\tif( typeof preload !== 'boolean' ) {\n\t\t\tpreload = element.hasAttribute( 'data-preload' );\n\t\t}\n\n\t\treturn preload;\n\t}\n\n\t/**\n\t * Called when the given slide is within the configured view\n\t * distance. Shows the slide element and loads any content\n\t * that is set to load lazily (data-src).\n\t *\n\t * @param {HTMLElement} slide Slide to show\n\t */\n\tload( slide, options = {} ) {\n\n\t\t// Show the slide element\n\t\tslide.style.display = this.Reveal.getConfig().display;\n\n\t\t// Media elements with data-src attributes\n\t\tqueryAll( slide, 'img[data-src], video[data-src], audio[data-src], iframe[data-src]' ).forEach( element => {\n\t\t\tif( element.tagName !== 'IFRAME' || this.shouldPreload( element ) ) {\n\t\t\t\telement.setAttribute( 'src', element.getAttribute( 'data-src' ) );\n\t\t\t\telement.setAttribute( 'data-lazy-loaded', '' );\n\t\t\t\telement.removeAttribute( 'data-src' );\n\t\t\t}\n\t\t} );\n\n\t\t// Media elements with children\n\t\tqueryAll( slide, 'video, audio' ).forEach( media => {\n\t\t\tlet sources = 0;\n\n\t\t\tqueryAll( media, 'source[data-src]' ).forEach( source => {\n\t\t\t\tsource.setAttribute( 'src', source.getAttribute( 'data-src' ) );\n\t\t\t\tsource.removeAttribute( 'data-src' );\n\t\t\t\tsource.setAttribute( 'data-lazy-loaded', '' );\n\t\t\t\tsources += 1;\n\t\t\t} );\n\n\t\t\t// Enable inline video playback in mobile Safari\n\t\t\tif( isMobile && media.tagName === 'VIDEO' ) {\n\t\t\t\tmedia.setAttribute( 'playsinline', '' );\n\t\t\t}\n\n\t\t\t// If we rewrote sources for this video/audio element, we need\n\t\t\t// to manually tell it to load from its new origin\n\t\t\tif( sources > 0 ) {\n\t\t\t\tmedia.load();\n\t\t\t}\n\t\t} );\n\n\n\t\t// Show the corresponding background element\n\t\tlet background = slide.slideBackgroundElement;\n\t\tif( background ) {\n\t\t\tbackground.style.display = 'block';\n\n\t\t\tlet backgroundContent = slide.slideBackgroundContentElement;\n\t\t\tlet backgroundIframe = slide.getAttribute( 'data-background-iframe' );\n\n\t\t\t// If the background contains media, load it\n\t\t\tif( background.hasAttribute( 'data-loaded' ) === false ) {\n\t\t\t\tbackground.setAttribute( 'data-loaded', 'true' );\n\n\t\t\t\tlet backgroundImage = slide.getAttribute( 'data-background-image' ),\n\t\t\t\t\tbackgroundVideo = slide.getAttribute( 'data-background-video' ),\n\t\t\t\t\tbackgroundVideoLoop = slide.hasAttribute( 'data-background-video-loop' ),\n\t\t\t\t\tbackgroundVideoMuted = slide.hasAttribute( 'data-background-video-muted' );\n\n\t\t\t\t// Images\n\t\t\t\tif( backgroundImage ) {\n\t\t\t\t\t// base64\n\t\t\t\t\tif( /^data:/.test( backgroundImage.trim() ) ) {\n\t\t\t\t\t\tbackgroundContent.style.backgroundImage = `url(${backgroundImage.trim()})`;\n\t\t\t\t\t}\n\t\t\t\t\t// URL(s)\n\t\t\t\t\telse {\n\t\t\t\t\t\tbackgroundContent.style.backgroundImage = backgroundImage.split( ',' ).map( background => {\n\t\t\t\t\t\t\t// Decode URL(s) that are already encoded first\n\t\t\t\t\t\t\tlet decoded = decodeURI(background.trim());\n\t\t\t\t\t\t\treturn `url(${encodeRFC3986URI(decoded)})`;\n\t\t\t\t\t\t}).join( ',' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Videos\n\t\t\t\telse if ( backgroundVideo && !this.Reveal.isSpeakerNotes() ) {\n\t\t\t\t\tlet video = document.createElement( 'video' );\n\n\t\t\t\t\tif( backgroundVideoLoop ) {\n\t\t\t\t\t\tvideo.setAttribute( 'loop', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\tif( backgroundVideoMuted ) {\n\t\t\t\t\t\tvideo.muted = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Enable inline playback in mobile Safari\n\t\t\t\t\t//\n\t\t\t\t\t// Mute is required for video to play when using\n\t\t\t\t\t// swipe gestures to navigate since they don't\n\t\t\t\t\t// count as direct user actions :'(\n\t\t\t\t\tif( isMobile ) {\n\t\t\t\t\t\tvideo.muted = true;\n\t\t\t\t\t\tvideo.setAttribute( 'playsinline', '' );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support comma separated lists of video sources\n\t\t\t\t\tbackgroundVideo.split( ',' ).forEach( source => {\n\t\t\t\t\t\tlet type = getMimeTypeFromFile( source );\n\t\t\t\t\t\tif( type ) {\n\t\t\t\t\t\t\tvideo.innerHTML += ``;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tvideo.innerHTML += ``;\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tbackgroundContent.appendChild( video );\n\t\t\t\t}\n\t\t\t\t// Iframes\n\t\t\t\telse if( backgroundIframe && options.excludeIframes !== true ) {\n\t\t\t\t\tlet iframe = document.createElement( 'iframe' );\n\t\t\t\t\tiframe.setAttribute( 'allowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'mozallowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'webkitallowfullscreen', '' );\n\t\t\t\t\tiframe.setAttribute( 'allow', 'autoplay' );\n\n\t\t\t\t\tiframe.setAttribute( 'data-src', backgroundIframe );\n\n\t\t\t\t\tiframe.style.width = '100%';\n\t\t\t\t\tiframe.style.height = '100%';\n\t\t\t\t\tiframe.style.maxHeight = '100%';\n\t\t\t\t\tiframe.style.maxWidth = '100%';\n\n\t\t\t\t\tbackgroundContent.appendChild( iframe );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start loading preloadable iframes\n\t\t\tlet backgroundIframeElement = backgroundContent.querySelector( 'iframe[data-src]' );\n\t\t\tif( backgroundIframeElement ) {\n\n\t\t\t\t// Check if this iframe is eligible to be preloaded\n\t\t\t\tif( this.shouldPreload( background ) && !/autoplay=(1|true|yes)/gi.test( backgroundIframe ) ) {\n\t\t\t\t\tif( backgroundIframeElement.getAttribute( 'src' ) !== backgroundIframe ) {\n\t\t\t\t\t\tbackgroundIframeElement.setAttribute( 'src', backgroundIframe );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.layout( slide );\n\n\t}\n\n\t/**\n\t * Applies JS-dependent layout helpers for the scope.\n\t */\n\tlayout( scopeElement ) {\n\n\t\t// Autosize text with the r-fit-text class based on the\n\t\t// size of its container. This needs to happen after the\n\t\t// slide is visible in order to measure the text.\n\t\tArray.from( scopeElement.querySelectorAll( '.r-fit-text' ) ).forEach( element => {\n\t\t\tfitty( element, {\n\t\t\t\tminSize: 24,\n\t\t\t\tmaxSize: this.Reveal.getConfig().height * 0.8,\n\t\t\t\tobserveMutations: false,\n\t\t\t\tobserveWindow: false\n\t\t\t} );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Unloads and hides the given slide. This is called when the\n\t * slide is moved outside of the configured view distance.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tunload( slide ) {\n\n\t\t// Hide the slide element\n\t\tslide.style.display = 'none';\n\n\t\t// Hide the corresponding background element\n\t\tlet background = this.Reveal.getSlideBackground( slide );\n\t\tif( background ) {\n\t\t\tbackground.style.display = 'none';\n\n\t\t\t// Unload any background iframes\n\t\t\tqueryAll( background, 'iframe[src]' ).forEach( element => {\n\t\t\t\telement.removeAttribute( 'src' );\n\t\t\t} );\n\t\t}\n\n\t\t// Reset lazy-loaded media elements with src attributes\n\t\tqueryAll( slide, 'video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]' ).forEach( element => {\n\t\t\telement.setAttribute( 'data-src', element.getAttribute( 'src' ) );\n\t\t\telement.removeAttribute( 'src' );\n\t\t} );\n\n\t\t// Reset lazy-loaded media elements with children\n\t\tqueryAll( slide, 'video[data-lazy-loaded] source[src], audio source[src]' ).forEach( source => {\n\t\t\tsource.setAttribute( 'data-src', source.getAttribute( 'src' ) );\n\t\t\tsource.removeAttribute( 'src' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Enforces origin-specific format rules for embedded media.\n\t */\n\tformatEmbeddedContent() {\n\n\t\tlet _appendParamToIframeSource = ( sourceAttribute, sourceURL, param ) => {\n\t\t\tqueryAll( this.Reveal.getSlidesElement(), 'iframe['+ sourceAttribute +'*=\"'+ sourceURL +'\"]' ).forEach( el => {\n\t\t\t\tlet src = el.getAttribute( sourceAttribute );\n\t\t\t\tif( src && src.indexOf( param ) === -1 ) {\n\t\t\t\t\tel.setAttribute( sourceAttribute, src + ( !/\\?/.test( src ) ? '?' : '&' ) + param );\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\t// YouTube frames must include \"?enablejsapi=1\"\n\t\t_appendParamToIframeSource( 'src', 'youtube.com/embed/', 'enablejsapi=1' );\n\t\t_appendParamToIframeSource( 'data-src', 'youtube.com/embed/', 'enablejsapi=1' );\n\n\t\t// Vimeo frames must include \"?api=1\"\n\t\t_appendParamToIframeSource( 'src', 'player.vimeo.com/', 'api=1' );\n\t\t_appendParamToIframeSource( 'data-src', 'player.vimeo.com/', 'api=1' );\n\n\t}\n\n\t/**\n\t * Start playback of any embedded content inside of\n\t * the given element.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tstartEmbeddedContent( element ) {\n\n\t\tif( element && !this.Reveal.isSpeakerNotes() ) {\n\n\t\t\t// Restart GIFs\n\t\t\tqueryAll( element, 'img[src$=\".gif\"]' ).forEach( el => {\n\t\t\t\t// Setting the same unchanged source like this was confirmed\n\t\t\t\t// to work in Chrome, FF & Safari\n\t\t\t\tel.setAttribute( 'src', el.getAttribute( 'src' ) );\n\t\t\t} );\n\n\t\t\t// HTML5 media elements\n\t\t\tqueryAll( element, 'video, audio' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Prefer an explicit global autoplay setting\n\t\t\t\tlet autoplay = this.Reveal.getConfig().autoPlayMedia;\n\n\t\t\t\t// If no global setting is available, fall back on the element's\n\t\t\t\t// own autoplay setting\n\t\t\t\tif( typeof autoplay !== 'boolean' ) {\n\t\t\t\t\tautoplay = el.hasAttribute( 'data-autoplay' ) || !!closest( el, '.slide-background' );\n\t\t\t\t}\n\n\t\t\t\tif( autoplay && typeof el.play === 'function' ) {\n\n\t\t\t\t\t// If the media is ready, start playback\n\t\t\t\t\tif( el.readyState > 1 ) {\n\t\t\t\t\t\tthis.startEmbeddedMedia( { target: el } );\n\t\t\t\t\t}\n\t\t\t\t\t// Mobile devices never fire a loaded event so instead\n\t\t\t\t\t// of waiting, we initiate playback\n\t\t\t\t\telse if( isMobile ) {\n\t\t\t\t\t\tlet promise = el.play();\n\n\t\t\t\t\t\t// If autoplay does not work, ensure that the controls are visible so\n\t\t\t\t\t\t// that the viewer can start the media on their own\n\t\t\t\t\t\tif( promise && typeof promise.catch === 'function' && el.controls === false ) {\n\t\t\t\t\t\t\tpromise.catch( () => {\n\t\t\t\t\t\t\t\tel.controls = true;\n\n\t\t\t\t\t\t\t\t// Once the video does start playing, hide the controls again\n\t\t\t\t\t\t\t\tel.addEventListener( 'play', () => {\n\t\t\t\t\t\t\t\t\tel.controls = false;\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// If the media isn't loaded, wait before playing\n\t\t\t\t\telse {\n\t\t\t\t\t\tel.removeEventListener( 'loadeddata', this.startEmbeddedMedia ); // remove first to avoid dupes\n\t\t\t\t\t\tel.addEventListener( 'loadeddata', this.startEmbeddedMedia );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Normal iframes\n\t\t\tqueryAll( element, 'iframe[src]' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.startEmbeddedIframe( { target: el } );\n\t\t\t} );\n\n\t\t\t// Lazy loading iframes\n\t\t\tqueryAll( element, 'iframe[data-src]' ).forEach( el => {\n\t\t\t\tif( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif( el.getAttribute( 'src' ) !== el.getAttribute( 'data-src' ) ) {\n\t\t\t\t\tel.removeEventListener( 'load', this.startEmbeddedIframe ); // remove first to avoid dupes\n\t\t\t\t\tel.addEventListener( 'load', this.startEmbeddedIframe );\n\t\t\t\t\tel.setAttribute( 'src', el.getAttribute( 'data-src' ) );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Starts playing an embedded video/audio element after\n\t * it has finished loading.\n\t *\n\t * @param {object} event\n\t */\n\tstartEmbeddedMedia( event ) {\n\n\t\tlet isAttachedToDOM = !!closest( event.target, 'html' ),\n\t\t\tisVisible \t\t= !!closest( event.target, '.present' );\n\n\t\tif( isAttachedToDOM && isVisible ) {\n\t\t\tevent.target.currentTime = 0;\n\t\t\tevent.target.play();\n\t\t}\n\n\t\tevent.target.removeEventListener( 'loadeddata', this.startEmbeddedMedia );\n\n\t}\n\n\t/**\n\t * \"Starts\" the content of an embedded iframe using the\n\t * postMessage API.\n\t *\n\t * @param {object} event\n\t */\n\tstartEmbeddedIframe( event ) {\n\n\t\tlet iframe = event.target;\n\n\t\tif( iframe && iframe.contentWindow ) {\n\n\t\t\tlet isAttachedToDOM = !!closest( event.target, 'html' ),\n\t\t\t\tisVisible \t\t= !!closest( event.target, '.present' );\n\n\t\t\tif( isAttachedToDOM && isVisible ) {\n\n\t\t\t\t// Prefer an explicit global autoplay setting\n\t\t\t\tlet autoplay = this.Reveal.getConfig().autoPlayMedia;\n\n\t\t\t\t// If no global setting is available, fall back on the element's\n\t\t\t\t// own autoplay setting\n\t\t\t\tif( typeof autoplay !== 'boolean' ) {\n\t\t\t\t\tautoplay = iframe.hasAttribute( 'data-autoplay' ) || !!closest( iframe, '.slide-background' );\n\t\t\t\t}\n\n\t\t\t\t// YouTube postMessage API\n\t\t\t\tif( /youtube\\.com\\/embed\\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {\n\t\t\t\t\tiframe.contentWindow.postMessage( '{\"event\":\"command\",\"func\":\"playVideo\",\"args\":\"\"}', '*' );\n\t\t\t\t}\n\t\t\t\t// Vimeo postMessage API\n\t\t\t\telse if( /player\\.vimeo\\.com\\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {\n\t\t\t\t\tiframe.contentWindow.postMessage( '{\"method\":\"play\"}', '*' );\n\t\t\t\t}\n\t\t\t\t// Generic postMessage API\n\t\t\t\telse {\n\t\t\t\t\tiframe.contentWindow.postMessage( 'slide:start', '*' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Stop playback of any embedded content inside of\n\t * the targeted slide.\n\t *\n\t * @param {HTMLElement} element\n\t */\n\tstopEmbeddedContent( element, options = {} ) {\n\n\t\toptions = extend( {\n\t\t\t// Defaults\n\t\t\tunloadIframes: true\n\t\t}, options );\n\n\t\tif( element && element.parentNode ) {\n\t\t\t// HTML5 media elements\n\t\t\tqueryAll( element, 'video, audio' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && typeof el.pause === 'function' ) {\n\t\t\t\t\tel.setAttribute('data-paused-by-reveal', '');\n\t\t\t\t\tel.pause();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Generic postMessage API for non-lazy loaded iframes\n\t\t\tqueryAll( element, 'iframe' ).forEach( el => {\n\t\t\t\tif( el.contentWindow ) el.contentWindow.postMessage( 'slide:stop', '*' );\n\t\t\t\tel.removeEventListener( 'load', this.startEmbeddedIframe );\n\t\t\t});\n\n\t\t\t// YouTube postMessage API\n\t\t\tqueryAll( element, 'iframe[src*=\"youtube.com/embed/\"]' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {\n\t\t\t\t\tel.contentWindow.postMessage( '{\"event\":\"command\",\"func\":\"pauseVideo\",\"args\":\"\"}', '*' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Vimeo postMessage API\n\t\t\tqueryAll( element, 'iframe[src*=\"player.vimeo.com/\"]' ).forEach( el => {\n\t\t\t\tif( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {\n\t\t\t\t\tel.contentWindow.postMessage( '{\"method\":\"pause\"}', '*' );\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif( options.unloadIframes === true ) {\n\t\t\t\t// Unload lazy-loaded iframes\n\t\t\t\tqueryAll( element, 'iframe[data-src]' ).forEach( el => {\n\t\t\t\t\t// Only removing the src doesn't actually unload the frame\n\t\t\t\t\t// in all browsers (Firefox) so we set it to blank first\n\t\t\t\t\tel.setAttribute( 'src', 'about:blank' );\n\t\t\t\t\tel.removeAttribute( 'src' );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t}\n\n}\n","\nexport const SLIDES_SELECTOR = '.slides section';\nexport const HORIZONTAL_SLIDES_SELECTOR = '.slides>section';\nexport const VERTICAL_SLIDES_SELECTOR = '.slides>section.present>section';\n\n// Methods that may not be invoked via the postMessage API\nexport const POST_MESSAGE_METHOD_BLACKLIST = /registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener|showPreview/;\n\n// Regex for retrieving the fragment style from a class attribute\nexport const FRAGMENT_STYLE_REGEX = /fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/;\n\n// Slide number formats\nexport const SLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL = 'h.v';\nexport const SLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL = 'h/v';\nexport const SLIDE_NUMBER_FORMAT_CURRENT = 'c';\nexport const SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL = 'c/t';","import {\n\tSLIDE_NUMBER_FORMAT_CURRENT,\n\tSLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL,\n\tSLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL,\n\tSLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL\n} from \"../utils/constants\";\n\n/**\n * Handles the display of reveal.js' optional slide number.\n */\nexport default class SlideNumber {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'slide-number';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tlet slideNumberDisplay = 'none';\n\t\tif( config.slideNumber && !this.Reveal.isPrintView() ) {\n\t\t\tif( config.showSlideNumber === 'all' ) {\n\t\t\t\tslideNumberDisplay = 'block';\n\t\t\t}\n\t\t\telse if( config.showSlideNumber === 'speaker' && this.Reveal.isSpeakerNotes() ) {\n\t\t\t\tslideNumberDisplay = 'block';\n\t\t\t}\n\t\t}\n\n\t\tthis.element.style.display = slideNumberDisplay;\n\n\t}\n\n\t/**\n\t * Updates the slide number to match the current slide.\n\t */\n\tupdate() {\n\n\t\t// Update slide number if enabled\n\t\tif( this.Reveal.getConfig().slideNumber && this.element ) {\n\t\t\tthis.element.innerHTML = this.getSlideNumber();\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the HTML string corresponding to the current slide\n\t * number, including formatting.\n\t */\n\tgetSlideNumber( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet value;\n\t\tlet format = SLIDE_NUMBER_FORMAT_HORIZONTAL_DOT_VERTICAL;\n\n\t\tif ( typeof config.slideNumber === 'function' ) {\n\t\t\tvalue = config.slideNumber( slide );\n\t\t} else {\n\t\t\t// Check if a custom number format is available\n\t\t\tif( typeof config.slideNumber === 'string' ) {\n\t\t\t\tformat = config.slideNumber;\n\t\t\t}\n\n\t\t\t// If there are ONLY vertical slides in this deck, always use\n\t\t\t// a flattened slide number\n\t\t\tif( !/c/.test( format ) && this.Reveal.getHorizontalSlides().length === 1 ) {\n\t\t\t\tformat = SLIDE_NUMBER_FORMAT_CURRENT;\n\t\t\t}\n\n\t\t\t// Offset the current slide number by 1 to make it 1-indexed\n\t\t\tlet horizontalOffset = slide && slide.dataset.visibility === 'uncounted' ? 0 : 1;\n\n\t\t\tvalue = [];\n\t\t\tswitch( format ) {\n\t\t\t\tcase SLIDE_NUMBER_FORMAT_CURRENT:\n\t\t\t\t\tvalue.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset );\n\t\t\t\t\tbreak;\n\t\t\t\tcase SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL:\n\t\t\t\t\tvalue.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset, '/', this.Reveal.getTotalSlides() );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlet indices = this.Reveal.getIndices( slide );\n\t\t\t\t\tvalue.push( indices.h + horizontalOffset );\n\t\t\t\t\tlet sep = format === SLIDE_NUMBER_FORMAT_HORIZONTAL_SLASH_VERTICAL ? '/' : '.';\n\t\t\t\t\tif( this.Reveal.isVerticalSlide( slide ) ) value.push( sep, indices.v + 1 );\n\t\t\t}\n\t\t}\n\n\t\tlet url = '#' + this.Reveal.location.getHash( slide );\n\t\treturn this.formatNumber( value[0], value[1], value[2], url );\n\n\t}\n\n\t/**\n\t * Applies HTML formatting to a slide number before it's\n\t * written to the DOM.\n\t *\n\t * @param {number} a Current slide\n\t * @param {string} delimiter Character to separate slide numbers\n\t * @param {(number|*)} b Total slides\n\t * @param {HTMLElement} [url='#'+locationHash()] The url to link to\n\t * @return {string} HTML string fragment\n\t */\n\tformatNumber( a, delimiter, b, url = '#' + this.Reveal.location.getHash() ) {\n\n\t\tif( typeof b === 'number' && !isNaN( b ) ) {\n\t\t\treturn `\n\t\t\t\t\t${a}\n\t\t\t\t\t${delimiter}\n\t\t\t\t\t${b}\n\t\t\t\t\t`;\n\t\t}\n\t\telse {\n\t\t\treturn `\n\t\t\t\t\t${a}\n\t\t\t\t\t`;\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","import {\n\tSLIDE_NUMBER_FORMAT_CURRENT,\n\tSLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL\n} from \"../utils/constants\";\n\n/**\n * Makes it possible to jump to a slide by entering its\n * slide number or id.\n */\nexport default class JumpToSlide {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onInput = this.onInput.bind( this );\n\t\tthis.onBlur = this.onBlur.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'jump-to-slide';\n\n this.jumpInput = document.createElement( 'input' );\n this.jumpInput.type = 'text';\n this.jumpInput.className = 'jump-to-slide-input';\n this.jumpInput.placeholder = 'Jump to slide';\n\t\tthis.jumpInput.addEventListener( 'input', this.onInput );\n\t\tthis.jumpInput.addEventListener( 'keydown', this.onKeyDown );\n\t\tthis.jumpInput.addEventListener( 'blur', this.onBlur );\n\n this.element.appendChild( this.jumpInput );\n\n\t}\n\n\tshow() {\n\n\t\tthis.indicesOnShow = this.Reveal.getIndices();\n\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\t\tthis.jumpInput.focus();\n\n\t}\n\n\thide() {\n\n\t\tif( this.isVisible() ) {\n\t\t\tthis.element.remove();\n\t\t\tthis.jumpInput.value = '';\n\n\t\t\tclearTimeout( this.jumpTimeout );\n\t\t\tdelete this.jumpTimeout;\n\t\t}\n\n\t}\n\n\tisVisible() {\n\n\t\treturn !!this.element.parentNode;\n\n\t}\n\n\t/**\n\t * Parses the current input and jumps to the given slide.\n\t */\n\tjump() {\n\n\t\tclearTimeout( this.jumpTimeout );\n\t\tdelete this.jumpTimeout;\n\n\t\tlet query = this.jumpInput.value.trim( '' );\n\t\tlet indices;\n\n\t\t// When slide numbers are formatted to be a single linear mumber\n\t\t// (instead of showing a separate horizontal/vertical index) we\n\t\t// use the same format for slide jumps\n\t\tif( /^\\d+$/.test( query ) ) {\n\t\t\tconst slideNumberFormat = this.Reveal.getConfig().slideNumber;\n\t\t\tif( slideNumberFormat === SLIDE_NUMBER_FORMAT_CURRENT || slideNumberFormat === SLIDE_NUMBER_FORMAT_CURRENT_SLASH_TOTAL ) {\n\t\t\t\tconst slide = this.Reveal.getSlides()[ parseInt( query, 10 ) - 1 ];\n\t\t\t\tif( slide ) {\n\t\t\t\t\tindices = this.Reveal.getIndices( slide );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( !indices ) {\n\t\t\t// If the query uses \"horizontal.vertical\" format, convert to\n\t\t\t// \"horizontal/vertical\" so that our URL parser can understand\n\t\t\tif( /^\\d+\\.\\d+$/.test( query ) ) {\n\t\t\t\tquery = query.replace( '.', '/' );\n\t\t\t}\n\n\t\t\tindices = this.Reveal.location.getIndicesFromHash( query, { oneBasedIndex: true } );\n\t\t}\n\n\t\t// Still no valid index? Fall back on a text search\n\t\tif( !indices && /\\S+/i.test( query ) && query.length > 1 ) {\n\t\t\tindices = this.search( query );\n\t\t}\n\n\t\tif( indices && query !== '' ) {\n\t\t\tthis.Reveal.slide( indices.h, indices.v, indices.f );\n\t\t\treturn true;\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.slide( this.indicesOnShow.h, this.indicesOnShow.v, this.indicesOnShow.f );\n\t\t\treturn false;\n\t\t}\n\n\t}\n\n\tjumpAfter( delay ) {\n\n\t\tclearTimeout( this.jumpTimeout );\n\t\tthis.jumpTimeout = setTimeout( () => this.jump(), delay );\n\n\t}\n\n\t/**\n\t * A lofi search that looks for the given query in all\n\t * of our slides and returns the first match.\n\t */\n\tsearch( query ) {\n\n\t\tconst regex = new RegExp( '\\\\b' + query.trim() + '\\\\b', 'i' );\n\n\t\tconst slide = this.Reveal.getSlides().find( ( slide ) => {\n\t\t\treturn regex.test( slide.innerText );\n\t\t} );\n\n\t\tif( slide ) {\n\t\t\treturn this.Reveal.getIndices( slide );\n\t\t}\n\t\telse {\n\t\t\treturn null;\n\t\t}\n\n\t}\n\n\t/**\n\t * Reverts back to the slide we were on when jump to slide was\n\t * invoked.\n\t */\n\tcancel() {\n\n\t\tthis.Reveal.slide( this.indicesOnShow.h, this.indicesOnShow.v, this.indicesOnShow.f );\n\t\tthis.hide();\n\n\t}\n\n\tconfirm() {\n\n\t\tthis.jump();\n\t\tthis.hide();\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.jumpInput.removeEventListener( 'input', this.onInput );\n\t\tthis.jumpInput.removeEventListener( 'keydown', this.onKeyDown );\n\t\tthis.jumpInput.removeEventListener( 'blur', this.onBlur );\n\n\t\tthis.element.remove();\n\n\t}\n\n\tonKeyDown( event ) {\n\n\t\tif( event.keyCode === 13 ) {\n\t\t\tthis.confirm();\n\t\t}\n\t\telse if( event.keyCode === 27 ) {\n\t\t\tthis.cancel();\n\n\t\t\tevent.stopImmediatePropagation();\n\t\t}\n\n\t}\n\n\tonInput( event ) {\n\n\t\tthis.jumpAfter( 200 );\n\n\t}\n\n\tonBlur() {\n\n\t\tsetTimeout( () => this.hide(), 1 );\n\n\t}\n\n}","/**\n * Converts various color input formats to an {r:0,g:0,b:0} object.\n *\n * @param {string} color The string representation of a color\n * @example\n * colorToRgb('#000');\n * @example\n * colorToRgb('#000000');\n * @example\n * colorToRgb('rgb(0,0,0)');\n * @example\n * colorToRgb('rgba(0,0,0)');\n *\n * @return {{r: number, g: number, b: number, [a]: number}|null}\n */\nexport const colorToRgb = ( color ) => {\n\n\tlet hex3 = color.match( /^#([0-9a-f]{3})$/i );\n\tif( hex3 && hex3[1] ) {\n\t\thex3 = hex3[1];\n\t\treturn {\n\t\t\tr: parseInt( hex3.charAt( 0 ), 16 ) * 0x11,\n\t\t\tg: parseInt( hex3.charAt( 1 ), 16 ) * 0x11,\n\t\t\tb: parseInt( hex3.charAt( 2 ), 16 ) * 0x11\n\t\t};\n\t}\n\n\tlet hex6 = color.match( /^#([0-9a-f]{6})$/i );\n\tif( hex6 && hex6[1] ) {\n\t\thex6 = hex6[1];\n\t\treturn {\n\t\t\tr: parseInt( hex6.slice( 0, 2 ), 16 ),\n\t\t\tg: parseInt( hex6.slice( 2, 4 ), 16 ),\n\t\t\tb: parseInt( hex6.slice( 4, 6 ), 16 )\n\t\t};\n\t}\n\n\tlet rgb = color.match( /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i );\n\tif( rgb ) {\n\t\treturn {\n\t\t\tr: parseInt( rgb[1], 10 ),\n\t\t\tg: parseInt( rgb[2], 10 ),\n\t\t\tb: parseInt( rgb[3], 10 )\n\t\t};\n\t}\n\n\tlet rgba = color.match( /^rgba\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\,\\s*([\\d]+|[\\d]*.[\\d]+)\\s*\\)$/i );\n\tif( rgba ) {\n\t\treturn {\n\t\t\tr: parseInt( rgba[1], 10 ),\n\t\t\tg: parseInt( rgba[2], 10 ),\n\t\t\tb: parseInt( rgba[3], 10 ),\n\t\t\ta: parseFloat( rgba[4] )\n\t\t};\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Calculates brightness on a scale of 0-255.\n *\n * @param {string} color See colorToRgb for supported formats.\n * @see {@link colorToRgb}\n */\nexport const colorBrightness = ( color ) => {\n\n\tif( typeof color === 'string' ) color = colorToRgb( color );\n\n\tif( color ) {\n\t\treturn ( color.r * 299 + color.g * 587 + color.b * 114 ) / 1000;\n\t}\n\n\treturn null;\n\n}","import { queryAll } from '../utils/util.js'\nimport { colorToRgb, colorBrightness } from '../utils/color.js'\n\n/**\n * Creates and updates slide backgrounds.\n */\nexport default class Backgrounds {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'backgrounds';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Creates the slide background elements and appends them\n\t * to the background container. One element is created per\n\t * slide no matter if the given slide has visible background.\n\t */\n\tcreate() {\n\n\t\t// Clear prior backgrounds\n\t\tthis.element.innerHTML = '';\n\t\tthis.element.classList.add( 'no-transition' );\n\n\t\t// Iterate over all horizontal slides\n\t\tthis.Reveal.getHorizontalSlides().forEach( slideh => {\n\n\t\t\tlet backgroundStack = this.createBackground( slideh, this.element );\n\n\t\t\t// Iterate over all vertical slides\n\t\t\tqueryAll( slideh, 'section' ).forEach( slidev => {\n\n\t\t\t\tthis.createBackground( slidev, backgroundStack );\n\n\t\t\t\tbackgroundStack.classList.add( 'stack' );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\t// Add parallax background if specified\n\t\tif( this.Reveal.getConfig().parallaxBackgroundImage ) {\n\n\t\t\tthis.element.style.backgroundImage = 'url(\"' + this.Reveal.getConfig().parallaxBackgroundImage + '\")';\n\t\t\tthis.element.style.backgroundSize = this.Reveal.getConfig().parallaxBackgroundSize;\n\t\t\tthis.element.style.backgroundRepeat = this.Reveal.getConfig().parallaxBackgroundRepeat;\n\t\t\tthis.element.style.backgroundPosition = this.Reveal.getConfig().parallaxBackgroundPosition;\n\n\t\t\t// Make sure the below properties are set on the element - these properties are\n\t\t\t// needed for proper transitions to be set on the element via CSS. To remove\n\t\t\t// annoying background slide-in effect when the presentation starts, apply\n\t\t\t// these properties after short time delay\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.Reveal.getRevealElement().classList.add( 'has-parallax-background' );\n\t\t\t}, 1 );\n\n\t\t}\n\t\telse {\n\n\t\t\tthis.element.style.backgroundImage = '';\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'has-parallax-background' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a background for the given slide.\n\t *\n\t * @param {HTMLElement} slide\n\t * @param {HTMLElement} container The element that the background\n\t * should be appended to\n\t * @return {HTMLElement} New background div\n\t */\n\tcreateBackground( slide, container ) {\n\n\t\t// Main slide background element\n\t\tlet element = document.createElement( 'div' );\n\t\telement.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' );\n\n\t\t// Inner background element that wraps images/videos/iframes\n\t\tlet contentElement = document.createElement( 'div' );\n\t\tcontentElement.className = 'slide-background-content';\n\n\t\telement.appendChild( contentElement );\n\t\tcontainer.appendChild( element );\n\n\t\tslide.slideBackgroundElement = element;\n\t\tslide.slideBackgroundContentElement = contentElement;\n\n\t\t// Syncs the background to reflect all current background settings\n\t\tthis.sync( slide );\n\n\t\treturn element;\n\n\t}\n\n\t/**\n\t * Renders all of the visual properties of a slide background\n\t * based on the various background attributes.\n\t *\n\t * @param {HTMLElement} slide\n\t */\n\tsync( slide ) {\n\n\t\tconst element = slide.slideBackgroundElement,\n\t\t\tcontentElement = slide.slideBackgroundContentElement;\n\n\t\tconst data = {\n\t\t\tbackground: slide.getAttribute( 'data-background' ),\n\t\t\tbackgroundSize: slide.getAttribute( 'data-background-size' ),\n\t\t\tbackgroundImage: slide.getAttribute( 'data-background-image' ),\n\t\t\tbackgroundVideo: slide.getAttribute( 'data-background-video' ),\n\t\t\tbackgroundIframe: slide.getAttribute( 'data-background-iframe' ),\n\t\t\tbackgroundColor: slide.getAttribute( 'data-background-color' ),\n\t\t\tbackgroundGradient: slide.getAttribute( 'data-background-gradient' ),\n\t\t\tbackgroundRepeat: slide.getAttribute( 'data-background-repeat' ),\n\t\t\tbackgroundPosition: slide.getAttribute( 'data-background-position' ),\n\t\t\tbackgroundTransition: slide.getAttribute( 'data-background-transition' ),\n\t\t\tbackgroundOpacity: slide.getAttribute( 'data-background-opacity' ),\n\t\t};\n\n\t\tconst dataPreload = slide.hasAttribute( 'data-preload' );\n\n\t\t// Reset the prior background state in case this is not the\n\t\t// initial sync\n\t\tslide.classList.remove( 'has-dark-background' );\n\t\tslide.classList.remove( 'has-light-background' );\n\n\t\telement.removeAttribute( 'data-loaded' );\n\t\telement.removeAttribute( 'data-background-hash' );\n\t\telement.removeAttribute( 'data-background-size' );\n\t\telement.removeAttribute( 'data-background-transition' );\n\t\telement.style.backgroundColor = '';\n\n\t\tcontentElement.style.backgroundSize = '';\n\t\tcontentElement.style.backgroundRepeat = '';\n\t\tcontentElement.style.backgroundPosition = '';\n\t\tcontentElement.style.backgroundImage = '';\n\t\tcontentElement.style.opacity = '';\n\t\tcontentElement.innerHTML = '';\n\n\t\tif( data.background ) {\n\t\t\t// Auto-wrap image urls in url(...)\n\t\t\tif( /^(http|file|\\/\\/)/gi.test( data.background ) || /\\.(svg|png|jpg|jpeg|gif|bmp|webp)([?#\\s]|$)/gi.test( data.background ) ) {\n\t\t\t\tslide.setAttribute( 'data-background-image', data.background );\n\t\t\t}\n\t\t\telse {\n\t\t\t\telement.style.background = data.background;\n\t\t\t}\n\t\t}\n\n\t\t// Create a hash for this combination of background settings.\n\t\t// This is used to determine when two slide backgrounds are\n\t\t// the same.\n\t\tif( data.background || data.backgroundColor || data.backgroundGradient || data.backgroundImage || data.backgroundVideo || data.backgroundIframe ) {\n\t\t\telement.setAttribute( 'data-background-hash', data.background +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundSize +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundImage +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundVideo +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundIframe +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundColor +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundGradient +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundRepeat +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundPosition +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundTransition +\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata.backgroundOpacity );\n\t\t}\n\n\t\t// Additional and optional background properties\n\t\tif( data.backgroundSize ) element.setAttribute( 'data-background-size', data.backgroundSize );\n\t\tif( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor;\n\t\tif( data.backgroundGradient ) element.style.backgroundImage = data.backgroundGradient;\n\t\tif( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition );\n\n\t\tif( dataPreload ) element.setAttribute( 'data-preload', '' );\n\n\t\t// Background image options are set on the content wrapper\n\t\tif( data.backgroundSize ) contentElement.style.backgroundSize = data.backgroundSize;\n\t\tif( data.backgroundRepeat ) contentElement.style.backgroundRepeat = data.backgroundRepeat;\n\t\tif( data.backgroundPosition ) contentElement.style.backgroundPosition = data.backgroundPosition;\n\t\tif( data.backgroundOpacity ) contentElement.style.opacity = data.backgroundOpacity;\n\n\t\tconst contrastClass = this.getContrastClass( slide );\n\n\t\tif( typeof contrastClass === 'string' ) {\n\t\t\tslide.classList.add( contrastClass );\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a class name that can be applied to a slide to indicate\n\t * if it has a light or dark background.\n\t *\n\t * @param {*} slide\n\t *\n\t * @returns {string|null}\n\t */\n\tgetContrastClass( slide ) {\n\n\t\tconst element = slide.slideBackgroundElement;\n\n\t\t// If this slide has a background color, we add a class that\n\t\t// signals if it is light or dark. If the slide has no background\n\t\t// color, no class will be added\n\t\tlet contrastColor = slide.getAttribute( 'data-background-color' );\n\n\t\t// If no bg color was found, or it cannot be converted by colorToRgb, check the computed background\n\t\tif( !contrastColor || !colorToRgb( contrastColor ) ) {\n\t\t\tlet computedBackgroundStyle = window.getComputedStyle( element );\n\t\t\tif( computedBackgroundStyle && computedBackgroundStyle.backgroundColor ) {\n\t\t\t\tcontrastColor = computedBackgroundStyle.backgroundColor;\n\t\t\t}\n\t\t}\n\n\t\tif( contrastColor ) {\n\t\t\tconst rgb = colorToRgb( contrastColor );\n\n\t\t\t// Ignore fully transparent backgrounds. Some browsers return\n\t\t\t// rgba(0,0,0,0) when reading the computed background color of\n\t\t\t// an element with no background\n\t\t\tif( rgb && rgb.a !== 0 ) {\n\t\t\t\tif( colorBrightness( contrastColor ) < 128 ) {\n\t\t\t\t\treturn 'has-dark-background';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn 'has-light-background';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Bubble the 'has-light-background'/'has-dark-background' classes.\n\t */\n\tbubbleSlideContrastClassToElement( slide, target ) {\n\n\t\t[ 'has-light-background', 'has-dark-background' ].forEach( classToBubble => {\n\t\t\tif( slide.classList.contains( classToBubble ) ) {\n\t\t\t\ttarget.classList.add( classToBubble );\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttarget.classList.remove( classToBubble );\n\t\t\t}\n\t\t}, this );\n\n\t}\n\n\t/**\n\t * Updates the background elements to reflect the current\n\t * slide.\n\t *\n\t * @param {boolean} includeAll If true, the backgrounds of\n\t * all vertical slides (not just the present) will be updated.\n\t */\n\tupdate( includeAll = false ) {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tlet indices = this.Reveal.getIndices();\n\n\t\tlet currentBackground = null;\n\n\t\t// Reverse past/future classes when in RTL mode\n\t\tlet horizontalPast = this.Reveal.getConfig().rtl ? 'future' : 'past',\n\t\t\thorizontalFuture = this.Reveal.getConfig().rtl ? 'past' : 'future';\n\n\t\t// Update the classes of all backgrounds to match the\n\t\t// states of their slides (past/present/future)\n\t\tArray.from( this.element.childNodes ).forEach( ( backgroundh, h ) => {\n\n\t\t\tbackgroundh.classList.remove( 'past', 'present', 'future' );\n\n\t\t\tif( h < indices.h ) {\n\t\t\t\tbackgroundh.classList.add( horizontalPast );\n\t\t\t}\n\t\t\telse if ( h > indices.h ) {\n\t\t\t\tbackgroundh.classList.add( horizontalFuture );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundh.classList.add( 'present' );\n\n\t\t\t\t// Store a reference to the current background element\n\t\t\t\tcurrentBackground = backgroundh;\n\t\t\t}\n\n\t\t\tif( includeAll || h === indices.h ) {\n\t\t\t\tqueryAll( backgroundh, '.slide-background' ).forEach( ( backgroundv, v ) => {\n\n\t\t\t\t\tbackgroundv.classList.remove( 'past', 'present', 'future' );\n\n\t\t\t\t\tconst indexv = typeof indices.v === 'number' ? indices.v : 0;\n\n\t\t\t\t\tif( v < indexv ) {\n\t\t\t\t\t\tbackgroundv.classList.add( 'past' );\n\t\t\t\t\t}\n\t\t\t\t\telse if ( v > indexv ) {\n\t\t\t\t\t\tbackgroundv.classList.add( 'future' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbackgroundv.classList.add( 'present' );\n\n\t\t\t\t\t\t// Only if this is the present horizontal and vertical slide\n\t\t\t\t\t\tif( h === indices.h ) currentBackground = backgroundv;\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t}\n\n\t\t} );\n\n\t\t// Stop content inside of previous backgrounds\n\t\tif( this.previousBackground ) {\n\n\t\t\tthis.Reveal.slideContent.stopEmbeddedContent( this.previousBackground, { unloadIframes: !this.Reveal.slideContent.shouldPreload( this.previousBackground ) } );\n\n\t\t}\n\n\t\t// Start content in the current background\n\t\tif( currentBackground ) {\n\n\t\t\tthis.Reveal.slideContent.startEmbeddedContent( currentBackground );\n\n\t\t\tlet currentBackgroundContent = currentBackground.querySelector( '.slide-background-content' );\n\t\t\tif( currentBackgroundContent ) {\n\n\t\t\t\tlet backgroundImageURL = currentBackgroundContent.style.backgroundImage || '';\n\n\t\t\t\t// Restart GIFs (doesn't work in Firefox)\n\t\t\t\tif( /\\.gif/i.test( backgroundImageURL ) ) {\n\t\t\t\t\tcurrentBackgroundContent.style.backgroundImage = '';\n\t\t\t\t\twindow.getComputedStyle( currentBackgroundContent ).opacity;\n\t\t\t\t\tcurrentBackgroundContent.style.backgroundImage = backgroundImageURL;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Don't transition between identical backgrounds. This\n\t\t\t// prevents unwanted flicker.\n\t\t\tlet previousBackgroundHash = this.previousBackground ? this.previousBackground.getAttribute( 'data-background-hash' ) : null;\n\t\t\tlet currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' );\n\t\t\tif( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== this.previousBackground ) {\n\t\t\t\tthis.element.classList.add( 'no-transition' );\n\t\t\t}\n\n\t\t\tthis.previousBackground = currentBackground;\n\n\t\t}\n\n\t\t// If there's a background brightness flag for this slide,\n\t\t// bubble it to the .reveal container\n\t\tif( currentSlide ) {\n\t\t\tthis.bubbleSlideContrastClassToElement( currentSlide, this.Reveal.getRevealElement() );\n\t\t}\n\n\t\t// Allow the first background to apply without transition\n\t\tsetTimeout( () => {\n\t\t\tthis.element.classList.remove( 'no-transition' );\n\t\t}, 1 );\n\n\t}\n\n\t/**\n\t * Updates the position of the parallax background based\n\t * on the current slide index.\n\t */\n\tupdateParallax() {\n\n\t\tlet indices = this.Reveal.getIndices();\n\n\t\tif( this.Reveal.getConfig().parallaxBackgroundImage ) {\n\n\t\t\tlet horizontalSlides = this.Reveal.getHorizontalSlides(),\n\t\t\t\tverticalSlides = this.Reveal.getVerticalSlides();\n\n\t\t\tlet backgroundSize = this.element.style.backgroundSize.split( ' ' ),\n\t\t\t\tbackgroundWidth, backgroundHeight;\n\n\t\t\tif( backgroundSize.length === 1 ) {\n\t\t\t\tbackgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbackgroundWidth = parseInt( backgroundSize[0], 10 );\n\t\t\t\tbackgroundHeight = parseInt( backgroundSize[1], 10 );\n\t\t\t}\n\n\t\t\tlet slideWidth = this.element.offsetWidth,\n\t\t\t\thorizontalSlideCount = horizontalSlides.length,\n\t\t\t\thorizontalOffsetMultiplier,\n\t\t\t\thorizontalOffset;\n\n\t\t\tif( typeof this.Reveal.getConfig().parallaxBackgroundHorizontal === 'number' ) {\n\t\t\t\thorizontalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundHorizontal;\n\t\t\t}\n\t\t\telse {\n\t\t\t\thorizontalOffsetMultiplier = horizontalSlideCount > 1 ? ( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) : 0;\n\t\t\t}\n\n\t\t\thorizontalOffset = horizontalOffsetMultiplier * indices.h * -1;\n\n\t\t\tlet slideHeight = this.element.offsetHeight,\n\t\t\t\tverticalSlideCount = verticalSlides.length,\n\t\t\t\tverticalOffsetMultiplier,\n\t\t\t\tverticalOffset;\n\n\t\t\tif( typeof this.Reveal.getConfig().parallaxBackgroundVertical === 'number' ) {\n\t\t\t\tverticalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundVertical;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tverticalOffsetMultiplier = ( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 );\n\t\t\t}\n\n\t\t\tverticalOffset = verticalSlideCount > 0 ? verticalOffsetMultiplier * indices.v : 0;\n\n\t\t\tthis.element.style.backgroundPosition = horizontalOffset + 'px ' + -verticalOffset + 'px';\n\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}\n","import { queryAll, extend, createStyleSheet, matches, closest } from '../utils/util.js'\nimport { FRAGMENT_STYLE_REGEX } from '../utils/constants.js'\n\n// Counter used to generate unique IDs for auto-animated elements\nlet autoAnimateCounter = 0;\n\n/**\n * Automatically animates matching elements across\n * slides with the [data-auto-animate] attribute.\n */\nexport default class AutoAnimate {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Runs an auto-animation between the given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t */\n\trun( fromSlide, toSlide ) {\n\n\t\t// Clean up after prior animations\n\t\tthis.reset();\n\n\t\tlet allSlides = this.Reveal.getSlides();\n\t\tlet toSlideIndex = allSlides.indexOf( toSlide );\n\t\tlet fromSlideIndex = allSlides.indexOf( fromSlide );\n\n\t\t// Ensure that both slides are auto-animate targets with the same data-auto-animate-id value\n\t\t// (including null if absent on both) and that data-auto-animate-restart isn't set on the\n\t\t// physically latter slide (independent of slide direction)\n\t\tif( fromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' )\n\t\t\t\t&& fromSlide.getAttribute( 'data-auto-animate-id' ) === toSlide.getAttribute( 'data-auto-animate-id' ) \n\t\t\t\t&& !( toSlideIndex > fromSlideIndex ? toSlide : fromSlide ).hasAttribute( 'data-auto-animate-restart' ) ) {\n\n\t\t\t// Create a new auto-animate sheet\n\t\t\tthis.autoAnimateStyleSheet = this.autoAnimateStyleSheet || createStyleSheet();\n\n\t\t\tlet animationOptions = this.getAutoAnimateOptions( toSlide );\n\n\t\t\t// Set our starting state\n\t\t\tfromSlide.dataset.autoAnimate = 'pending';\n\t\t\ttoSlide.dataset.autoAnimate = 'pending';\n\n\t\t\t// Flag the navigation direction, needed for fragment buildup\n\t\t\tanimationOptions.slideDirection = toSlideIndex > fromSlideIndex ? 'forward' : 'backward';\n\n\t\t\t// If the from-slide is hidden because it has moved outside\n\t\t\t// the view distance, we need to temporarily show it while\n\t\t\t// measuring\n\t\t\tlet fromSlideIsHidden = fromSlide.style.display === 'none';\n\t\t\tif( fromSlideIsHidden ) fromSlide.style.display = this.Reveal.getConfig().display;\n\n\t\t\t// Inject our auto-animate styles for this transition\n\t\t\tlet css = this.getAutoAnimatableElements( fromSlide, toSlide ).map( elements => {\n\t\t\t\treturn this.autoAnimateElements( elements.from, elements.to, elements.options || {}, animationOptions, autoAnimateCounter++ );\n\t\t\t} );\n\n\t\t\tif( fromSlideIsHidden ) fromSlide.style.display = 'none';\n\n\t\t\t// Animate unmatched elements, if enabled\n\t\t\tif( toSlide.dataset.autoAnimateUnmatched !== 'false' && this.Reveal.getConfig().autoAnimateUnmatched === true ) {\n\n\t\t\t\t// Our default timings for unmatched elements\n\t\t\t\tlet defaultUnmatchedDuration = animationOptions.duration * 0.8,\n\t\t\t\t\tdefaultUnmatchedDelay = animationOptions.duration * 0.2;\n\n\t\t\t\tthis.getUnmatchedAutoAnimateElements( toSlide ).forEach( unmatchedElement => {\n\n\t\t\t\t\tlet unmatchedOptions = this.getAutoAnimateOptions( unmatchedElement, animationOptions );\n\t\t\t\t\tlet id = 'unmatched';\n\n\t\t\t\t\t// If there is a duration or delay set specifically for this\n\t\t\t\t\t// element our unmatched elements should adhere to those\n\t\t\t\t\tif( unmatchedOptions.duration !== animationOptions.duration || unmatchedOptions.delay !== animationOptions.delay ) {\n\t\t\t\t\t\tid = 'unmatched-' + autoAnimateCounter++;\n\t\t\t\t\t\tcss.push( `[data-auto-animate=\"running\"] [data-auto-animate-target=\"${id}\"] { transition: opacity ${unmatchedOptions.duration}s ease ${unmatchedOptions.delay}s; }` );\n\t\t\t\t\t}\n\n\t\t\t\t\tunmatchedElement.dataset.autoAnimateTarget = id;\n\n\t\t\t\t}, this );\n\n\t\t\t\t// Our default transition for unmatched elements\n\t\t\t\tcss.push( `[data-auto-animate=\"running\"] [data-auto-animate-target=\"unmatched\"] { transition: opacity ${defaultUnmatchedDuration}s ease ${defaultUnmatchedDelay}s; }` );\n\n\t\t\t}\n\n\t\t\t// Setting the whole chunk of CSS at once is the most\n\t\t\t// efficient way to do this. Using sheet.insertRule\n\t\t\t// is multiple factors slower.\n\t\t\tthis.autoAnimateStyleSheet.innerHTML = css.join( '' );\n\n\t\t\t// Start the animation next cycle\n\t\t\trequestAnimationFrame( () => {\n\t\t\t\tif( this.autoAnimateStyleSheet ) {\n\t\t\t\t\t// This forces our newly injected styles to be applied in Firefox\n\t\t\t\t\tgetComputedStyle( this.autoAnimateStyleSheet ).fontWeight;\n\n\t\t\t\t\ttoSlide.dataset.autoAnimate = 'running';\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'autoanimate',\n\t\t\t\tdata: {\n\t\t\t\t\tfromSlide,\n\t\t\t\t\ttoSlide,\n\t\t\t\t\tsheet: this.autoAnimateStyleSheet\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Rolls back all changes that we've made to the DOM so\n\t * that as part of animating.\n\t */\n\treset() {\n\n\t\t// Reset slides\n\t\tqueryAll( this.Reveal.getRevealElement(), '[data-auto-animate]:not([data-auto-animate=\"\"])' ).forEach( element => {\n\t\t\telement.dataset.autoAnimate = '';\n\t\t} );\n\n\t\t// Reset elements\n\t\tqueryAll( this.Reveal.getRevealElement(), '[data-auto-animate-target]' ).forEach( element => {\n\t\t\tdelete element.dataset.autoAnimateTarget;\n\t\t} );\n\n\t\t// Remove the animation sheet\n\t\tif( this.autoAnimateStyleSheet && this.autoAnimateStyleSheet.parentNode ) {\n\t\t\tthis.autoAnimateStyleSheet.parentNode.removeChild( this.autoAnimateStyleSheet );\n\t\t\tthis.autoAnimateStyleSheet = null;\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a FLIP animation where the `to` element starts out\n\t * in the `from` element position and animates to its original\n\t * state.\n\t *\n\t * @param {HTMLElement} from\n\t * @param {HTMLElement} to\n\t * @param {Object} elementOptions Options for this element pair\n\t * @param {Object} animationOptions Options set at the slide level\n\t * @param {String} id Unique ID that we can use to identify this\n\t * auto-animate element in the DOM\n\t */\n\tautoAnimateElements( from, to, elementOptions, animationOptions, id ) {\n\n\t\t// 'from' elements are given a data-auto-animate-target with no value,\n\t\t// 'to' elements are are given a data-auto-animate-target with an ID\n\t\tfrom.dataset.autoAnimateTarget = '';\n\t\tto.dataset.autoAnimateTarget = id;\n\n\t\t// Each element may override any of the auto-animate options\n\t\t// like transition easing, duration and delay via data-attributes\n\t\tlet options = this.getAutoAnimateOptions( to, animationOptions );\n\n\t\t// If we're using a custom element matcher the element options\n\t\t// may contain additional transition overrides\n\t\tif( typeof elementOptions.delay !== 'undefined' ) options.delay = elementOptions.delay;\n\t\tif( typeof elementOptions.duration !== 'undefined' ) options.duration = elementOptions.duration;\n\t\tif( typeof elementOptions.easing !== 'undefined' ) options.easing = elementOptions.easing;\n\n\t\tlet fromProps = this.getAutoAnimatableProperties( 'from', from, elementOptions ),\n\t\t\ttoProps = this.getAutoAnimatableProperties( 'to', to, elementOptions );\n\n\t\t// Maintain fragment visibility for matching elements when\n\t\t// we're navigating forwards, this way the viewer won't need\n\t\t// to step through the same fragments twice\n\t\tif( to.classList.contains( 'fragment' ) ) {\n\n\t\t\t// Don't auto-animate the opacity of fragments to avoid\n\t\t\t// conflicts with fragment animations\n\t\t\tdelete toProps.styles['opacity'];\n\n\t\t\tif( from.classList.contains( 'fragment' ) ) {\n\n\t\t\t\tlet fromFragmentStyle = ( from.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0];\n\t\t\t\tlet toFragmentStyle = ( to.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0];\n\n\t\t\t\t// Only skip the fragment if the fragment animation style\n\t\t\t\t// remains unchanged\n\t\t\t\tif( fromFragmentStyle === toFragmentStyle && animationOptions.slideDirection === 'forward' ) {\n\t\t\t\t\tto.classList.add( 'visible', 'disabled' );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If translation and/or scaling are enabled, css transform\n\t\t// the 'to' element so that it matches the position and size\n\t\t// of the 'from' element\n\t\tif( elementOptions.translate !== false || elementOptions.scale !== false ) {\n\n\t\t\tlet presentationScale = this.Reveal.getScale();\n\n\t\t\tlet delta = {\n\t\t\t\tx: ( fromProps.x - toProps.x ) / presentationScale,\n\t\t\t\ty: ( fromProps.y - toProps.y ) / presentationScale,\n\t\t\t\tscaleX: fromProps.width / toProps.width,\n\t\t\t\tscaleY: fromProps.height / toProps.height\n\t\t\t};\n\n\t\t\t// Limit decimal points to avoid 0.0001px blur and stutter\n\t\t\tdelta.x = Math.round( delta.x * 1000 ) / 1000;\n\t\t\tdelta.y = Math.round( delta.y * 1000 ) / 1000;\n\t\t\tdelta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;\n\t\t\tdelta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;\n\n\t\t\tlet translate = elementOptions.translate !== false && ( delta.x !== 0 || delta.y !== 0 ),\n\t\t\t\tscale = elementOptions.scale !== false && ( delta.scaleX !== 0 || delta.scaleY !== 0 );\n\n\t\t\t// No need to transform if nothing's changed\n\t\t\tif( translate || scale ) {\n\n\t\t\t\tlet transform = [];\n\n\t\t\t\tif( translate ) transform.push( `translate(${delta.x}px, ${delta.y}px)` );\n\t\t\t\tif( scale ) transform.push( `scale(${delta.scaleX}, ${delta.scaleY})` );\n\n\t\t\t\tfromProps.styles['transform'] = transform.join( ' ' );\n\t\t\t\tfromProps.styles['transform-origin'] = 'top left';\n\n\t\t\t\ttoProps.styles['transform'] = 'none';\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Delete all unchanged 'to' styles\n\t\tfor( let propertyName in toProps.styles ) {\n\t\t\tconst toValue = toProps.styles[propertyName];\n\t\t\tconst fromValue = fromProps.styles[propertyName];\n\n\t\t\tif( toValue === fromValue ) {\n\t\t\t\tdelete toProps.styles[propertyName];\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// If these property values were set via a custom matcher providing\n\t\t\t\t// an explicit 'from' and/or 'to' value, we always inject those values.\n\t\t\t\tif( toValue.explicitValue === true ) {\n\t\t\t\t\ttoProps.styles[propertyName] = toValue.value;\n\t\t\t\t}\n\n\t\t\t\tif( fromValue.explicitValue === true ) {\n\t\t\t\t\tfromProps.styles[propertyName] = fromValue.value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet css = '';\n\n\t\tlet toStyleProperties = Object.keys( toProps.styles );\n\n\t\t// Only create animate this element IF at least one style\n\t\t// property has changed\n\t\tif( toStyleProperties.length > 0 ) {\n\n\t\t\t// Instantly move to the 'from' state\n\t\t\tfromProps.styles['transition'] = 'none';\n\n\t\t\t// Animate towards the 'to' state\n\t\t\ttoProps.styles['transition'] = `all ${options.duration}s ${options.easing} ${options.delay}s`;\n\t\t\ttoProps.styles['transition-property'] = toStyleProperties.join( ', ' );\n\t\t\ttoProps.styles['will-change'] = toStyleProperties.join( ', ' );\n\n\t\t\t// Build up our custom CSS. We need to override inline styles\n\t\t\t// so we need to make our styles vErY IMPORTANT!1!!\n\t\t\tlet fromCSS = Object.keys( fromProps.styles ).map( propertyName => {\n\t\t\t\treturn propertyName + ': ' + fromProps.styles[propertyName] + ' !important;';\n\t\t\t} ).join( '' );\n\n\t\t\tlet toCSS = Object.keys( toProps.styles ).map( propertyName => {\n\t\t\t\treturn propertyName + ': ' + toProps.styles[propertyName] + ' !important;';\n\t\t\t} ).join( '' );\n\n\t\t\tcss = \t'[data-auto-animate-target=\"'+ id +'\"] {'+ fromCSS +'}' +\n\t\t\t\t\t'[data-auto-animate=\"running\"] [data-auto-animate-target=\"'+ id +'\"] {'+ toCSS +'}';\n\n\t\t}\n\n\t\treturn css;\n\n\t}\n\n\t/**\n\t * Returns the auto-animate options for the given element.\n\t *\n\t * @param {HTMLElement} element Element to pick up options\n\t * from, either a slide or an animation target\n\t * @param {Object} [inheritedOptions] Optional set of existing\n\t * options\n\t */\n\tgetAutoAnimateOptions( element, inheritedOptions ) {\n\n\t\tlet options = {\n\t\t\teasing: this.Reveal.getConfig().autoAnimateEasing,\n\t\t\tduration: this.Reveal.getConfig().autoAnimateDuration,\n\t\t\tdelay: 0\n\t\t};\n\n\t\toptions = extend( options, inheritedOptions );\n\n\t\t// Inherit options from parent elements\n\t\tif( element.parentNode ) {\n\t\t\tlet autoAnimatedParent = closest( element.parentNode, '[data-auto-animate-target]' );\n\t\t\tif( autoAnimatedParent ) {\n\t\t\t\toptions = this.getAutoAnimateOptions( autoAnimatedParent, options );\n\t\t\t}\n\t\t}\n\n\t\tif( element.dataset.autoAnimateEasing ) {\n\t\t\toptions.easing = element.dataset.autoAnimateEasing;\n\t\t}\n\n\t\tif( element.dataset.autoAnimateDuration ) {\n\t\t\toptions.duration = parseFloat( element.dataset.autoAnimateDuration );\n\t\t}\n\n\t\tif( element.dataset.autoAnimateDelay ) {\n\t\t\toptions.delay = parseFloat( element.dataset.autoAnimateDelay );\n\t\t}\n\n\t\treturn options;\n\n\t}\n\n\t/**\n\t * Returns an object containing all of the properties\n\t * that can be auto-animated for the given element and\n\t * their current computed values.\n\t *\n\t * @param {String} direction 'from' or 'to'\n\t */\n\tgetAutoAnimatableProperties( direction, element, elementOptions ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\tlet properties = { styles: [] };\n\n\t\t// Position and size\n\t\tif( elementOptions.translate !== false || elementOptions.scale !== false ) {\n\t\t\tlet bounds;\n\n\t\t\t// Custom auto-animate may optionally return a custom tailored\n\t\t\t// measurement function\n\t\t\tif( typeof elementOptions.measure === 'function' ) {\n\t\t\t\tbounds = elementOptions.measure( element );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( config.center ) {\n\t\t\t\t\t// More precise, but breaks when used in combination\n\t\t\t\t\t// with zoom for scaling the deck ¯\\_(ツ)_/¯\n\t\t\t\t\tbounds = element.getBoundingClientRect();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlet scale = this.Reveal.getScale();\n\t\t\t\t\tbounds = {\n\t\t\t\t\t\tx: element.offsetLeft * scale,\n\t\t\t\t\t\ty: element.offsetTop * scale,\n\t\t\t\t\t\twidth: element.offsetWidth * scale,\n\t\t\t\t\t\theight: element.offsetHeight * scale\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tproperties.x = bounds.x;\n\t\t\tproperties.y = bounds.y;\n\t\t\tproperties.width = bounds.width;\n\t\t\tproperties.height = bounds.height;\n\t\t}\n\n\t\tconst computedStyles = getComputedStyle( element );\n\n\t\t// CSS styles\n\t\t( elementOptions.styles || config.autoAnimateStyles ).forEach( style => {\n\t\t\tlet value;\n\n\t\t\t// `style` is either the property name directly, or an object\n\t\t\t// definition of a style property\n\t\t\tif( typeof style === 'string' ) style = { property: style };\n\n\t\t\tif( typeof style.from !== 'undefined' && direction === 'from' ) {\n\t\t\t\tvalue = { value: style.from, explicitValue: true };\n\t\t\t}\n\t\t\telse if( typeof style.to !== 'undefined' && direction === 'to' ) {\n\t\t\t\tvalue = { value: style.to, explicitValue: true };\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Use a unitless value for line-height so that it inherits properly\n\t\t\t\tif( style.property === 'line-height' ) {\n\t\t\t\t\tvalue = parseFloat( computedStyles['line-height'] ) / parseFloat( computedStyles['font-size'] );\n\t\t\t\t}\n\n\t\t\t\tif( isNaN(value) ) {\n\t\t\t\t\tvalue = computedStyles[style.property];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif( value !== '' ) {\n\t\t\t\tproperties.styles[style.property] = value;\n\t\t\t}\n\t\t} );\n\n\t\treturn properties;\n\n\t}\n\n\t/**\n\t * Get a list of all element pairs that we can animate\n\t * between the given slides.\n\t *\n\t * @param {HTMLElement} fromSlide\n\t * @param {HTMLElement} toSlide\n\t *\n\t * @return {Array} Each value is an array where [0] is\n\t * the element we're animating from and [1] is the\n\t * element we're animating to\n\t */\n\tgetAutoAnimatableElements( fromSlide, toSlide ) {\n\n\t\tlet matcher = typeof this.Reveal.getConfig().autoAnimateMatcher === 'function' ? this.Reveal.getConfig().autoAnimateMatcher : this.getAutoAnimatePairs;\n\n\t\tlet pairs = matcher.call( this, fromSlide, toSlide );\n\n\t\tlet reserved = [];\n\n\t\t// Remove duplicate pairs\n\t\treturn pairs.filter( ( pair, index ) => {\n\t\t\tif( reserved.indexOf( pair.to ) === -1 ) {\n\t\t\t\treserved.push( pair.to );\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Identifies matching elements between slides.\n\t *\n\t * You can specify a custom matcher function by using\n\t * the `autoAnimateMatcher` config option.\n\t */\n\tgetAutoAnimatePairs( fromSlide, toSlide ) {\n\n\t\tlet pairs = [];\n\n\t\tconst codeNodes = 'pre';\n\t\tconst textNodes = 'h1, h2, h3, h4, h5, h6, p, li';\n\t\tconst mediaNodes = 'img, video, iframe';\n\n\t\t// Explicit matches via data-id\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, '[data-id]', node => {\n\t\t\treturn node.nodeName + ':::' + node.getAttribute( 'data-id' );\n\t\t} );\n\n\t\t// Text\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, textNodes, node => {\n\t\t\treturn node.nodeName + ':::' + node.innerText;\n\t\t} );\n\n\t\t// Media\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, mediaNodes, node => {\n\t\t\treturn node.nodeName + ':::' + ( node.getAttribute( 'src' ) || node.getAttribute( 'data-src' ) );\n\t\t} );\n\n\t\t// Code\n\t\tthis.findAutoAnimateMatches( pairs, fromSlide, toSlide, codeNodes, node => {\n\t\t\treturn node.nodeName + ':::' + node.innerText;\n\t\t} );\n\n\t\tpairs.forEach( pair => {\n\t\t\t// Disable scale transformations on text nodes, we transition\n\t\t\t// each individual text property instead\n\t\t\tif( matches( pair.from, textNodes ) ) {\n\t\t\t\tpair.options = { scale: false };\n\t\t\t}\n\t\t\t// Animate individual lines of code\n\t\t\telse if( matches( pair.from, codeNodes ) ) {\n\n\t\t\t\t// Transition the code block's width and height instead of scaling\n\t\t\t\t// to prevent its content from being squished\n\t\t\t\tpair.options = { scale: false, styles: [ 'width', 'height' ] };\n\n\t\t\t\t// Lines of code\n\t\t\t\tthis.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-code', node => {\n\t\t\t\t\treturn node.textContent;\n\t\t\t\t}, {\n\t\t\t\t\tscale: false,\n\t\t\t\t\tstyles: [],\n\t\t\t\t\tmeasure: this.getLocalBoundingBox.bind( this )\n\t\t\t\t} );\n\n\t\t\t\t// Line numbers\n\t\t\t\tthis.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-numbers[data-line-number]', node => {\n\t\t\t\t\treturn node.getAttribute( 'data-line-number' );\n\t\t\t\t}, {\n\t\t\t\t\tscale: false,\n\t\t\t\t\tstyles: [ 'width' ],\n\t\t\t\t\tmeasure: this.getLocalBoundingBox.bind( this )\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}, this );\n\n\t\treturn pairs;\n\n\t}\n\n\t/**\n\t * Helper method which returns a bounding box based on\n\t * the given elements offset coordinates.\n\t *\n\t * @param {HTMLElement} element\n\t * @return {Object} x, y, width, height\n\t */\n\tgetLocalBoundingBox( element ) {\n\n\t\tconst presentationScale = this.Reveal.getScale();\n\n\t\treturn {\n\t\t\tx: Math.round( ( element.offsetLeft * presentationScale ) * 100 ) / 100,\n\t\t\ty: Math.round( ( element.offsetTop * presentationScale ) * 100 ) / 100,\n\t\t\twidth: Math.round( ( element.offsetWidth * presentationScale ) * 100 ) / 100,\n\t\t\theight: Math.round( ( element.offsetHeight * presentationScale ) * 100 ) / 100\n\t\t};\n\n\t}\n\n\t/**\n\t * Finds matching elements between two slides.\n\t *\n\t * @param {Array} pairs \tList of pairs to push matches to\n\t * @param {HTMLElement} fromScope Scope within the from element exists\n\t * @param {HTMLElement} toScope Scope within the to element exists\n\t * @param {String} selector CSS selector of the element to match\n\t * @param {Function} serializer A function that accepts an element and returns\n\t * a stringified ID based on its contents\n\t * @param {Object} animationOptions Optional config options for this pair\n\t */\n\tfindAutoAnimateMatches( pairs, fromScope, toScope, selector, serializer, animationOptions ) {\n\n\t\tlet fromMatches = {};\n\t\tlet toMatches = {};\n\n\t\t[].slice.call( fromScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {\n\t\t\tconst key = serializer( element );\n\t\t\tif( typeof key === 'string' && key.length ) {\n\t\t\t\tfromMatches[key] = fromMatches[key] || [];\n\t\t\t\tfromMatches[key].push( element );\n\t\t\t}\n\t\t} );\n\n\t\t[].slice.call( toScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {\n\t\t\tconst key = serializer( element );\n\t\t\ttoMatches[key] = toMatches[key] || [];\n\t\t\ttoMatches[key].push( element );\n\n\t\t\tlet fromElement;\n\n\t\t\t// Retrieve the 'from' element\n\t\t\tif( fromMatches[key] ) {\n\t\t\t\tconst primaryIndex = toMatches[key].length - 1;\n\t\t\t\tconst secondaryIndex = fromMatches[key].length - 1;\n\n\t\t\t\t// If there are multiple identical from elements, retrieve\n\t\t\t\t// the one at the same index as our to-element.\n\t\t\t\tif( fromMatches[key][ primaryIndex ] ) {\n\t\t\t\t\tfromElement = fromMatches[key][ primaryIndex ];\n\t\t\t\t\tfromMatches[key][ primaryIndex ] = null;\n\t\t\t\t}\n\t\t\t\t// If there are no matching from-elements at the same index,\n\t\t\t\t// use the last one.\n\t\t\t\telse if( fromMatches[key][ secondaryIndex ] ) {\n\t\t\t\t\tfromElement = fromMatches[key][ secondaryIndex ];\n\t\t\t\t\tfromMatches[key][ secondaryIndex ] = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If we've got a matching pair, push it to the list of pairs\n\t\t\tif( fromElement ) {\n\t\t\t\tpairs.push({\n\t\t\t\t\tfrom: fromElement,\n\t\t\t\t\tto: element,\n\t\t\t\t\toptions: animationOptions\n\t\t\t\t});\n\t\t\t}\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns a all elements within the given scope that should\n\t * be considered unmatched in an auto-animate transition. If\n\t * fading of unmatched elements is turned on, these elements\n\t * will fade when going between auto-animate slides.\n\t *\n\t * Note that parents of auto-animate targets are NOT considered\n\t * unmatched since fading them would break the auto-animation.\n\t *\n\t * @param {HTMLElement} rootElement\n\t * @return {Array}\n\t */\n\tgetUnmatchedAutoAnimateElements( rootElement ) {\n\n\t\treturn [].slice.call( rootElement.children ).reduce( ( result, element ) => {\n\n\t\t\tconst containsAnimatedElements = element.querySelector( '[data-auto-animate-target]' );\n\n\t\t\t// The element is unmatched if\n\t\t\t// - It is not an auto-animate target\n\t\t\t// - It does not contain any auto-animate targets\n\t\t\tif( !element.hasAttribute( 'data-auto-animate-target' ) && !containsAnimatedElements ) {\n\t\t\t\tresult.push( element );\n\t\t\t}\n\n\t\t\tif( element.querySelector( '[data-auto-animate-target]' ) ) {\n\t\t\t\tresult = result.concat( this.getUnmatchedAutoAnimateElements( element ) );\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}, [] );\n\n\t}\n\n}\n","import { HORIZONTAL_SLIDES_SELECTOR } from '../utils/constants.js'\nimport { queryAll } from '../utils/util.js'\n\nconst HIDE_SCROLLBAR_TIMEOUT = 500;\nconst MAX_PROGRESS_SPACING = 4;\nconst MIN_PROGRESS_SEGMENT_HEIGHT = 6;\nconst MIN_PLAYHEAD_HEIGHT = 8;\n\n/**\n * The scroll view lets you read a reveal.js presentation\n * as a linear scrollable page.\n */\nexport default class ScrollView {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.active = false;\n\t\tthis.activatedCallbacks = [];\n\n\t\tthis.onScroll = this.onScroll.bind( this );\n\n\t}\n\n\t/**\n\t * Activates the scroll view. This rearranges the presentation DOM\n\t * by—among other things—wrapping each slide in a page element.\n\t */\n\tactivate() {\n\n\t\tif( this.active ) return;\n\n\t\tconst stateBeforeActivation = this.Reveal.getState();\n\n\t\tthis.active = true;\n\n\t\t// Store the full presentation HTML so that we can restore it\n\t\t// when/if the scroll view is deactivated\n\t\tthis.slideHTMLBeforeActivation = this.Reveal.getSlidesElement().innerHTML;\n\n\t\tconst horizontalSlides = queryAll( this.Reveal.getRevealElement(), HORIZONTAL_SLIDES_SELECTOR );\n\n\t\tthis.viewportElement.classList.add( 'loading-scroll-mode', 'reveal-scroll' );\n\n\t\tlet presentationBackground;\n\n\t\tconst viewportStyles = window.getComputedStyle( this.viewportElement );\n\t\tif( viewportStyles && viewportStyles.background ) {\n\t\t\tpresentationBackground = viewportStyles.background;\n\t\t}\n\n\t\tconst pageElements = [];\n\t\tconst pageContainer = horizontalSlides[0].parentNode;\n\n\t\tlet previousSlide;\n\n\t\t// Creates a new page element and appends the given slide/bg\n\t\t// to it.\n\t\tconst createPageElement = ( slide, h, v ) => {\n\n\t\t\tlet contentContainer;\n\n\t\t\t// If this slide is part of an auto-animation sequence, we\n\t\t\t// group it under the same page element as the previous slide\n\t\t\tif( previousSlide && this.Reveal.shouldAutoAnimateBetween( previousSlide, slide ) ) {\n\t\t\t\tcontentContainer = document.createElement( 'div' );\n\t\t\t\tcontentContainer.className = 'scroll-page-content scroll-auto-animate-page';\n\t\t\t\tcontentContainer.style.display = 'none';\n\t\t\t\tpreviousSlide.closest( '.scroll-page-content' ).parentNode.appendChild( contentContainer );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Wrap the slide in a page element and hide its overflow\n\t\t\t\t// so that no page ever flows onto another\n\t\t\t\tconst page = document.createElement( 'div' );\n\t\t\t\tpage.className = 'scroll-page';\n\t\t\t\tpageElements.push( page );\n\n\t\t\t\t// Copy the presentation-wide background to each page\n\t\t\t\tif( presentationBackground ) {\n\t\t\t\t\tpage.style.background = presentationBackground;\n\t\t\t\t}\n\n\t\t\t\tconst stickyContainer = document.createElement( 'div' );\n\t\t\t\tstickyContainer.className = 'scroll-page-sticky';\n\t\t\t\tpage.appendChild( stickyContainer );\n\n\t\t\t\tcontentContainer = document.createElement( 'div' );\n\t\t\t\tcontentContainer.className = 'scroll-page-content';\n\t\t\t\tstickyContainer.appendChild( contentContainer );\n\t\t\t}\n\n\t\t\tcontentContainer.appendChild( slide );\n\n\t\t\tslide.classList.remove( 'past', 'future' );\n\t\t\tslide.setAttribute( 'data-index-h', h );\n\t\t\tslide.setAttribute( 'data-index-v', v );\n\n\t\t\tif( slide.slideBackgroundElement ) {\n\t\t\t\tslide.slideBackgroundElement.remove( 'past', 'future' );\n\t\t\t\tcontentContainer.insertBefore( slide.slideBackgroundElement, slide );\n\t\t\t}\n\n\t\t\tpreviousSlide = slide;\n\n\t\t}\n\n\t\t// Slide and slide background layout\n\t\thorizontalSlides.forEach( ( horizontalSlide, h ) => {\n\n\t\t\tif( this.Reveal.isVerticalStack( horizontalSlide ) ) {\n\t\t\t\thorizontalSlide.querySelectorAll( 'section' ).forEach( ( verticalSlide, v ) => {\n\t\t\t\t\tcreatePageElement( verticalSlide, h, v );\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcreatePageElement( horizontalSlide, h, 0 );\n\t\t\t}\n\n\t\t}, this );\n\n\t\tthis.createProgressBar();\n\n\t\t// Remove leftover stacks\n\t\tqueryAll( this.Reveal.getRevealElement(), '.stack' ).forEach( stack => stack.remove() );\n\n\t\t// Add our newly created pages to the DOM\n\t\tpageElements.forEach( page => pageContainer.appendChild( page ) );\n\n\t\t// Re-run JS-based content layout after the slide is added to page DOM\n\t\tthis.Reveal.slideContent.layout( this.Reveal.getSlidesElement() );\n\n\t\tthis.Reveal.layout();\n\t\tthis.Reveal.setState( stateBeforeActivation );\n\n\t\tthis.activatedCallbacks.forEach( callback => callback() );\n\t\tthis.activatedCallbacks = [];\n\n\t\tthis.restoreScrollPosition();\n\n\t\tthis.viewportElement.classList.remove( 'loading-scroll-mode' );\n\t\tthis.viewportElement.addEventListener( 'scroll', this.onScroll, { passive: true } );\n\n\t}\n\n\t/**\n\t * Deactivates the scroll view and restores the standard slide-based\n\t * presentation.\n\t */\n\tdeactivate() {\n\n\t\tif( !this.active ) return;\n\n\t\tconst stateBeforeDeactivation = this.Reveal.getState();\n\n\t\tthis.active = false;\n\n\t\tthis.viewportElement.removeEventListener( 'scroll', this.onScroll );\n\t\tthis.viewportElement.classList.remove( 'reveal-scroll' );\n\n\t\tthis.removeProgressBar();\n\n\t\tthis.Reveal.getSlidesElement().innerHTML = this.slideHTMLBeforeActivation;\n\t\tthis.Reveal.sync();\n\t\tthis.Reveal.setState( stateBeforeDeactivation );\n\n\t\tthis.slideHTMLBeforeActivation = null;\n\n\t}\n\n\ttoggle( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? this.activate() : this.deactivate();\n\t\t}\n\t\telse {\n\t\t\tthis.isActive() ? this.deactivate() : this.activate();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the scroll view is currently active.\n\t */\n\tisActive() {\n\n\t\treturn this.active;\n\n\t}\n\n\t/**\n\t * Renders the progress bar component.\n\t */\n\tcreateProgressBar() {\n\n\t\tthis.progressBar = document.createElement( 'div' );\n\t\tthis.progressBar.className = 'scrollbar';\n\n\t\tthis.progressBarInner = document.createElement( 'div' );\n\t\tthis.progressBarInner.className = 'scrollbar-inner';\n\t\tthis.progressBar.appendChild( this.progressBarInner );\n\n\t\tthis.progressBarPlayhead = document.createElement( 'div' );\n\t\tthis.progressBarPlayhead.className = 'scrollbar-playhead';\n\t\tthis.progressBarInner.appendChild( this.progressBarPlayhead );\n\n\t\tthis.viewportElement.insertBefore( this.progressBar, this.viewportElement.firstChild );\n\n\t\tconst handleDocumentMouseMove\t= ( event ) => {\n\n\t\t\tlet progress = ( event.clientY - this.progressBarInner.getBoundingClientRect().top ) / this.progressBarHeight;\n\t\t\tprogress = Math.max( Math.min( progress, 1 ), 0 );\n\n\t\t\tthis.viewportElement.scrollTop = progress * ( this.viewportElement.scrollHeight - this.viewportElement.offsetHeight );\n\n\t\t};\n\n\t\tconst handleDocumentMouseUp = ( event ) => {\n\n\t\t\tthis.draggingProgressBar = false;\n\t\t\tthis.showProgressBar();\n\n\t\t\tdocument.removeEventListener( 'mousemove', handleDocumentMouseMove );\n\t\t\tdocument.removeEventListener( 'mouseup', handleDocumentMouseUp );\n\n\t\t};\n\n\t\tconst handleMouseDown = ( event ) => {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.draggingProgressBar = true;\n\n\t\t\tdocument.addEventListener( 'mousemove', handleDocumentMouseMove );\n\t\t\tdocument.addEventListener( 'mouseup', handleDocumentMouseUp );\n\n\t\t\thandleDocumentMouseMove( event );\n\n\t\t};\n\n\t\tthis.progressBarInner.addEventListener( 'mousedown', handleMouseDown );\n\n\t}\n\n\tremoveProgressBar() {\n\n\t\tif( this.progressBar ) {\n\t\t\tthis.progressBar.remove();\n\t\t\tthis.progressBar = null;\n\t\t}\n\n\t}\n\n\tlayout() {\n\n\t\tif( this.isActive() ) {\n\t\t\tthis.syncPages();\n\t\t\tthis.syncScrollPosition();\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates our pages to match the latest configuration and\n\t * presentation size.\n\t */\n\tsyncPages() {\n\n\t\tconst config = this.Reveal.getConfig();\n\n\t\tconst slideSize = this.Reveal.getComputedSlideSize( window.innerWidth, window.innerHeight );\n\t\tconst scale = this.Reveal.getScale();\n\t\tconst useCompactLayout = config.scrollLayout === 'compact';\n\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst compactHeight = slideSize.height * scale;\n\t\tconst pageHeight = useCompactLayout ? compactHeight : viewportHeight;\n\n\t\t// The height that needs to be scrolled between scroll triggers\n\t\tconst scrollTriggerHeight = useCompactLayout ? compactHeight : viewportHeight;\n\n\t\tthis.viewportElement.style.setProperty( '--page-height', pageHeight + 'px' );\n\t\tthis.viewportElement.style.scrollSnapType = typeof config.scrollSnap === 'string' ? `y ${config.scrollSnap}` : '';\n\n\t\t// This will hold all scroll triggers used to show/hide slides\n\t\tthis.slideTriggers = [];\n\n\t\tconst pageElements = Array.from( this.Reveal.getRevealElement().querySelectorAll( '.scroll-page' ) );\n\n\t\tthis.pages = pageElements.map( pageElement => {\n\t\t\tconst page = this.createPage({\n\t\t\t\tpageElement,\n\t\t\t\tslideElement: pageElement.querySelector( 'section' ),\n\t\t\t\tstickyElement: pageElement.querySelector( '.scroll-page-sticky' ),\n\t\t\t\tcontentElement: pageElement.querySelector( '.scroll-page-content' ),\n\t\t\t\tbackgroundElement: pageElement.querySelector( '.slide-background' ),\n\t\t\t\tautoAnimateElements: pageElement.querySelectorAll( '.scroll-auto-animate-page' ),\n\t\t\t\tautoAnimatePages: []\n\t\t\t});\n\n\t\t\tpage.pageElement.style.setProperty( '--slide-height', config.center === true ? 'auto' : slideSize.height + 'px' );\n\n\t\t\tthis.slideTriggers.push({\n\t\t\t\tpage: page,\n\t\t\t\tactivate: () => this.activatePage( page ),\n\t\t\t\tdeactivate: () => this.deactivatePage( page )\n\t\t\t});\n\n\t\t\t// Create scroll triggers that show/hide fragments\n\t\t\tthis.createFragmentTriggersForPage( page );\n\n\t\t\t// Create scroll triggers for triggering auto-animate steps\n\t\t\tif( page.autoAnimateElements.length > 0 ) {\n\t\t\t\tthis.createAutoAnimateTriggersForPage( page );\n\t\t\t}\n\n\t\t\tlet totalScrollTriggerCount = Math.max( page.scrollTriggers.length - 1, 0 );\n\n\t\t\t// Each auto-animate step may include its own scroll triggers\n\t\t\t// for fragments, ensure we count those as well\n\t\t\ttotalScrollTriggerCount += page.autoAnimatePages.reduce( ( total, page ) => {\n\t\t\t\treturn total + Math.max( page.scrollTriggers.length - 1, 0 );\n\t\t\t}, page.autoAnimatePages.length );\n\n\t\t\t// Clean up from previous renders\n\t\t\tpage.pageElement.querySelectorAll( '.scroll-snap-point' ).forEach( el => el.remove() );\n\n\t\t\t// Create snap points for all scroll triggers\n\t\t\t// - Can't be absolute in FF\n\t\t\t// - Can't be 0-height in Safari\n\t\t\t// - Can't use snap-align on parent in Safari because then\n\t\t\t// inner triggers won't work\n\t\t\tfor( let i = 0; i < totalScrollTriggerCount + 1; i++ ) {\n\t\t\t\tconst triggerStick = document.createElement( 'div' );\n\t\t\t\ttriggerStick.className = 'scroll-snap-point';\n\t\t\t\ttriggerStick.style.height = scrollTriggerHeight + 'px';\n\t\t\t\ttriggerStick.style.scrollSnapAlign = useCompactLayout ? 'center' : 'start';\n\t\t\t\tpage.pageElement.appendChild( triggerStick );\n\n\t\t\t\tif( i === 0 ) {\n\t\t\t\t\ttriggerStick.style.marginTop = -scrollTriggerHeight + 'px';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// In the compact layout, only slides with scroll triggers cover the\n\t\t\t// full viewport height. This helps avoid empty gaps before or after\n\t\t\t// a sticky slide.\n\t\t\tif( useCompactLayout && page.scrollTriggers.length > 0 ) {\n\t\t\t\tpage.pageHeight = viewportHeight;\n\t\t\t\tpage.pageElement.style.setProperty( '--page-height', viewportHeight + 'px' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpage.pageHeight = pageHeight;\n\t\t\t\tpage.pageElement.style.removeProperty( '--page-height' );\n\t\t\t}\n\n\t\t\t// Add scroll padding based on how many scroll triggers we have\n\t\t\tpage.scrollPadding = scrollTriggerHeight * totalScrollTriggerCount;\n\n\t\t\t// The total height including scrollable space\n\t\t\tpage.totalHeight = page.pageHeight + page.scrollPadding;\n\n\t\t\t// This is used to pad the height of our page in CSS\n\t\t\tpage.pageElement.style.setProperty( '--page-scroll-padding', page.scrollPadding + 'px' );\n\n\t\t\t// If this is a sticky page, stick it to the vertical center\n\t\t\tif( totalScrollTriggerCount > 0 ) {\n\t\t\t\tpage.stickyElement.style.position = 'sticky';\n\t\t\t\tpage.stickyElement.style.top = Math.max( ( viewportHeight - page.pageHeight ) / 2, 0 ) + 'px';\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpage.stickyElement.style.position = 'relative';\n\t\t\t\tpage.pageElement.style.scrollSnapAlign = page.pageHeight < viewportHeight ? 'center' : 'start';\n\t\t\t}\n\n\t\t\treturn page;\n\t\t} );\n\n\t\tthis.setTriggerRanges();\n\n\t\t/*\n\t\tconsole.log(this.slideTriggers.map( t => {\n\t\t\treturn {\n\t\t\t\trange: `${t.range[0].toFixed(2)}-${t.range[1].toFixed(2)}`,\n\t\t\t\ttriggers: t.page.scrollTriggers.map( t => {\n\t\t\t\t\treturn `${t.range[0].toFixed(2)}-${t.range[1].toFixed(2)}`\n\t\t\t\t}).join( ', ' ),\n\t\t\t}\n\t\t}))\n\t\t*/\n\n\t\tthis.viewportElement.setAttribute( 'data-scrollbar', config.scrollProgress );\n\n\t\tif( config.scrollProgress && this.totalScrollTriggerCount > 1 ) {\n\t\t\t// Create the progress bar if it doesn't already exist\n\t\t\tif( !this.progressBar ) this.createProgressBar();\n\n\t\t\tthis.syncProgressBar();\n\t\t}\n\t\telse {\n\t\t\tthis.removeProgressBar();\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and sets the scroll range for all of our scroll\n\t * triggers.\n\t */\n\tsetTriggerRanges() {\n\n\t\t// Calculate the total number of scroll triggers\n\t\tthis.totalScrollTriggerCount = this.slideTriggers.reduce( ( total, trigger ) => {\n\t\t\treturn total + Math.max( trigger.page.scrollTriggers.length, 1 );\n\t\t}, 0 );\n\n\t\tlet rangeStart = 0;\n\n\t\t// Calculate the scroll range of each scroll trigger on a scale\n\t\t// of 0-1\n\t\tthis.slideTriggers.forEach( ( trigger, i ) => {\n\t\t\ttrigger.range = [\n\t\t\t\trangeStart,\n\t\t\t\trangeStart + Math.max( trigger.page.scrollTriggers.length, 1 ) / this.totalScrollTriggerCount\n\t\t\t];\n\n\t\t\tconst scrollTriggerSegmentSize = ( trigger.range[1] - trigger.range[0] ) / trigger.page.scrollTriggers.length;\n\n\t\t\t// Set the range for each inner scroll trigger\n\t\t\ttrigger.page.scrollTriggers.forEach( ( scrollTrigger, i ) => {\n\t\t\t\tscrollTrigger.range = [\n\t\t\t\t\trangeStart + i * scrollTriggerSegmentSize,\n\t\t\t\t\trangeStart + ( i + 1 ) * scrollTriggerSegmentSize\n\t\t\t\t];\n\t\t\t} );\n\n\t\t\trangeStart = trigger.range[1];\n\t\t} );\n\n\t}\n\n\t/**\n\t * Creates one scroll trigger for each fragments in the given page.\n\t *\n\t * @param {*} page\n\t */\n\tcreateFragmentTriggersForPage( page, slideElement ) {\n\n\t\tslideElement = slideElement || page.slideElement;\n\n\t\t// Each fragment 'group' is an array containing one or more\n\t\t// fragments. Multiple fragments that appear at the same time\n\t\t// are part of the same group.\n\t\tconst fragmentGroups = this.Reveal.fragments.sort( slideElement.querySelectorAll( '.fragment' ), true );\n\n\t\t// Create scroll triggers that show/hide fragments\n\t\tif( fragmentGroups.length ) {\n\t\t\tpage.fragments = this.Reveal.fragments.sort( slideElement.querySelectorAll( '.fragment:not(.disabled)' ) );\n\t\t\tpage.scrollTriggers.push(\n\t\t\t\t// Trigger for the initial state with no fragments visible\n\t\t\t\t{\n\t\t\t\t\tactivate: () => {\n\t\t\t\t\t\tthis.Reveal.fragments.update( -1, page.fragments, slideElement );\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Triggers for each fragment group\n\t\t\t\t...fragmentGroups.map( ( fragments, i ) => ({\n\t\t\t\t\t\tactivate: () => {\n\t\t\t\t\t\t\tthis.Reveal.fragments.update( i, page.fragments, slideElement );\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\n\t\treturn page.scrollTriggers.length;\n\n\t}\n\n\t/**\n\t * Creates scroll triggers for the auto-animate steps in the\n\t * given page.\n\t *\n\t * @param {*} page\n\t */\n\tcreateAutoAnimateTriggersForPage( page ) {\n\n\t\tif( page.autoAnimateElements.length > 0 ) {\n\n\t\t\t// Triggers for each subsequent auto-animate slide\n\t\t\tthis.slideTriggers.push( ...Array.from( page.autoAnimateElements ).map( ( autoAnimateElement, i ) => {\n\t\t\t\tlet autoAnimatePage = this.createPage({\n\t\t\t\t\tslideElement: autoAnimateElement.querySelector( 'section' ),\n\t\t\t\t\tcontentElement: autoAnimateElement,\n\t\t\t\t\tbackgroundElement: autoAnimateElement.querySelector( '.slide-background' )\n\t\t\t\t});\n\n\t\t\t\t// Create fragment scroll triggers for the auto-animate slide\n\t\t\t\tthis.createFragmentTriggersForPage( autoAnimatePage, autoAnimatePage.slideElement );\n\n\t\t\t\tpage.autoAnimatePages.push( autoAnimatePage );\n\n\t\t\t\t// Return our slide trigger\n\t\t\t\treturn {\n\t\t\t\t\tpage: autoAnimatePage,\n\t\t\t\t\tactivate: () => this.activatePage( autoAnimatePage ),\n\t\t\t\t\tdeactivate: () => this.deactivatePage( autoAnimatePage )\n\t\t\t\t};\n\t\t\t}));\n\t\t}\n\n\t}\n\n\t/**\n\t * Helper method for creating a page definition and adding\n\t * required fields. A \"page\" is a slide or auto-animate step.\n\t */\n\tcreatePage( page ) {\n\n\t\tpage.scrollTriggers = [];\n\t\tpage.indexh = parseInt( page.slideElement.getAttribute( 'data-index-h' ), 10 );\n\t\tpage.indexv = parseInt( page.slideElement.getAttribute( 'data-index-v' ), 10 );\n\n\t\treturn page;\n\n\t}\n\n\t/**\n\t * Rerenders progress bar segments so that they match the current\n\t * reveal.js config and size.\n\t */\n\tsyncProgressBar() {\n\n\t\tthis.progressBarInner.querySelectorAll( '.scrollbar-slide' ).forEach( slide => slide.remove() );\n\n\t\tconst scrollHeight = this.viewportElement.scrollHeight;\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst viewportHeightFactor = viewportHeight / scrollHeight;\n\n\t\tthis.progressBarHeight = this.progressBarInner.offsetHeight;\n\t\tthis.playheadHeight = Math.max( viewportHeightFactor * this.progressBarHeight, MIN_PLAYHEAD_HEIGHT );\n\t\tthis.progressBarScrollableHeight = this.progressBarHeight - this.playheadHeight;\n\n\t\tconst progressSegmentHeight = viewportHeight / scrollHeight * this.progressBarHeight;\n\t\tconst spacing = Math.min( progressSegmentHeight / 8, MAX_PROGRESS_SPACING );\n\n\t\tthis.progressBarPlayhead.style.height = this.playheadHeight - spacing + 'px';\n\n\t\t// Don't show individual segments if they're too small\n\t\tif( progressSegmentHeight > MIN_PROGRESS_SEGMENT_HEIGHT ) {\n\n\t\t\tthis.slideTriggers.forEach( slideTrigger => {\n\n\t\t\t\tconst { page } = slideTrigger;\n\n\t\t\t\t// Visual representation of a slide\n\t\t\t\tpage.progressBarSlide = document.createElement( 'div' );\n\t\t\t\tpage.progressBarSlide.className = 'scrollbar-slide';\n\t\t\t\tpage.progressBarSlide.style.top = slideTrigger.range[0] * this.progressBarHeight + 'px';\n\t\t\t\tpage.progressBarSlide.style.height = ( slideTrigger.range[1] - slideTrigger.range[0] ) * this.progressBarHeight - spacing + 'px';\n\t\t\t\tpage.progressBarSlide.classList.toggle( 'has-triggers', page.scrollTriggers.length > 0 );\n\t\t\t\tthis.progressBarInner.appendChild( page.progressBarSlide );\n\n\t\t\t\t// Visual representations of each scroll trigger\n\t\t\t\tpage.scrollTriggerElements = page.scrollTriggers.map( ( trigger, i ) => {\n\n\t\t\t\t\tconst triggerElement = document.createElement( 'div' );\n\t\t\t\t\ttriggerElement.className = 'scrollbar-trigger';\n\t\t\t\t\ttriggerElement.style.top = ( trigger.range[0] - slideTrigger.range[0] ) * this.progressBarHeight + 'px';\n\t\t\t\t\ttriggerElement.style.height = ( trigger.range[1] - trigger.range[0] ) * this.progressBarHeight - spacing + 'px';\n\t\t\t\t\tpage.progressBarSlide.appendChild( triggerElement );\n\n\t\t\t\t\tif( i === 0 ) triggerElement.style.display = 'none';\n\n\t\t\t\t\treturn triggerElement;\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\t\telse {\n\n\t\t\tthis.pages.forEach( page => page.progressBarSlide = null );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Reads the current scroll position and updates our active\n\t * trigger states accordingly.\n\t */\n\tsyncScrollPosition() {\n\n\t\tconst viewportHeight = this.viewportElement.offsetHeight;\n\t\tconst viewportHeightFactor = viewportHeight / this.viewportElement.scrollHeight;\n\n\t\tconst scrollTop = this.viewportElement.scrollTop;\n\t\tconst scrollHeight = this.viewportElement.scrollHeight - viewportHeight\n\t\tconst scrollProgress = Math.max( Math.min( scrollTop / scrollHeight, 1 ), 0 );\n\t\tconst scrollProgressMid = Math.max( Math.min( ( scrollTop + viewportHeight / 2 ) / this.viewportElement.scrollHeight, 1 ), 0 );\n\n\t\tlet activePage;\n\n\t\tthis.slideTriggers.forEach( ( trigger ) => {\n\t\t\tconst { page } = trigger;\n\n\t\t\tconst shouldPreload = scrollProgress >= trigger.range[0] - viewportHeightFactor*2 &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tscrollProgress <= trigger.range[1] + viewportHeightFactor*2;\n\n\t\t\t// Load slides that are within the preload range\n\t\t\tif( shouldPreload && !page.loaded ) {\n\t\t\t\tpage.loaded = true;\n\t\t\t\tthis.Reveal.slideContent.load( page.slideElement );\n\t\t\t}\n\t\t\telse if( page.loaded ) {\n\t\t\t\tpage.loaded = false;\n\t\t\t\tthis.Reveal.slideContent.unload( page.slideElement );\n\t\t\t}\n\n\t\t\t// If we're within this trigger range, activate it\n\t\t\tif( scrollProgress >= trigger.range[0] && scrollProgress <= trigger.range[1] ) {\n\t\t\t\tthis.activateTrigger( trigger );\n\t\t\t\tactivePage = trigger.page;\n\t\t\t}\n\t\t\t// .. otherwise deactivate\n\t\t\telse if( trigger.active ) {\n\t\t\t\tthis.deactivateTrigger( trigger );\n\t\t\t}\n\t\t} );\n\n\t\t// Each page can have its own scroll triggers, check if any of those\n\t\t// need to be activated/deactivated\n\t\tif( activePage ) {\n\t\t\tactivePage.scrollTriggers.forEach( ( trigger ) => {\n\t\t\t\tif( scrollProgressMid >= trigger.range[0] && scrollProgressMid <= trigger.range[1] ) {\n\t\t\t\t\tthis.activateTrigger( trigger );\n\t\t\t\t}\n\t\t\t\telse if( trigger.active ) {\n\t\t\t\t\tthis.deactivateTrigger( trigger );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Update our visual progress indication\n\t\tthis.setProgressBarValue( scrollTop / ( this.viewportElement.scrollHeight - viewportHeight ) );\n\n\t}\n\n\t/**\n\t * Moves the progress bar playhead to the specified position.\n\t *\n\t * @param {number} progress 0-1\n\t */\n\tsetProgressBarValue( progress ) {\n\n\t\tif( this.progressBar ) {\n\n\t\t\tthis.progressBarPlayhead.style.transform = `translateY(${progress * this.progressBarScrollableHeight}px)`;\n\n\t\t\tthis.getAllPages()\n\t\t\t\t.filter( page => page.progressBarSlide )\n\t\t\t\t.forEach( ( page ) => {\n\t\t\t\t\tpage.progressBarSlide.classList.toggle( 'active', page.active === true );\n\n\t\t\t\t\tpage.scrollTriggers.forEach( ( trigger, i ) => {\n\t\t\t\t\t\tpage.scrollTriggerElements[i].classList.toggle( 'active', page.active === true && trigger.active === true );\n\t\t\t\t\t} );\n\t\t\t\t} );\n\n\t\t\tthis.showProgressBar();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Show the progress bar and, if configured, automatically hide\n\t * it after a delay.\n\t */\n\tshowProgressBar() {\n\n\t\tthis.progressBar.classList.add( 'visible' );\n\n\t\tclearTimeout( this.hideProgressBarTimeout );\n\n\t\tif( this.Reveal.getConfig().scrollProgress === 'auto' && !this.draggingProgressBar ) {\n\n\t\t\tthis.hideProgressBarTimeout = setTimeout( () => {\n\t\t\t\tif( this.progressBar ) {\n\t\t\t\t\tthis.progressBar.classList.remove( 'visible' );\n\t\t\t\t}\n\t\t\t}, HIDE_SCROLLBAR_TIMEOUT );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Scrolls the given slide element into view.\n\t *\n\t * @param {HTMLElement} slideElement\n\t */\n\tscrollToSlide( slideElement ) {\n\n\t\t// If the scroll view isn't active yet, queue this action\n\t\tif( !this.active ) {\n\t\t\tthis.activatedCallbacks.push( () => this.scrollToSlide( slideElement ) );\n\t\t}\n\t\telse {\n\t\t\t// Find the trigger for this slide\n\t\t\tconst trigger = this.getScrollTriggerBySlide( slideElement );\n\n\t\t\tif( trigger ) {\n\t\t\t\t// Use the trigger's range to calculate the scroll position\n\t\t\t\tthis.viewportElement.scrollTop = trigger.range[0] * ( this.viewportElement.scrollHeight - this.viewportElement.offsetHeight );\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Persists the current scroll position to session storage\n\t * so that it can be restored.\n\t */\n\tstoreScrollPosition() {\n\n\t\tclearTimeout( this.storeScrollPositionTimeout );\n\n\t\tthis.storeScrollPositionTimeout = setTimeout( () => {\n\t\t\tsessionStorage.setItem( 'reveal-scroll-top', this.viewportElement.scrollTop );\n\t\t\tsessionStorage.setItem( 'reveal-scroll-origin', location.origin + location.pathname );\n\n\t\t\tthis.storeScrollPositionTimeout = null;\n\t\t}, 50 );\n\n\t}\n\n\t/**\n\t * Restores the scroll position when a deck is reloader.\n\t */\n\trestoreScrollPosition() {\n\n\t\tconst scrollPosition = sessionStorage.getItem( 'reveal-scroll-top' );\n\t\tconst scrollOrigin = sessionStorage.getItem( 'reveal-scroll-origin' );\n\n\t\tif( scrollPosition && scrollOrigin === location.origin + location.pathname ) {\n\t\t\tthis.viewportElement.scrollTop = parseInt( scrollPosition, 10 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Activates the given page and starts its embedded content\n\t * if there is any.\n\t *\n\t * @param {object} page\n\t */\n\tactivatePage( page ) {\n\n\t\tif( !page.active ) {\n\n\t\t\tpage.active = true;\n\n\t\t\tconst { slideElement, backgroundElement, contentElement, indexh, indexv } = page;\n\n\t\t\tcontentElement.style.display = 'block';\n\n\t\t\tslideElement.classList.add( 'present' );\n\n\t\t\tif( backgroundElement ) {\n\t\t\t\tbackgroundElement.classList.add( 'present' );\n\t\t\t}\n\n\t\t\tthis.Reveal.setCurrentScrollPage( slideElement, indexh, indexv );\n\t\t\tthis.Reveal.backgrounds.bubbleSlideContrastClassToElement( slideElement, this.viewportElement );\n\n\t\t\t// If this page is part of an auto-animation there will be one\n\t\t\t// content element per auto-animated page. We need to show the\n\t\t\t// current page and hide all others.\n\t\t\tArray.from( contentElement.parentNode.querySelectorAll( '.scroll-page-content' ) ).forEach( sibling => {\n\t\t\t\tif( sibling !== contentElement ) {\n\t\t\t\t\tsibling.style.display = 'none';\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deactivates the page after it has been visible.\n\t *\n\t * @param {object} page\n\t */\n\tdeactivatePage( page ) {\n\n\t\tif( page.active ) {\n\n\t\t\tpage.active = false;\n\t\t\tpage.slideElement.classList.remove( 'present' );\n\t\t\tpage.backgroundElement.classList.remove( 'present' );\n\n\t\t}\n\n\t}\n\n\tactivateTrigger( trigger ) {\n\n\t\tif( !trigger.active ) {\n\t\t\ttrigger.active = true;\n\t\t\ttrigger.activate();\n\t\t}\n\n\t}\n\n\tdeactivateTrigger( trigger ) {\n\n\t\tif( trigger.active ) {\n\t\t\ttrigger.active = false;\n\n\t\t\tif( trigger.deactivate ) {\n\t\t\t\ttrigger.deactivate();\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/**\n\t * Retrieve a slide by its original h/v index (i.e. the indices the\n\t * slide had before being linearized).\n\t *\n\t * @param {number} h\n\t * @param {number} v\n\t * @returns {HTMLElement}\n\t */\n\tgetSlideByIndices( h, v ) {\n\n\t\tconst page = this.getAllPages().find( page => {\n\t\t\treturn page.indexh === h && page.indexv === v;\n\t\t} );\n\n\t\treturn page ? page.slideElement : null;\n\n\t}\n\n\t/**\n\t * Retrieve a list of all scroll triggers for the given slide\n\t * DOM element.\n\t *\n\t * @param {HTMLElement} slide\n\t * @returns {Array}\n\t */\n\tgetScrollTriggerBySlide( slide ) {\n\n\t\treturn this.slideTriggers.find( trigger => trigger.page.slideElement === slide );\n\n\t}\n\n\t/**\n\t * Get a list of all pages in the scroll view. This includes\n\t * both top-level slides and auto-animate steps.\n\t *\n\t * @returns {Array}\n\t */\n\tgetAllPages() {\n\n\t\treturn this.pages.flatMap( page => [page, ...(page.autoAnimatePages || [])] );\n\n\t}\n\n\tonScroll() {\n\n\t\tthis.syncScrollPosition();\n\t\tthis.storeScrollPosition();\n\n\t}\n\n\tget viewportElement() {\n\n\t\treturn this.Reveal.getViewportElement();\n\n\t}\n\n}\n","import { SLIDES_SELECTOR } from '../utils/constants.js'\nimport { queryAll, createStyleSheet } from '../utils/util.js'\n\n/**\n * Setups up our presentation for printing/exporting to PDF.\n */\nexport default class PrintView {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Configures the presentation for printing to a static\n\t * PDF.\n\t */\n\tasync activate() {\n\n\t\tconst config = this.Reveal.getConfig();\n\t\tconst slides = queryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR )\n\n\t\t// Compute slide numbers now, before we start duplicating slides\n\t\tconst injectPageNumbers = config.slideNumber && /all|print/i.test( config.showSlideNumber );\n\n\t\tconst slideSize = this.Reveal.getComputedSlideSize( window.innerWidth, window.innerHeight );\n\n\t\t// Dimensions of the PDF pages\n\t\tconst pageWidth = Math.floor( slideSize.width * ( 1 + config.margin ) ),\n\t\t\tpageHeight = Math.floor( slideSize.height * ( 1 + config.margin ) );\n\n\t\t// Dimensions of slides within the pages\n\t\tconst slideWidth = slideSize.width,\n\t\t\tslideHeight = slideSize.height;\n\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\t// Let the browser know what page size we want to print\n\t\tcreateStyleSheet( '@page{size:'+ pageWidth +'px '+ pageHeight +'px; margin: 0px;}' );\n\n\t\t// Limit the size of certain elements to the dimensions of the slide\n\t\tcreateStyleSheet( '.reveal section>img, .reveal section>video, .reveal section>iframe{max-width: '+ slideWidth +'px; max-height:'+ slideHeight +'px}' );\n\n\t\tdocument.documentElement.classList.add( 'reveal-print', 'print-pdf' );\n\t\tdocument.body.style.width = pageWidth + 'px';\n\t\tdocument.body.style.height = pageHeight + 'px';\n\n\t\tconst viewportElement = this.Reveal.getViewportElement();\n\t\tlet presentationBackground;\n\t\tif( viewportElement ) {\n\t\t\tconst viewportStyles = window.getComputedStyle( viewportElement );\n\t\t\tif( viewportStyles && viewportStyles.background ) {\n\t\t\t\tpresentationBackground = viewportStyles.background;\n\t\t\t}\n\t\t}\n\n\t\t// Make sure stretch elements fit on slide\n\t\tawait new Promise( requestAnimationFrame );\n\t\tthis.Reveal.layoutSlideContents( slideWidth, slideHeight );\n\n\t\t// Batch scrollHeight access to prevent layout thrashing\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\tconst slideScrollHeights = slides.map( slide => slide.scrollHeight );\n\n\t\tconst pages = [];\n\t\tconst pageContainer = slides[0].parentNode;\n\t\tlet slideNumber = 1;\n\n\t\t// Slide and slide background layout\n\t\tslides.forEach( function( slide, index ) {\n\n\t\t\t// Vertical stacks are not centred since their section\n\t\t\t// children will be\n\t\t\tif( slide.classList.contains( 'stack' ) === false ) {\n\t\t\t\t// Center the slide inside of the page, giving the slide some margin\n\t\t\t\tlet left = ( pageWidth - slideWidth ) / 2;\n\t\t\t\tlet top = ( pageHeight - slideHeight ) / 2;\n\n\t\t\t\tconst contentHeight = slideScrollHeights[ index ];\n\t\t\t\tlet numberOfPages = Math.max( Math.ceil( contentHeight / pageHeight ), 1 );\n\n\t\t\t\t// Adhere to configured pages per slide limit\n\t\t\t\tnumberOfPages = Math.min( numberOfPages, config.pdfMaxPagesPerSlide );\n\n\t\t\t\t// Center slides vertically\n\t\t\t\tif( numberOfPages === 1 && config.center || slide.classList.contains( 'center' ) ) {\n\t\t\t\t\ttop = Math.max( ( pageHeight - contentHeight ) / 2, 0 );\n\t\t\t\t}\n\n\t\t\t\t// Wrap the slide in a page element and hide its overflow\n\t\t\t\t// so that no page ever flows onto another\n\t\t\t\tconst page = document.createElement( 'div' );\n\t\t\t\tpages.push( page );\n\n\t\t\t\tpage.className = 'pdf-page';\n\t\t\t\tpage.style.height = ( ( pageHeight + config.pdfPageHeightOffset ) * numberOfPages ) + 'px';\n\n\t\t\t\t// Copy the presentation-wide background to each individual\n\t\t\t\t// page when printing\n\t\t\t\tif( presentationBackground ) {\n\t\t\t\t\tpage.style.background = presentationBackground;\n\t\t\t\t}\n\n\t\t\t\tpage.appendChild( slide );\n\n\t\t\t\t// Position the slide inside of the page\n\t\t\t\tslide.style.left = left + 'px';\n\t\t\t\tslide.style.top = top + 'px';\n\t\t\t\tslide.style.width = slideWidth + 'px';\n\n\t\t\t\tthis.Reveal.slideContent.layout( slide );\n\n\t\t\t\tif( slide.slideBackgroundElement ) {\n\t\t\t\t\tpage.insertBefore( slide.slideBackgroundElement, slide );\n\t\t\t\t}\n\n\t\t\t\t// Inject notes if `showNotes` is enabled\n\t\t\t\tif( config.showNotes ) {\n\n\t\t\t\t\t// Are there notes for this slide?\n\t\t\t\t\tconst notes = this.Reveal.getSlideNotes( slide );\n\t\t\t\t\tif( notes ) {\n\n\t\t\t\t\t\tconst notesSpacing = 8;\n\t\t\t\t\t\tconst notesLayout = typeof config.showNotes === 'string' ? config.showNotes : 'inline';\n\t\t\t\t\t\tconst notesElement = document.createElement( 'div' );\n\t\t\t\t\t\tnotesElement.classList.add( 'speaker-notes' );\n\t\t\t\t\t\tnotesElement.classList.add( 'speaker-notes-pdf' );\n\t\t\t\t\t\tnotesElement.setAttribute( 'data-layout', notesLayout );\n\t\t\t\t\t\tnotesElement.innerHTML = notes;\n\n\t\t\t\t\t\tif( notesLayout === 'separate-page' ) {\n\t\t\t\t\t\t\tpages.push( notesElement );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tnotesElement.style.left = notesSpacing + 'px';\n\t\t\t\t\t\t\tnotesElement.style.bottom = notesSpacing + 'px';\n\t\t\t\t\t\t\tnotesElement.style.width = ( pageWidth - notesSpacing*2 ) + 'px';\n\t\t\t\t\t\t\tpage.appendChild( notesElement );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Inject page numbers if `slideNumbers` are enabled\n\t\t\t\tif( injectPageNumbers ) {\n\t\t\t\t\tconst numberElement = document.createElement( 'div' );\n\t\t\t\t\tnumberElement.classList.add( 'slide-number' );\n\t\t\t\t\tnumberElement.classList.add( 'slide-number-pdf' );\n\t\t\t\t\tnumberElement.innerHTML = slideNumber++;\n\t\t\t\t\tpage.appendChild( numberElement );\n\t\t\t\t}\n\n\t\t\t\t// Copy page and show fragments one after another\n\t\t\t\tif( config.pdfSeparateFragments ) {\n\n\t\t\t\t\t// Each fragment 'group' is an array containing one or more\n\t\t\t\t\t// fragments. Multiple fragments that appear at the same time\n\t\t\t\t\t// are part of the same group.\n\t\t\t\t\tconst fragmentGroups = this.Reveal.fragments.sort( page.querySelectorAll( '.fragment' ), true );\n\n\t\t\t\t\tlet previousFragmentStep;\n\n\t\t\t\t\tfragmentGroups.forEach( function( fragments, index ) {\n\n\t\t\t\t\t\t// Remove 'current-fragment' from the previous group\n\t\t\t\t\t\tif( previousFragmentStep ) {\n\t\t\t\t\t\t\tpreviousFragmentStep.forEach( function( fragment ) {\n\t\t\t\t\t\t\t\tfragment.classList.remove( 'current-fragment' );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Show the fragments for the current index\n\t\t\t\t\t\tfragments.forEach( function( fragment ) {\n\t\t\t\t\t\t\tfragment.classList.add( 'visible', 'current-fragment' );\n\t\t\t\t\t\t}, this );\n\n\t\t\t\t\t\t// Create a separate page for the current fragment state\n\t\t\t\t\t\tconst clonedPage = page.cloneNode( true );\n\n\t\t\t\t\t\t// Inject unique page numbers for fragments\n\t\t\t\t\t\tif( injectPageNumbers ) {\n\t\t\t\t\t\t\tconst numberElement = clonedPage.querySelector( '.slide-number-pdf' );\n\t\t\t\t\t\t\tconst fragmentNumber = index + 1;\n\t\t\t\t\t\t\tnumberElement.innerHTML += '.' + fragmentNumber;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpages.push( clonedPage );\n\n\t\t\t\t\t\tpreviousFragmentStep = fragments;\n\n\t\t\t\t\t}, this );\n\n\t\t\t\t\t// Reset the first/original page so that all fragments are hidden\n\t\t\t\t\tfragmentGroups.forEach( function( fragments ) {\n\t\t\t\t\t\tfragments.forEach( function( fragment ) {\n\t\t\t\t\t\t\tfragment.classList.remove( 'visible', 'current-fragment' );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\t\t\t\t// Show all fragments\n\t\t\t\telse {\n\t\t\t\t\tqueryAll( page, '.fragment:not(.fade-out)' ).forEach( function( fragment ) {\n\t\t\t\t\t\tfragment.classList.add( 'visible' );\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}, this );\n\n\t\tawait new Promise( requestAnimationFrame );\n\n\t\tpages.forEach( page => pageContainer.appendChild( page ) );\n\n\t\t// Re-run JS-based content layout after the slide is added to page DOM\n\t\tthis.Reveal.slideContent.layout( this.Reveal.getSlidesElement() );\n\n\t\t// Notify subscribers that the PDF layout is good to go\n\t\tthis.Reveal.dispatchEvent({ type: 'pdf-ready' });\n\n\t\tviewportElement.classList.remove( 'loading-scroll-mode' );\n\n\t}\n\n\t/**\n\t * Checks if the print mode is/should be activated.\n\t */\n\tisActive() {\n\n\t\treturn this.Reveal.getConfig().view === 'print';\n\n\t}\n\n}","import { extend, queryAll } from '../utils/util.js'\n\n/**\n * Handles sorting and navigation of slide fragments.\n * Fragments are elements within a slide that are\n * revealed/animated incrementally.\n */\nexport default class Fragments {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.fragments === false ) {\n\t\t\tthis.disable();\n\t\t}\n\t\telse if( oldConfig.fragments === false ) {\n\t\t\tthis.enable();\n\t\t}\n\n\t}\n\n\t/**\n\t * If fragments are disabled in the deck, they should all be\n\t * visible rather than stepped through.\n\t */\n\tdisable() {\n\n\t\tqueryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {\n\t\t\telement.classList.add( 'visible' );\n\t\t\telement.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Reverse of #disable(). Only called if fragments have\n\t * previously been disabled.\n\t */\n\tenable() {\n\n\t\tqueryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {\n\t\t\telement.classList.remove( 'visible' );\n\t\t\telement.classList.remove( 'current-fragment' );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns an object describing the available fragment\n\t * directions.\n\t *\n\t * @return {{prev: boolean, next: boolean}}\n\t */\n\tavailableRoutes() {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\t\t\tlet fragments = currentSlide.querySelectorAll( '.fragment:not(.disabled)' );\n\t\t\tlet hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.disabled):not(.visible)' );\n\n\t\t\treturn {\n\t\t\t\tprev: fragments.length - hiddenFragments.length > 0,\n\t\t\t\tnext: !!hiddenFragments.length\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\treturn { prev: false, next: false };\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a sorted fragments list, ordered by an increasing\n\t * \"data-fragment-index\" attribute.\n\t *\n\t * Fragments will be revealed in the order that they are returned by\n\t * this function, so you can use the index attributes to control the\n\t * order of fragment appearance.\n\t *\n\t * To maintain a sensible default fragment order, fragments are presumed\n\t * to be passed in document order. This function adds a \"fragment-index\"\n\t * attribute to each node if such an attribute is not already present,\n\t * and sets that attribute to an integer value which is the position of\n\t * the fragment within the fragments list.\n\t *\n\t * @param {object[]|*} fragments\n\t * @param {boolean} grouped If true the returned array will contain\n\t * nested arrays for all fragments with the same index\n\t * @return {object[]} sorted Sorted array of fragments\n\t */\n\tsort( fragments, grouped = false ) {\n\n\t\tfragments = Array.from( fragments );\n\n\t\tlet ordered = [],\n\t\t\tunordered = [],\n\t\t\tsorted = [];\n\n\t\t// Group ordered and unordered elements\n\t\tfragments.forEach( fragment => {\n\t\t\tif( fragment.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\tlet index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 );\n\n\t\t\t\tif( !ordered[index] ) {\n\t\t\t\t\tordered[index] = [];\n\t\t\t\t}\n\n\t\t\t\tordered[index].push( fragment );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tunordered.push( [ fragment ] );\n\t\t\t}\n\t\t} );\n\n\t\t// Append fragments without explicit indices in their\n\t\t// DOM order\n\t\tordered = ordered.concat( unordered );\n\n\t\t// Manually count the index up per group to ensure there\n\t\t// are no gaps\n\t\tlet index = 0;\n\n\t\t// Push all fragments in their sorted order to an array,\n\t\t// this flattens the groups\n\t\tordered.forEach( group => {\n\t\t\tgroup.forEach( fragment => {\n\t\t\t\tsorted.push( fragment );\n\t\t\t\tfragment.setAttribute( 'data-fragment-index', index );\n\t\t\t} );\n\n\t\t\tindex ++;\n\t\t} );\n\n\t\treturn grouped === true ? ordered : sorted;\n\n\t}\n\n\t/**\n\t * Sorts and formats all of fragments in the\n\t * presentation.\n\t */\n\tsortAll() {\n\n\t\tthis.Reveal.getHorizontalSlides().forEach( horizontalSlide => {\n\n\t\t\tlet verticalSlides = queryAll( horizontalSlide, 'section' );\n\t\t\tverticalSlides.forEach( ( verticalSlide, y ) => {\n\n\t\t\t\tthis.sort( verticalSlide.querySelectorAll( '.fragment' ) );\n\n\t\t\t}, this );\n\n\t\t\tif( verticalSlides.length === 0 ) this.sort( horizontalSlide.querySelectorAll( '.fragment' ) );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Refreshes the fragments on the current slide so that they\n\t * have the appropriate classes (.visible + .current-fragment).\n\t *\n\t * @param {number} [index] The index of the current fragment\n\t * @param {array} [fragments] Array containing all fragments\n\t * in the current slide\n\t *\n\t * @return {{shown: array, hidden: array}}\n\t */\n\tupdate( index, fragments, slide = this.Reveal.getCurrentSlide() ) {\n\n\t\tlet changedFragments = {\n\t\t\tshown: [],\n\t\t\thidden: []\n\t\t};\n\n\t\tif( slide && this.Reveal.getConfig().fragments ) {\n\n\t\t\tfragments = fragments || this.sort( slide.querySelectorAll( '.fragment' ) );\n\n\t\t\tif( fragments.length ) {\n\n\t\t\t\tlet maxIndex = 0;\n\n\t\t\t\tif( typeof index !== 'number' ) {\n\t\t\t\t\tlet currentFragment = this.sort( slide.querySelectorAll( '.fragment.visible' ) ).pop();\n\t\t\t\t\tif( currentFragment ) {\n\t\t\t\t\t\tindex = parseInt( currentFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tArray.from( fragments ).forEach( ( el, i ) => {\n\n\t\t\t\t\tif( el.hasAttribute( 'data-fragment-index' ) ) {\n\t\t\t\t\t\ti = parseInt( el.getAttribute( 'data-fragment-index' ), 10 );\n\t\t\t\t\t}\n\n\t\t\t\t\tmaxIndex = Math.max( maxIndex, i );\n\n\t\t\t\t\t// Visible fragments\n\t\t\t\t\tif( i <= index ) {\n\t\t\t\t\t\tlet wasVisible = el.classList.contains( 'visible' )\n\t\t\t\t\t\tel.classList.add( 'visible' );\n\t\t\t\t\t\tel.classList.remove( 'current-fragment' );\n\n\t\t\t\t\t\tif( i === index ) {\n\t\t\t\t\t\t\t// Announce the fragments one by one to the Screen Reader\n\t\t\t\t\t\t\tthis.Reveal.announceStatus( this.Reveal.getStatusText( el ) );\n\n\t\t\t\t\t\t\tel.classList.add( 'current-fragment' );\n\t\t\t\t\t\t\tthis.Reveal.slideContent.startEmbeddedContent( el );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif( !wasVisible ) {\n\t\t\t\t\t\t\tchangedFragments.shown.push( el )\n\t\t\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\ttype: 'visible',\n\t\t\t\t\t\t\t\tbubbles: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Hidden fragments\n\t\t\t\t\telse {\n\t\t\t\t\t\tlet wasVisible = el.classList.contains( 'visible' )\n\t\t\t\t\t\tel.classList.remove( 'visible' );\n\t\t\t\t\t\tel.classList.remove( 'current-fragment' );\n\n\t\t\t\t\t\tif( wasVisible ) {\n\t\t\t\t\t\t\tthis.Reveal.slideContent.stopEmbeddedContent( el );\n\t\t\t\t\t\t\tchangedFragments.hidden.push( el );\n\t\t\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\t\t\ttarget: el,\n\t\t\t\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\t\t\t\tbubbles: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t// Write the current fragment index to the slide
.\n\t\t\t\t// This can be used by end users to apply styles based on\n\t\t\t\t// the current fragment index.\n\t\t\t\tindex = typeof index === 'number' ? index : -1;\n\t\t\t\tindex = Math.max( Math.min( index, maxIndex ), -1 );\n\t\t\t\tslide.setAttribute( 'data-fragment', index );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn changedFragments;\n\n\t}\n\n\t/**\n\t * Formats the fragments on the given slide so that they have\n\t * valid indices. Call this if fragments are changed in the DOM\n\t * after reveal.js has already initialized.\n\t *\n\t * @param {HTMLElement} slide\n\t * @return {Array} a list of the HTML fragments that were synced\n\t */\n\tsync( slide = this.Reveal.getCurrentSlide() ) {\n\n\t\treturn this.sort( slide.querySelectorAll( '.fragment' ) );\n\n\t}\n\n\t/**\n\t * Navigate to the specified slide fragment.\n\t *\n\t * @param {?number} index The index of the fragment that\n\t * should be shown, -1 means all are invisible\n\t * @param {number} offset Integer offset to apply to the\n\t * fragment index\n\t *\n\t * @return {boolean} true if a change was made in any\n\t * fragments visibility as part of this call\n\t */\n\tgoto( index, offset = 0 ) {\n\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide && this.Reveal.getConfig().fragments ) {\n\n\t\t\tlet fragments = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled)' ) );\n\t\t\tif( fragments.length ) {\n\n\t\t\t\t// If no index is specified, find the current\n\t\t\t\tif( typeof index !== 'number' ) {\n\t\t\t\t\tlet lastVisibleFragment = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled).visible' ) ).pop();\n\n\t\t\t\t\tif( lastVisibleFragment ) {\n\t\t\t\t\t\tindex = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tindex = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply the offset if there is one\n\t\t\t\tindex += offset;\n\n\t\t\t\tlet changedFragments = this.update( index, fragments );\n\n\t\t\t\tif( changedFragments.hidden.length ) {\n\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\ttype: 'fragmenthidden',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tfragment: changedFragments.hidden[0],\n\t\t\t\t\t\t\tfragments: changedFragments.hidden\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif( changedFragments.shown.length ) {\n\t\t\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\t\t\ttype: 'fragmentshown',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tfragment: changedFragments.shown[0],\n\t\t\t\t\t\t\tfragments: changedFragments.shown\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.Reveal.controls.update();\n\t\t\t\tthis.Reveal.progress.update();\n\n\t\t\t\tif( this.Reveal.getConfig().fragmentInURL ) {\n\t\t\t\t\tthis.Reveal.location.writeURL();\n\t\t\t\t}\n\n\t\t\t\treturn !!( changedFragments.shown.length || changedFragments.hidden.length );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Navigate to the next slide fragment.\n\t *\n\t * @return {boolean} true if there was a next fragment,\n\t * false otherwise\n\t */\n\tnext() {\n\n\t\treturn this.goto( null, 1 );\n\n\t}\n\n\t/**\n\t * Navigate to the previous slide fragment.\n\t *\n\t * @return {boolean} true if there was a previous fragment,\n\t * false otherwise\n\t */\n\tprev() {\n\n\t\treturn this.goto( null, -1 );\n\n\t}\n\n}","import { SLIDES_SELECTOR } from '../utils/constants.js'\nimport { extend, queryAll, transformElement } from '../utils/util.js'\n\n/**\n * Handles all logic related to the overview mode\n * (birds-eye view of all slides).\n */\nexport default class Overview {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.active = false;\n\n\t\tthis.onSlideClicked = this.onSlideClicked.bind( this );\n\n\t}\n\n\t/**\n\t * Displays the overview of slides (quick nav) by scaling\n\t * down and arranging all slide elements.\n\t */\n\tactivate() {\n\n\t\t// Only proceed if enabled in config\n\t\tif( this.Reveal.getConfig().overview && !this.Reveal.isScrollView() && !this.isActive() ) {\n\n\t\t\tthis.active = true;\n\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'overview' );\n\n\t\t\t// Don't auto-slide while in overview mode\n\t\t\tthis.Reveal.cancelAutoSlide();\n\n\t\t\t// Move the backgrounds element into the slide container to\n\t\t\t// that the same scaling is applied\n\t\t\tthis.Reveal.getSlidesElement().appendChild( this.Reveal.getBackgroundsElement() );\n\n\t\t\t// Clicking on an overview slide navigates to it\n\t\t\tqueryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {\n\t\t\t\tif( !slide.classList.contains( 'stack' ) ) {\n\t\t\t\t\tslide.addEventListener( 'click', this.onSlideClicked, true );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Calculate slide sizes\n\t\t\tconst margin = 70;\n\t\t\tconst slideSize = this.Reveal.getComputedSlideSize();\n\t\t\tthis.overviewSlideWidth = slideSize.width + margin;\n\t\t\tthis.overviewSlideHeight = slideSize.height + margin;\n\n\t\t\t// Reverse in RTL mode\n\t\t\tif( this.Reveal.getConfig().rtl ) {\n\t\t\t\tthis.overviewSlideWidth = -this.overviewSlideWidth;\n\t\t\t}\n\n\t\t\tthis.Reveal.updateSlidesVisibility();\n\n\t\t\tthis.layout();\n\t\t\tthis.update();\n\n\t\t\tthis.Reveal.layout();\n\n\t\t\tconst indices = this.Reveal.getIndices();\n\n\t\t\t// Notify observers of the overview showing\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'overviewshown',\n\t\t\t\tdata: {\n\t\t\t\t\t'indexh': indices.h,\n\t\t\t\t\t'indexv': indices.v,\n\t\t\t\t\t'currentSlide': this.Reveal.getCurrentSlide()\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses CSS transforms to position all slides in a grid for\n\t * display inside of the overview mode.\n\t */\n\tlayout() {\n\n\t\t// Layout slides\n\t\tthis.Reveal.getHorizontalSlides().forEach( ( hslide, h ) => {\n\t\t\thslide.setAttribute( 'data-index-h', h );\n\t\t\ttransformElement( hslide, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );\n\n\t\t\tif( hslide.classList.contains( 'stack' ) ) {\n\n\t\t\t\tqueryAll( hslide, 'section' ).forEach( ( vslide, v ) => {\n\t\t\t\t\tvslide.setAttribute( 'data-index-h', h );\n\t\t\t\t\tvslide.setAttribute( 'data-index-v', v );\n\n\t\t\t\t\ttransformElement( vslide, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );\n\t\t\t\t} );\n\n\t\t\t}\n\t\t} );\n\n\t\t// Layout slide backgrounds\n\t\tArray.from( this.Reveal.getBackgroundsElement().childNodes ).forEach( ( hbackground, h ) => {\n\t\t\ttransformElement( hbackground, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );\n\n\t\t\tqueryAll( hbackground, '.slide-background' ).forEach( ( vbackground, v ) => {\n\t\t\t\ttransformElement( vbackground, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );\n\t\t\t} );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Moves the overview viewport to the current slides.\n\t * Called each time the current slide changes.\n\t */\n\tupdate() {\n\n\t\tconst vmin = Math.min( window.innerWidth, window.innerHeight );\n\t\tconst scale = Math.max( vmin / 5, 150 ) / vmin;\n\t\tconst indices = this.Reveal.getIndices();\n\n\t\tthis.Reveal.transformSlides( {\n\t\t\toverview: [\n\t\t\t\t'scale('+ scale +')',\n\t\t\t\t'translateX('+ ( -indices.h * this.overviewSlideWidth ) +'px)',\n\t\t\t\t'translateY('+ ( -indices.v * this.overviewSlideHeight ) +'px)'\n\t\t\t].join( ' ' )\n\t\t} );\n\n\t}\n\n\t/**\n\t * Exits the slide overview and enters the currently\n\t * active slide.\n\t */\n\tdeactivate() {\n\n\t\t// Only proceed if enabled in config\n\t\tif( this.Reveal.getConfig().overview ) {\n\n\t\t\tthis.active = false;\n\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'overview' );\n\n\t\t\t// Temporarily add a class so that transitions can do different things\n\t\t\t// depending on whether they are exiting/entering overview, or just\n\t\t\t// moving from slide to slide\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'overview-deactivating' );\n\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.Reveal.getRevealElement().classList.remove( 'overview-deactivating' );\n\t\t\t}, 1 );\n\n\t\t\t// Move the background element back out\n\t\t\tthis.Reveal.getRevealElement().appendChild( this.Reveal.getBackgroundsElement() );\n\n\t\t\t// Clean up changes made to slides\n\t\t\tqueryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {\n\t\t\t\ttransformElement( slide, '' );\n\n\t\t\t\tslide.removeEventListener( 'click', this.onSlideClicked, true );\n\t\t\t} );\n\n\t\t\t// Clean up changes made to backgrounds\n\t\t\tqueryAll( this.Reveal.getBackgroundsElement(), '.slide-background' ).forEach( background => {\n\t\t\t\ttransformElement( background, '' );\n\t\t\t} );\n\n\t\t\tthis.Reveal.transformSlides( { overview: '' } );\n\n\t\t\tconst indices = this.Reveal.getIndices();\n\n\t\t\tthis.Reveal.slide( indices.h, indices.v );\n\t\t\tthis.Reveal.layout();\n\t\t\tthis.Reveal.cueAutoSlide();\n\n\t\t\t// Notify observers of the overview hiding\n\t\t\tthis.Reveal.dispatchEvent({\n\t\t\t\ttype: 'overviewhidden',\n\t\t\t\tdata: {\n\t\t\t\t\t'indexh': indices.h,\n\t\t\t\t\t'indexv': indices.v,\n\t\t\t\t\t'currentSlide': this.Reveal.getCurrentSlide()\n\t\t\t\t}\n\t\t\t});\n\n\t\t}\n\t}\n\n\t/**\n\t * Toggles the slide overview mode on and off.\n\t *\n\t * @param {Boolean} [override] Flag which overrides the\n\t * toggle logic and forcibly sets the desired state. True means\n\t * overview is open, false means it's closed.\n\t */\n\ttoggle( override ) {\n\n\t\tif( typeof override === 'boolean' ) {\n\t\t\toverride ? this.activate() : this.deactivate();\n\t\t}\n\t\telse {\n\t\t\tthis.isActive() ? this.deactivate() : this.activate();\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the overview is currently active.\n\t *\n\t * @return {Boolean} true if the overview is active,\n\t * false otherwise\n\t */\n\tisActive() {\n\n\t\treturn this.active;\n\n\t}\n\n\t/**\n\t * Invoked when a slide is and we're in the overview.\n\t *\n\t * @param {object} event\n\t */\n\tonSlideClicked( event ) {\n\n\t\tif( this.isActive() ) {\n\t\t\tevent.preventDefault();\n\n\t\t\tlet element = event.target;\n\n\t\t\twhile( element && !element.nodeName.match( /section/gi ) ) {\n\t\t\t\telement = element.parentNode;\n\t\t\t}\n\n\t\t\tif( element && !element.classList.contains( 'disabled' ) ) {\n\n\t\t\t\tthis.deactivate();\n\n\t\t\t\tif( element.nodeName.match( /section/gi ) ) {\n\t\t\t\t\tlet h = parseInt( element.getAttribute( 'data-index-h' ), 10 ),\n\t\t\t\t\t\tv = parseInt( element.getAttribute( 'data-index-v' ), 10 );\n\n\t\t\t\t\tthis.Reveal.slide( h, v );\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t}\n\n}","import { enterFullscreen } from '../utils/util.js'\n\n/**\n * Handles all reveal.js keyboard interactions.\n */\nexport default class Keyboard {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// A key:value map of keyboard keys and descriptions of\n\t\t// the actions they trigger\n\t\tthis.shortcuts = {};\n\n\t\t// Holds custom key code mappings\n\t\tthis.bindings = {};\n\n\t\tthis.onDocumentKeyDown = this.onDocumentKeyDown.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.navigationMode === 'linear' ) {\n\t\t\tthis.shortcuts['→ , ↓ , SPACE , N , L , J'] = 'Next slide';\n\t\t\tthis.shortcuts['← , ↑ , P , H , K'] = 'Previous slide';\n\t\t}\n\t\telse {\n\t\t\tthis.shortcuts['N , SPACE'] = 'Next slide';\n\t\t\tthis.shortcuts['P , Shift SPACE'] = 'Previous slide';\n\t\t\tthis.shortcuts['← , H'] = 'Navigate left';\n\t\t\tthis.shortcuts['→ , L'] = 'Navigate right';\n\t\t\tthis.shortcuts['↑ , K'] = 'Navigate up';\n\t\t\tthis.shortcuts['↓ , J'] = 'Navigate down';\n\t\t}\n\n\t\tthis.shortcuts['Alt + ←/↑/→/↓'] = 'Navigate without fragments';\n\t\tthis.shortcuts['Shift + ←/↑/→/↓'] = 'Jump to first/last slide';\n\t\tthis.shortcuts['B , .'] = 'Pause';\n\t\tthis.shortcuts['F'] = 'Fullscreen';\n\t\tthis.shortcuts['G'] = 'Jump to slide';\n\t\tthis.shortcuts['ESC, O'] = 'Slide overview';\n\n\t}\n\n\t/**\n\t * Starts listening for keyboard events.\n\t */\n\tbind() {\n\n\t\tdocument.addEventListener( 'keydown', this.onDocumentKeyDown, false );\n\n\t}\n\n\t/**\n\t * Stops listening for keyboard events.\n\t */\n\tunbind() {\n\n\t\tdocument.removeEventListener( 'keydown', this.onDocumentKeyDown, false );\n\n\t}\n\n\t/**\n\t * Add a custom key binding with optional description to\n\t * be added to the help screen.\n\t */\n\taddKeyBinding( binding, callback ) {\n\n\t\tif( typeof binding === 'object' && binding.keyCode ) {\n\t\t\tthis.bindings[binding.keyCode] = {\n\t\t\t\tcallback: callback,\n\t\t\t\tkey: binding.key,\n\t\t\t\tdescription: binding.description\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\tthis.bindings[binding] = {\n\t\t\t\tcallback: callback,\n\t\t\t\tkey: null,\n\t\t\t\tdescription: null\n\t\t\t};\n\t\t}\n\n\t}\n\n\t/**\n\t * Removes the specified custom key binding.\n\t */\n\tremoveKeyBinding( keyCode ) {\n\n\t\tdelete this.bindings[keyCode];\n\n\t}\n\n\t/**\n\t * Programmatically triggers a keyboard event\n\t *\n\t * @param {int} keyCode\n\t */\n\ttriggerKey( keyCode ) {\n\n\t\tthis.onDocumentKeyDown( { keyCode } );\n\n\t}\n\n\t/**\n\t * Registers a new shortcut to include in the help overlay\n\t *\n\t * @param {String} key\n\t * @param {String} value\n\t */\n\tregisterKeyboardShortcut( key, value ) {\n\n\t\tthis.shortcuts[key] = value;\n\n\t}\n\n\tgetShortcuts() {\n\n\t\treturn this.shortcuts;\n\n\t}\n\n\tgetBindings() {\n\n\t\treturn this.bindings;\n\n\t}\n\n\t/**\n\t * Handler for the document level 'keydown' event.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentKeyDown( event ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\t// If there's a condition specified and it returns false,\n\t\t// ignore this event\n\t\tif( typeof config.keyboardCondition === 'function' && config.keyboardCondition(event) === false ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// If keyboardCondition is set, only capture keyboard events\n\t\t// for embedded decks when they are focused\n\t\tif( config.keyboardCondition === 'focused' && !this.Reveal.isFocused() ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Shorthand\n\t\tlet keyCode = event.keyCode;\n\n\t\t// Remember if auto-sliding was paused so we can toggle it\n\t\tlet autoSlideWasPaused = !this.Reveal.isAutoSliding();\n\n\t\tthis.Reveal.onUserInput( event );\n\n\t\t// Is there a focused element that could be using the keyboard?\n\t\tlet activeElementIsCE = document.activeElement && document.activeElement.isContentEditable === true;\n\t\tlet activeElementIsInput = document.activeElement && document.activeElement.tagName && /input|textarea/i.test( document.activeElement.tagName );\n\t\tlet activeElementIsNotes = document.activeElement && document.activeElement.className && /speaker-notes/i.test( document.activeElement.className);\n\n\t\t// Whitelist certain modifiers for slide navigation shortcuts\n\t\tlet keyCodeUsesModifier = [32, 37, 38, 39, 40, 78, 80, 191].indexOf( event.keyCode ) !== -1;\n\n\t\t// Prevent all other events when a modifier is pressed\n\t\tlet unusedModifier = \t!( keyCodeUsesModifier && event.shiftKey || event.altKey ) &&\n\t\t\t\t\t\t\t\t( event.shiftKey || event.altKey || event.ctrlKey || event.metaKey );\n\n\t\t// Disregard the event if there's a focused element or a\n\t\t// keyboard modifier key is present\n\t\tif( activeElementIsCE || activeElementIsInput || activeElementIsNotes || unusedModifier ) return;\n\n\t\t// While paused only allow resume keyboard events; 'b', 'v', '.'\n\t\tlet resumeKeyCodes = [66,86,190,191];\n\t\tlet key;\n\n\t\t// Custom key bindings for togglePause should be able to resume\n\t\tif( typeof config.keyboard === 'object' ) {\n\t\t\tfor( key in config.keyboard ) {\n\t\t\t\tif( config.keyboard[key] === 'togglePause' ) {\n\t\t\t\t\tresumeKeyCodes.push( parseInt( key, 10 ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif( this.Reveal.isPaused() && resumeKeyCodes.indexOf( keyCode ) === -1 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Use linear navigation if we're configured to OR if\n\t\t// the presentation is one-dimensional\n\t\tlet useLinearMode = config.navigationMode === 'linear' || !this.Reveal.hasHorizontalSlides() || !this.Reveal.hasVerticalSlides();\n\n\t\tlet triggered = false;\n\n\t\t// 1. User defined key bindings\n\t\tif( typeof config.keyboard === 'object' ) {\n\n\t\t\tfor( key in config.keyboard ) {\n\n\t\t\t\t// Check if this binding matches the pressed key\n\t\t\t\tif( parseInt( key, 10 ) === keyCode ) {\n\n\t\t\t\t\tlet value = config.keyboard[ key ];\n\n\t\t\t\t\t// Callback function\n\t\t\t\t\tif( typeof value === 'function' ) {\n\t\t\t\t\t\tvalue.apply( null, [ event ] );\n\t\t\t\t\t}\n\t\t\t\t\t// String shortcuts to reveal.js API\n\t\t\t\t\telse if( typeof value === 'string' && typeof this.Reveal[ value ] === 'function' ) {\n\t\t\t\t\t\tthis.Reveal[ value ].call();\n\t\t\t\t\t}\n\n\t\t\t\t\ttriggered = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// 2. Registered custom key bindings\n\t\tif( triggered === false ) {\n\n\t\t\tfor( key in this.bindings ) {\n\n\t\t\t\t// Check if this binding matches the pressed key\n\t\t\t\tif( parseInt( key, 10 ) === keyCode ) {\n\n\t\t\t\t\tlet action = this.bindings[ key ].callback;\n\n\t\t\t\t\t// Callback function\n\t\t\t\t\tif( typeof action === 'function' ) {\n\t\t\t\t\t\taction.apply( null, [ event ] );\n\t\t\t\t\t}\n\t\t\t\t\t// String shortcuts to reveal.js API\n\t\t\t\t\telse if( typeof action === 'string' && typeof this.Reveal[ action ] === 'function' ) {\n\t\t\t\t\t\tthis.Reveal[ action ].call();\n\t\t\t\t\t}\n\n\t\t\t\t\ttriggered = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 3. System defined key bindings\n\t\tif( triggered === false ) {\n\n\t\t\t// Assume true and try to prove false\n\t\t\ttriggered = true;\n\n\t\t\t// P, PAGE UP\n\t\t\tif( keyCode === 80 || keyCode === 33 ) {\n\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t}\n\t\t\t// N, PAGE DOWN\n\t\t\telse if( keyCode === 78 || keyCode === 34 ) {\n\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t}\n\t\t\t// H, LEFT\n\t\t\telse if( keyCode === 72 || keyCode === 37 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( 0 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.left({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// L, RIGHT\n\t\t\telse if( keyCode === 76 || keyCode === 39 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.right({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// K, UP\n\t\t\telse if( keyCode === 75 || keyCode === 38 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( undefined, 0 );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.up({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// J, DOWN\n\t\t\telse if( keyCode === 74 || keyCode === 40 ) {\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.slide( undefined, Number.MAX_VALUE );\n\t\t\t\t}\n\t\t\t\telse if( !this.Reveal.overview.isActive() && useLinearMode ) {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.down({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// HOME\n\t\t\telse if( keyCode === 36 ) {\n\t\t\t\tthis.Reveal.slide( 0 );\n\t\t\t}\n\t\t\t// END\n\t\t\telse if( keyCode === 35 ) {\n\t\t\t\tthis.Reveal.slide( this.Reveal.getHorizontalSlides().length - 1 );\n\t\t\t}\n\t\t\t// SPACE\n\t\t\telse if( keyCode === 32 ) {\n\t\t\t\tif( this.Reveal.overview.isActive() ) {\n\t\t\t\t\tthis.Reveal.overview.deactivate();\n\t\t\t\t}\n\t\t\t\tif( event.shiftKey ) {\n\t\t\t\t\tthis.Reveal.prev({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.Reveal.next({skipFragments: event.altKey});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// TWO-SPOT, SEMICOLON, B, V, PERIOD, LOGITECH PRESENTER TOOLS \"BLACK SCREEN\" BUTTON\n\t\t\telse if( [58, 59, 66, 86, 190].includes( keyCode ) || ( keyCode === 191 && !event.shiftKey ) ) {\n\t\t\t\tthis.Reveal.togglePause();\n\t\t\t}\n\t\t\t// F\n\t\t\telse if( keyCode === 70 ) {\n\t\t\t\tenterFullscreen( config.embedded ? this.Reveal.getViewportElement() : document.documentElement );\n\t\t\t}\n\t\t\t// A\n\t\t\telse if( keyCode === 65 ) {\n\t\t\t\tif( config.autoSlideStoppable ) {\n\t\t\t\t\tthis.Reveal.toggleAutoSlide( autoSlideWasPaused );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// G\n\t\t\telse if( keyCode === 71 ) {\n\t\t\t\tif( config.jumpToSlide ) {\n\t\t\t\t\tthis.Reveal.toggleJumpToSlide();\n\t\t\t\t}\n\t\t\t}\n\t\t\t// ?\n\t\t\telse if( keyCode === 191 && event.shiftKey ) {\n\t\t\t\tthis.Reveal.toggleHelp();\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttriggered = false;\n\t\t\t}\n\n\t\t}\n\n\t\t// If the input resulted in a triggered action we should prevent\n\t\t// the browsers default behavior\n\t\tif( triggered ) {\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\t\t// ESC or O key\n\t\telse if( keyCode === 27 || keyCode === 79 ) {\n\t\t\tif( this.Reveal.closeOverlay() === false ) {\n\t\t\t\tthis.Reveal.overview.toggle();\n\t\t\t}\n\n\t\t\tevent.preventDefault && event.preventDefault();\n\t\t}\n\n\t\t// If auto-sliding is enabled we need to cue up\n\t\t// another timeout\n\t\tthis.Reveal.cueAutoSlide();\n\n\t}\n\n}","/**\n * Reads and writes the URL based on reveal.js' current state.\n */\nexport default class Location {\n\n\t// The minimum number of milliseconds that must pass between\n\t// calls to history.replaceState\n\tMAX_REPLACE_STATE_FREQUENCY = 1000\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Delays updates to the URL due to a Chrome thumbnailer bug\n\t\tthis.writeURLTimeout = 0;\n\n\t\tthis.replaceStateTimestamp = 0;\n\n\t\tthis.onWindowHashChange = this.onWindowHashChange.bind( this );\n\n\t}\n\n\tbind() {\n\n\t\twindow.addEventListener( 'hashchange', this.onWindowHashChange, false );\n\n\t}\n\n\tunbind() {\n\n\t\twindow.removeEventListener( 'hashchange', this.onWindowHashChange, false );\n\n\t}\n\n\t/**\n\t * Returns the slide indices for the given hash link.\n\t *\n\t * @param {string} [hash] the hash string that we want to\n\t * find the indices for\n\t *\n\t * @returns slide indices or null\n\t */\n\tgetIndicesFromHash( hash=window.location.hash, options={} ) {\n\n\t\t// Attempt to parse the hash as either an index or name\n\t\tlet name = hash.replace( /^#\\/?/, '' );\n\t\tlet bits = name.split( '/' );\n\n\t\t// If the first bit is not fully numeric and there is a name we\n\t\t// can assume that this is a named link\n\t\tif( !/^[0-9]*$/.test( bits[0] ) && name.length ) {\n\t\t\tlet slide;\n\n\t\t\tlet f;\n\n\t\t\t// Parse named links with fragments (#/named-link/2)\n\t\t\tif( /\\/[-\\d]+$/g.test( name ) ) {\n\t\t\t\tf = parseInt( name.split( '/' ).pop(), 10 );\n\t\t\t\tf = isNaN(f) ? undefined : f;\n\t\t\t\tname = name.split( '/' ).shift();\n\t\t\t}\n\n\t\t\t// Ensure the named link is a valid HTML ID attribute\n\t\t\ttry {\n\t\t\t\tslide = document\n\t\t\t\t\t.getElementById( decodeURIComponent( name ) )\n\t\t\t\t\t.closest('.slides section');\n\t\t\t}\n\t\t\tcatch ( error ) { }\n\n\t\t\tif( slide ) {\n\t\t\t\treturn { ...this.Reveal.getIndices( slide ), f };\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconst config = this.Reveal.getConfig();\n\t\t\tlet hashIndexBase = config.hashOneBasedIndex || options.oneBasedIndex ? 1 : 0;\n\n\t\t\t// Read the index components of the hash\n\t\t\tlet h = ( parseInt( bits[0], 10 ) - hashIndexBase ) || 0,\n\t\t\t\tv = ( parseInt( bits[1], 10 ) - hashIndexBase ) || 0,\n\t\t\t\tf;\n\n\t\t\tif( config.fragmentInURL ) {\n\t\t\t\tf = parseInt( bits[2], 10 );\n\t\t\t\tif( isNaN( f ) ) {\n\t\t\t\t\tf = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { h, v, f };\n\t\t}\n\n\t\t// The hash couldn't be parsed or no matching named link was found\n\t\treturn null\n\n\t}\n\n\t/**\n\t * Reads the current URL (hash) and navigates accordingly.\n\t */\n\treadURL() {\n\n\t\tconst currentIndices = this.Reveal.getIndices();\n\t\tconst newIndices = this.getIndicesFromHash();\n\n\t\tif( newIndices ) {\n\t\t\tif( ( newIndices.h !== currentIndices.h || newIndices.v !== currentIndices.v || newIndices.f !== undefined ) ) {\n\t\t\t\t\tthis.Reveal.slide( newIndices.h, newIndices.v, newIndices.f );\n\t\t\t}\n\t\t}\n\t\t// If no new indices are available, we're trying to navigate to\n\t\t// a slide hash that does not exist\n\t\telse {\n\t\t\tthis.Reveal.slide( currentIndices.h || 0, currentIndices.v || 0 );\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the page URL (hash) to reflect the current\n\t * state.\n\t *\n\t * @param {number} delay The time in ms to wait before\n\t * writing the hash\n\t */\n\twriteURL( delay ) {\n\n\t\tlet config = this.Reveal.getConfig();\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\n\t\t// Make sure there's never more than one timeout running\n\t\tclearTimeout( this.writeURLTimeout );\n\n\t\t// If a delay is specified, timeout this call\n\t\tif( typeof delay === 'number' ) {\n\t\t\tthis.writeURLTimeout = setTimeout( this.writeURL, delay );\n\t\t}\n\t\telse if( currentSlide ) {\n\n\t\t\tlet hash = this.getHash();\n\n\t\t\t// If we're configured to push to history OR the history\n\t\t\t// API is not available.\n\t\t\tif( config.history ) {\n\t\t\t\twindow.location.hash = hash;\n\t\t\t}\n\t\t\t// If we're configured to reflect the current slide in the\n\t\t\t// URL without pushing to history.\n\t\t\telse if( config.hash ) {\n\t\t\t\t// If the hash is empty, don't add it to the URL\n\t\t\t\tif( hash === '/' ) {\n\t\t\t\t\tthis.debouncedReplaceState( window.location.pathname + window.location.search );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.debouncedReplaceState( '#' + hash );\n\t\t\t\t}\n\t\t\t}\n\t\t\t// UPDATE: The below nuking of all hash changes breaks\n\t\t\t// anchors on pages where reveal.js is running. Removed\n\t\t\t// in 4.0. Why was it here in the first place? ¯\\_(ツ)_/¯\n\t\t\t//\n\t\t\t// If history and hash are both disabled, a hash may still\n\t\t\t// be added to the URL by clicking on a href with a hash\n\t\t\t// target. Counter this by always removing the hash.\n\t\t\t// else {\n\t\t\t// \twindow.history.replaceState( null, null, window.location.pathname + window.location.search );\n\t\t\t// }\n\n\t\t}\n\n\t}\n\n\treplaceState( url ) {\n\n\t\twindow.history.replaceState( null, null, url );\n\t\tthis.replaceStateTimestamp = Date.now();\n\n\t}\n\n\tdebouncedReplaceState( url ) {\n\n\t\tclearTimeout( this.replaceStateTimeout );\n\n\t\tif( Date.now() - this.replaceStateTimestamp > this.MAX_REPLACE_STATE_FREQUENCY ) {\n\t\t\tthis.replaceState( url );\n\t\t}\n\t\telse {\n\t\t\tthis.replaceStateTimeout = setTimeout( () => this.replaceState( url ), this.MAX_REPLACE_STATE_FREQUENCY );\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a hash URL that will resolve to the given slide location.\n\t *\n\t * @param {HTMLElement} [slide=currentSlide] The slide to link to\n\t */\n\tgetHash( slide ) {\n\n\t\tlet url = '/';\n\n\t\t// Attempt to create a named link based on the slide's ID\n\t\tlet s = slide || this.Reveal.getCurrentSlide();\n\t\tlet id = s ? s.getAttribute( 'id' ) : null;\n\t\tif( id ) {\n\t\t\tid = encodeURIComponent( id );\n\t\t}\n\n\t\tlet index = this.Reveal.getIndices( slide );\n\t\tif( !this.Reveal.getConfig().fragmentInURL ) {\n\t\t\tindex.f = undefined;\n\t\t}\n\n\t\t// If the current slide has an ID, use that as a named link,\n\t\t// but we don't support named links with a fragment index\n\t\tif( typeof id === 'string' && id.length ) {\n\t\t\turl = '/' + id;\n\n\t\t\t// If there is also a fragment, append that at the end\n\t\t\t// of the named link, like: #/named-link/2\n\t\t\tif( index.f >= 0 ) url += '/' + index.f;\n\t\t}\n\t\t// Otherwise use the /h/v index\n\t\telse {\n\t\t\tlet hashIndexBase = this.Reveal.getConfig().hashOneBasedIndex ? 1 : 0;\n\t\t\tif( index.h > 0 || index.v > 0 || index.f >= 0 ) url += index.h + hashIndexBase;\n\t\t\tif( index.v > 0 || index.f >= 0 ) url += '/' + (index.v + hashIndexBase );\n\t\t\tif( index.f >= 0 ) url += '/' + index.f;\n\t\t}\n\n\t\treturn url;\n\n\t}\n\n\t/**\n\t * Handler for the window level 'hashchange' event.\n\t *\n\t * @param {object} [event]\n\t */\n\tonWindowHashChange( event ) {\n\n\t\tthis.readURL();\n\n\t}\n\n}","import { queryAll } from '../utils/util.js'\nimport { isAndroid } from '../utils/device.js'\n\n/**\n * Manages our presentation controls. This includes both\n * the built-in control arrows as well as event monitoring\n * of any elements within the presentation with either of the\n * following helper classes:\n * - .navigate-up\n * - .navigate-right\n * - .navigate-down\n * - .navigate-left\n * - .navigate-next\n * - .navigate-prev\n */\nexport default class Controls {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onNavigateLeftClicked = this.onNavigateLeftClicked.bind( this );\n\t\tthis.onNavigateRightClicked = this.onNavigateRightClicked.bind( this );\n\t\tthis.onNavigateUpClicked = this.onNavigateUpClicked.bind( this );\n\t\tthis.onNavigateDownClicked = this.onNavigateDownClicked.bind( this );\n\t\tthis.onNavigatePrevClicked = this.onNavigatePrevClicked.bind( this );\n\t\tthis.onNavigateNextClicked = this.onNavigateNextClicked.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tconst rtl = this.Reveal.getConfig().rtl;\n\t\tconst revealElement = this.Reveal.getRevealElement();\n\n\t\tthis.element = document.createElement( 'aside' );\n\t\tthis.element.className = 'controls';\n\t\tthis.element.innerHTML =\n\t\t\t`\n\t\t\t\n\t\t\t\n\t\t\t`;\n\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t\t// There can be multiple instances of controls throughout the page\n\t\tthis.controlsLeft = queryAll( revealElement, '.navigate-left' );\n\t\tthis.controlsRight = queryAll( revealElement, '.navigate-right' );\n\t\tthis.controlsUp = queryAll( revealElement, '.navigate-up' );\n\t\tthis.controlsDown = queryAll( revealElement, '.navigate-down' );\n\t\tthis.controlsPrev = queryAll( revealElement, '.navigate-prev' );\n\t\tthis.controlsNext = queryAll( revealElement, '.navigate-next' );\n\n\t\t// The left, right and down arrows in the standard reveal.js controls\n\t\tthis.controlsRightArrow = this.element.querySelector( '.navigate-right' );\n\t\tthis.controlsLeftArrow = this.element.querySelector( '.navigate-left' );\n\t\tthis.controlsDownArrow = this.element.querySelector( '.navigate-down' );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tthis.element.style.display = config.controls ? 'block' : 'none';\n\n\t\tthis.element.setAttribute( 'data-controls-layout', config.controlsLayout );\n\t\tthis.element.setAttribute( 'data-controls-back-arrows', config.controlsBackArrows );\n\n\t}\n\n\tbind() {\n\n\t\t// Listen to both touch and click events, in case the device\n\t\t// supports both\n\t\tlet pointerEvents = [ 'touchstart', 'click' ];\n\n\t\t// Only support touch for Android, fixes double navigations in\n\t\t// stock browser\n\t\tif( isAndroid ) {\n\t\t\tpointerEvents = [ 'touchstart' ];\n\t\t}\n\n\t\tpointerEvents.forEach( eventName => {\n\t\t\tthis.controlsLeft.forEach( el => el.addEventListener( eventName, this.onNavigateLeftClicked, false ) );\n\t\t\tthis.controlsRight.forEach( el => el.addEventListener( eventName, this.onNavigateRightClicked, false ) );\n\t\t\tthis.controlsUp.forEach( el => el.addEventListener( eventName, this.onNavigateUpClicked, false ) );\n\t\t\tthis.controlsDown.forEach( el => el.addEventListener( eventName, this.onNavigateDownClicked, false ) );\n\t\t\tthis.controlsPrev.forEach( el => el.addEventListener( eventName, this.onNavigatePrevClicked, false ) );\n\t\t\tthis.controlsNext.forEach( el => el.addEventListener( eventName, this.onNavigateNextClicked, false ) );\n\t\t} );\n\n\t}\n\n\tunbind() {\n\n\t\t[ 'touchstart', 'click' ].forEach( eventName => {\n\t\t\tthis.controlsLeft.forEach( el => el.removeEventListener( eventName, this.onNavigateLeftClicked, false ) );\n\t\t\tthis.controlsRight.forEach( el => el.removeEventListener( eventName, this.onNavigateRightClicked, false ) );\n\t\t\tthis.controlsUp.forEach( el => el.removeEventListener( eventName, this.onNavigateUpClicked, false ) );\n\t\t\tthis.controlsDown.forEach( el => el.removeEventListener( eventName, this.onNavigateDownClicked, false ) );\n\t\t\tthis.controlsPrev.forEach( el => el.removeEventListener( eventName, this.onNavigatePrevClicked, false ) );\n\t\t\tthis.controlsNext.forEach( el => el.removeEventListener( eventName, this.onNavigateNextClicked, false ) );\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates the state of all control/navigation arrows.\n\t */\n\tupdate() {\n\n\t\tlet routes = this.Reveal.availableRoutes();\n\n\t\t// Remove the 'enabled' class from all directions\n\t\t[...this.controlsLeft, ...this.controlsRight, ...this.controlsUp, ...this.controlsDown, ...this.controlsPrev, ...this.controlsNext].forEach( node => {\n\t\t\tnode.classList.remove( 'enabled', 'fragmented' );\n\n\t\t\t// Set 'disabled' attribute on all directions\n\t\t\tnode.setAttribute( 'disabled', 'disabled' );\n\t\t} );\n\n\t\t// Add the 'enabled' class to the available routes; remove 'disabled' attribute to enable buttons\n\t\tif( routes.left ) this.controlsLeft.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.right ) this.controlsRight.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.up ) this.controlsUp.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.down ) this.controlsDown.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t// Prev/next buttons\n\t\tif( routes.left || routes.up ) this.controlsPrev.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\tif( routes.right || routes.down ) this.controlsNext.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t// Highlight fragment directions\n\t\tlet currentSlide = this.Reveal.getCurrentSlide();\n\t\tif( currentSlide ) {\n\n\t\t\tlet fragmentsRoutes = this.Reveal.fragments.availableRoutes();\n\n\t\t\t// Always apply fragment decorator to prev/next buttons\n\t\t\tif( fragmentsRoutes.prev ) this.controlsPrev.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\tif( fragmentsRoutes.next ) this.controlsNext.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\n\t\t\t// Apply fragment decorators to directional buttons based on\n\t\t\t// what slide axis they are in\n\t\t\tif( this.Reveal.isVerticalSlide( currentSlide ) ) {\n\t\t\t\tif( fragmentsRoutes.prev ) this.controlsUp.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t\tif( fragmentsRoutes.next ) this.controlsDown.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif( fragmentsRoutes.prev ) this.controlsLeft.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t\tif( fragmentsRoutes.next ) this.controlsRight.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );\n\t\t\t}\n\n\t\t}\n\n\t\tif( this.Reveal.getConfig().controlsTutorial ) {\n\n\t\t\tlet indices = this.Reveal.getIndices();\n\n\t\t\t// Highlight control arrows with an animation to ensure\n\t\t\t// that the viewer knows how to navigate\n\t\t\tif( !this.Reveal.hasNavigatedVertically() && routes.down ) {\n\t\t\t\tthis.controlsDownArrow.classList.add( 'highlight' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.controlsDownArrow.classList.remove( 'highlight' );\n\n\t\t\t\tif( this.Reveal.getConfig().rtl ) {\n\n\t\t\t\t\tif( !this.Reveal.hasNavigatedHorizontally() && routes.left && indices.v === 0 ) {\n\t\t\t\t\t\tthis.controlsLeftArrow.classList.add( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.controlsLeftArrow.classList.remove( 'highlight' );\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif( !this.Reveal.hasNavigatedHorizontally() && routes.right && indices.v === 0 ) {\n\t\t\t\t\t\tthis.controlsRightArrow.classList.add( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.controlsRightArrow.classList.remove( 'highlight' );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy() {\n\n\t\tthis.unbind();\n\t\tthis.element.remove();\n\n\t}\n\n\t/**\n\t * Event handlers for navigation control buttons.\n\t */\n\tonNavigateLeftClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tif( this.Reveal.getConfig().navigationMode === 'linear' ) {\n\t\t\tthis.Reveal.prev();\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.left();\n\t\t}\n\n\t}\n\n\tonNavigateRightClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tif( this.Reveal.getConfig().navigationMode === 'linear' ) {\n\t\t\tthis.Reveal.next();\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.right();\n\t\t}\n\n\t}\n\n\tonNavigateUpClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.up();\n\n\t}\n\n\tonNavigateDownClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.down();\n\n\t}\n\n\tonNavigatePrevClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.prev();\n\n\t}\n\n\tonNavigateNextClicked( event ) {\n\n\t\tevent.preventDefault();\n\t\tthis.Reveal.onUserInput();\n\n\t\tthis.Reveal.next();\n\n\t}\n\n\n}","/**\n * Creates a visual progress bar for the presentation.\n */\nexport default class Progress {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onProgressClicked = this.onProgressClicked.bind( this );\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'progress';\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t\tthis.bar = document.createElement( 'span' );\n\t\tthis.element.appendChild( this.bar );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tthis.element.style.display = config.progress ? 'block' : 'none';\n\n\t}\n\n\tbind() {\n\n\t\tif( this.Reveal.getConfig().progress && this.element ) {\n\t\t\tthis.element.addEventListener( 'click', this.onProgressClicked, false );\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tif ( this.Reveal.getConfig().progress && this.element ) {\n\t\t\tthis.element.removeEventListener( 'click', this.onProgressClicked, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the progress bar to reflect the current slide.\n\t */\n\tupdate() {\n\n\t\t// Update progress if enabled\n\t\tif( this.Reveal.getConfig().progress && this.bar ) {\n\n\t\t\tlet scale = this.Reveal.getProgress();\n\n\t\t\t// Don't fill the progress bar if there's only one slide\n\t\t\tif( this.Reveal.getTotalSlides() < 2 ) {\n\t\t\t\tscale = 0;\n\t\t\t}\n\n\t\t\tthis.bar.style.transform = 'scaleX('+ scale +')';\n\n\t\t}\n\n\t}\n\n\tgetMaxWidth() {\n\n\t\treturn this.Reveal.getRevealElement().offsetWidth;\n\n\t}\n\n\t/**\n\t * Clicking on the progress bar results in a navigation to the\n\t * closest approximate horizontal slide using this equation:\n\t *\n\t * ( clickX / presentationWidth ) * numberOfSlides\n\t *\n\t * @param {object} event\n\t */\n\tonProgressClicked( event ) {\n\n\t\tthis.Reveal.onUserInput( event );\n\n\t\tevent.preventDefault();\n\n\t\tlet slides = this.Reveal.getSlides();\n\t\tlet slidesTotal = slides.length;\n\t\tlet slideIndex = Math.floor( ( event.clientX / this.getMaxWidth() ) * slidesTotal );\n\n\t\tif( this.Reveal.getConfig().rtl ) {\n\t\t\tslideIndex = slidesTotal - slideIndex;\n\t\t}\n\n\t\tlet targetIndices = this.Reveal.getIndices(slides[slideIndex]);\n\t\tthis.Reveal.slide( targetIndices.h, targetIndices.v );\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}","/**\n * Handles hiding of the pointer/cursor when inactive.\n */\nexport default class Pointer {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Throttles mouse wheel navigation\n\t\tthis.lastMouseWheelStep = 0;\n\n\t\t// Is the mouse pointer currently hidden from view\n\t\tthis.cursorHidden = false;\n\n\t\t// Timeout used to determine when the cursor is inactive\n\t\tthis.cursorInactiveTimeout = 0;\n\n\t\tthis.onDocumentCursorActive = this.onDocumentCursorActive.bind( this );\n\t\tthis.onDocumentMouseScroll = this.onDocumentMouseScroll.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.mouseWheel ) {\n\t\t\tdocument.addEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\t}\n\t\telse {\n\t\t\tdocument.removeEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\t}\n\n\t\t// Auto-hide the mouse pointer when its inactive\n\t\tif( config.hideInactiveCursor ) {\n\t\t\tdocument.addEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\t\tdocument.addEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\t\t}\n\t\telse {\n\t\t\tthis.showCursor();\n\n\t\t\tdocument.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\t\tdocument.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\t\t}\n\n\t}\n\n\t/**\n\t * Shows the mouse pointer after it has been hidden with\n\t * #hideCursor.\n\t */\n\tshowCursor() {\n\n\t\tif( this.cursorHidden ) {\n\t\t\tthis.cursorHidden = false;\n\t\t\tthis.Reveal.getRevealElement().style.cursor = '';\n\t\t}\n\n\t}\n\n\t/**\n\t * Hides the mouse pointer when it's on top of the .reveal\n\t * container.\n\t */\n\thideCursor() {\n\n\t\tif( this.cursorHidden === false ) {\n\t\t\tthis.cursorHidden = true;\n\t\t\tthis.Reveal.getRevealElement().style.cursor = 'none';\n\t\t}\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.showCursor();\n\n\t\tdocument.removeEventListener( 'wheel', this.onDocumentMouseScroll, false );\n\t\tdocument.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );\n\t\tdocument.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );\n\n\t}\n\n\t/**\n\t * Called whenever there is mouse input at the document level\n\t * to determine if the cursor is active or not.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentCursorActive( event ) {\n\n\t\tthis.showCursor();\n\n\t\tclearTimeout( this.cursorInactiveTimeout );\n\n\t\tthis.cursorInactiveTimeout = setTimeout( this.hideCursor.bind( this ), this.Reveal.getConfig().hideCursorTime );\n\n\t}\n\n\t/**\n\t * Handles mouse wheel scrolling, throttled to avoid skipping\n\t * multiple slides.\n\t *\n\t * @param {object} event\n\t */\n\tonDocumentMouseScroll( event ) {\n\n\t\tif( Date.now() - this.lastMouseWheelStep > 1000 ) {\n\n\t\t\tthis.lastMouseWheelStep = Date.now();\n\n\t\t\tlet delta = event.detail || -event.wheelDelta;\n\t\t\tif( delta > 0 ) {\n\t\t\t\tthis.Reveal.next();\n\t\t\t}\n\t\t\telse if( delta < 0 ) {\n\t\t\t\tthis.Reveal.prev();\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n","/**\n * Loads a JavaScript file from the given URL and executes it.\n *\n * @param {string} url Address of the .js file to load\n * @param {function} callback Method to invoke when the script\n * has loaded and executed\n */\nexport const loadScript = ( url, callback ) => {\n\n\tconst script = document.createElement( 'script' );\n\tscript.type = 'text/javascript';\n\tscript.async = false;\n\tscript.defer = false;\n\tscript.src = url;\n\n\tif( typeof callback === 'function' ) {\n\n\t\t// Success callback\n\t\tscript.onload = script.onreadystatechange = event => {\n\t\t\tif( event.type === 'load' || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t// Kill event listeners\n\t\t\t\tscript.onload = script.onreadystatechange = script.onerror = null;\n\n\t\t\t\tcallback();\n\n\t\t\t}\n\t\t};\n\n\t\t// Error callback\n\t\tscript.onerror = err => {\n\n\t\t\t// Kill event listeners\n\t\t\tscript.onload = script.onreadystatechange = script.onerror = null;\n\n\t\t\tcallback( new Error( 'Failed loading script: ' + script.src + '\\n' + err ) );\n\n\t\t};\n\n\t}\n\n\t// Append the script at the end of \n\tconst head = document.querySelector( 'head' );\n\thead.insertBefore( script, head.lastChild );\n\n}","import { loadScript } from '../utils/loader.js'\n\n/**\n * Manages loading and registering of reveal.js plugins.\n */\nexport default class Plugins {\n\n\tconstructor( reveal ) {\n\n\t\tthis.Reveal = reveal;\n\n\t\t// Flags our current state (idle -> loading -> loaded)\n\t\tthis.state = 'idle';\n\n\t\t// An id:instance map of currently registered plugins\n\t\tthis.registeredPlugins = {};\n\n\t\tthis.asyncDependencies = [];\n\n\t}\n\n\t/**\n\t * Loads reveal.js dependencies, registers and\n\t * initializes plugins.\n\t *\n\t * Plugins are direct references to a reveal.js plugin\n\t * object that we register and initialize after any\n\t * synchronous dependencies have loaded.\n\t *\n\t * Dependencies are defined via the 'dependencies' config\n\t * option and will be loaded prior to starting reveal.js.\n\t * Some dependencies may have an 'async' flag, if so they\n\t * will load after reveal.js has been started up.\n\t */\n\tload( plugins, dependencies ) {\n\n\t\tthis.state = 'loading';\n\n\t\tplugins.forEach( this.registerPlugin.bind( this ) );\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tlet scripts = [],\n\t\t\t\tscriptsToLoad = 0;\n\n\t\t\tdependencies.forEach( s => {\n\t\t\t\t// Load if there's no condition or the condition is truthy\n\t\t\t\tif( !s.condition || s.condition() ) {\n\t\t\t\t\tif( s.async ) {\n\t\t\t\t\t\tthis.asyncDependencies.push( s );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tscripts.push( s );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif( scripts.length ) {\n\t\t\t\tscriptsToLoad = scripts.length;\n\n\t\t\t\tconst scriptLoadedCallback = (s) => {\n\t\t\t\t\tif( s && typeof s.callback === 'function' ) s.callback();\n\n\t\t\t\t\tif( --scriptsToLoad === 0 ) {\n\t\t\t\t\t\tthis.initPlugins().then( resolve );\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Load synchronous scripts\n\t\t\t\tscripts.forEach( s => {\n\t\t\t\t\tif( typeof s.id === 'string' ) {\n\t\t\t\t\t\tthis.registerPlugin( s );\n\t\t\t\t\t\tscriptLoadedCallback( s );\n\t\t\t\t\t}\n\t\t\t\t\telse if( typeof s.src === 'string' ) {\n\t\t\t\t\t\tloadScript( s.src, () => scriptLoadedCallback(s) );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.warn( 'Unrecognized plugin format', s );\n\t\t\t\t\t\tscriptLoadedCallback();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.initPlugins().then( resolve );\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Initializes our plugins and waits for them to be ready\n\t * before proceeding.\n\t */\n\tinitPlugins() {\n\n\t\treturn new Promise( resolve => {\n\n\t\t\tlet pluginValues = Object.values( this.registeredPlugins );\n\t\t\tlet pluginsToInitialize = pluginValues.length;\n\n\t\t\t// If there are no plugins, skip this step\n\t\t\tif( pluginsToInitialize === 0 ) {\n\t\t\t\tthis.loadAsync().then( resolve );\n\t\t\t}\n\t\t\t// ... otherwise initialize plugins\n\t\t\telse {\n\n\t\t\t\tlet initNextPlugin;\n\n\t\t\t\tlet afterPlugInitialized = () => {\n\t\t\t\t\tif( --pluginsToInitialize === 0 ) {\n\t\t\t\t\t\tthis.loadAsync().then( resolve );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tinitNextPlugin();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tlet i = 0;\n\n\t\t\t\t// Initialize plugins serially\n\t\t\t\tinitNextPlugin = () => {\n\n\t\t\t\t\tlet plugin = pluginValues[i++];\n\n\t\t\t\t\t// If the plugin has an 'init' method, invoke it\n\t\t\t\t\tif( typeof plugin.init === 'function' ) {\n\t\t\t\t\t\tlet promise = plugin.init( this.Reveal );\n\n\t\t\t\t\t\t// If the plugin returned a Promise, wait for it\n\t\t\t\t\t\tif( promise && typeof promise.then === 'function' ) {\n\t\t\t\t\t\t\tpromise.then( afterPlugInitialized );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tafterPlugInitialized();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tafterPlugInitialized();\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tinitNextPlugin();\n\n\t\t\t}\n\n\t\t} )\n\n\t}\n\n\t/**\n\t * Loads all async reveal.js dependencies.\n\t */\n\tloadAsync() {\n\n\t\tthis.state = 'loaded';\n\n\t\tif( this.asyncDependencies.length ) {\n\t\t\tthis.asyncDependencies.forEach( s => {\n\t\t\t\tloadScript( s.src, s.callback );\n\t\t\t} );\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n\t/**\n\t * Registers a new plugin with this reveal.js instance.\n\t *\n\t * reveal.js waits for all registered plugins to initialize\n\t * before considering itself ready, as long as the plugin\n\t * is registered before calling `Reveal.initialize()`.\n\t */\n\tregisterPlugin( plugin ) {\n\n\t\t// Backwards compatibility to make reveal.js ~3.9.0\n\t\t// plugins work with reveal.js 4.0.0\n\t\tif( arguments.length === 2 && typeof arguments[0] === 'string' ) {\n\t\t\tplugin = arguments[1];\n\t\t\tplugin.id = arguments[0];\n\t\t}\n\t\t// Plugin can optionally be a function which we call\n\t\t// to create an instance of the plugin\n\t\telse if( typeof plugin === 'function' ) {\n\t\t\tplugin = plugin();\n\t\t}\n\n\t\tlet id = plugin.id;\n\n\t\tif( typeof id !== 'string' ) {\n\t\t\tconsole.warn( 'Unrecognized plugin format; can\\'t find plugin.id', plugin );\n\t\t}\n\t\telse if( this.registeredPlugins[id] === undefined ) {\n\t\t\tthis.registeredPlugins[id] = plugin;\n\n\t\t\t// If a plugin is registered after reveal.js is loaded,\n\t\t\t// initialize it right away\n\t\t\tif( this.state === 'loaded' && typeof plugin.init === 'function' ) {\n\t\t\t\tplugin.init( this.Reveal );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconsole.warn( 'reveal.js: \"'+ id +'\" plugin has already been registered' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if a specific plugin has been registered.\n\t *\n\t * @param {String} id Unique plugin identifier\n\t */\n\thasPlugin( id ) {\n\n\t\treturn !!this.registeredPlugins[id];\n\n\t}\n\n\t/**\n\t * Returns the specific plugin instance, if a plugin\n\t * with the given ID has been registered.\n\t *\n\t * @param {String} id Unique plugin identifier\n\t */\n\tgetPlugin( id ) {\n\n\t\treturn this.registeredPlugins[id];\n\n\t}\n\n\tgetRegisteredPlugins() {\n\n\t\treturn this.registeredPlugins;\n\n\t}\n\n\tdestroy() {\n\n\t\tObject.values( this.registeredPlugins ).forEach( plugin => {\n\t\t\tif( typeof plugin.destroy === 'function' ) {\n\t\t\t\tplugin.destroy();\n\t\t\t}\n\t\t} );\n\n\t\tthis.registeredPlugins = {};\n\t\tthis.asyncDependencies = [];\n\n\t}\n\n}\n","import { isAndroid } from '../utils/device.js'\nimport { matches } from '../utils/util.js'\n\nconst SWIPE_THRESHOLD = 40;\n\n/**\n * Controls all touch interactions and navigations for\n * a presentation.\n */\nexport default class Touch {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\t// Holds information about the currently ongoing touch interaction\n\t\tthis.touchStartX = 0;\n\t\tthis.touchStartY = 0;\n\t\tthis.touchStartCount = 0;\n\t\tthis.touchCaptured = false;\n\n\t\tthis.onPointerDown = this.onPointerDown.bind( this );\n\t\tthis.onPointerMove = this.onPointerMove.bind( this );\n\t\tthis.onPointerUp = this.onPointerUp.bind( this );\n\t\tthis.onTouchStart = this.onTouchStart.bind( this );\n\t\tthis.onTouchMove = this.onTouchMove.bind( this );\n\t\tthis.onTouchEnd = this.onTouchEnd.bind( this );\n\n\t}\n\n\t/**\n\t *\n\t */\n\tbind() {\n\n\t\tlet revealElement = this.Reveal.getRevealElement();\n\n\t\tif( 'onpointerdown' in window ) {\n\t\t\t// Use W3C pointer events\n\t\t\trevealElement.addEventListener( 'pointerdown', this.onPointerDown, false );\n\t\t\trevealElement.addEventListener( 'pointermove', this.onPointerMove, false );\n\t\t\trevealElement.addEventListener( 'pointerup', this.onPointerUp, false );\n\t\t}\n\t\telse if( window.navigator.msPointerEnabled ) {\n\t\t\t// IE 10 uses prefixed version of pointer events\n\t\t\trevealElement.addEventListener( 'MSPointerDown', this.onPointerDown, false );\n\t\t\trevealElement.addEventListener( 'MSPointerMove', this.onPointerMove, false );\n\t\t\trevealElement.addEventListener( 'MSPointerUp', this.onPointerUp, false );\n\t\t}\n\t\telse {\n\t\t\t// Fall back to touch events\n\t\t\trevealElement.addEventListener( 'touchstart', this.onTouchStart, false );\n\t\t\trevealElement.addEventListener( 'touchmove', this.onTouchMove, false );\n\t\t\trevealElement.addEventListener( 'touchend', this.onTouchEnd, false );\n\t\t}\n\n\t}\n\n\t/**\n\t *\n\t */\n\tunbind() {\n\n\t\tlet revealElement = this.Reveal.getRevealElement();\n\n\t\trevealElement.removeEventListener( 'pointerdown', this.onPointerDown, false );\n\t\trevealElement.removeEventListener( 'pointermove', this.onPointerMove, false );\n\t\trevealElement.removeEventListener( 'pointerup', this.onPointerUp, false );\n\n\t\trevealElement.removeEventListener( 'MSPointerDown', this.onPointerDown, false );\n\t\trevealElement.removeEventListener( 'MSPointerMove', this.onPointerMove, false );\n\t\trevealElement.removeEventListener( 'MSPointerUp', this.onPointerUp, false );\n\n\t\trevealElement.removeEventListener( 'touchstart', this.onTouchStart, false );\n\t\trevealElement.removeEventListener( 'touchmove', this.onTouchMove, false );\n\t\trevealElement.removeEventListener( 'touchend', this.onTouchEnd, false );\n\n\t}\n\n\t/**\n\t * Checks if the target element prevents the triggering of\n\t * swipe navigation.\n\t */\n\tisSwipePrevented( target ) {\n\n\t\t// Prevent accidental swipes when scrubbing timelines\n\t\tif( matches( target, 'video, audio' ) ) return true;\n\n\t\twhile( target && typeof target.hasAttribute === 'function' ) {\n\t\t\tif( target.hasAttribute( 'data-prevent-swipe' ) ) return true;\n\t\t\ttarget = target.parentNode;\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Handler for the 'touchstart' event, enables support for\n\t * swipe and pinch gestures.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchStart( event ) {\n\n\t\tif( this.isSwipePrevented( event.target ) ) return true;\n\n\t\tthis.touchStartX = event.touches[0].clientX;\n\t\tthis.touchStartY = event.touches[0].clientY;\n\t\tthis.touchStartCount = event.touches.length;\n\n\t}\n\n\t/**\n\t * Handler for the 'touchmove' event.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchMove( event ) {\n\n\t\tif( this.isSwipePrevented( event.target ) ) return true;\n\n\t\tlet config = this.Reveal.getConfig();\n\n\t\t// Each touch should only trigger one action\n\t\tif( !this.touchCaptured ) {\n\t\t\tthis.Reveal.onUserInput( event );\n\n\t\t\tlet currentX = event.touches[0].clientX;\n\t\t\tlet currentY = event.touches[0].clientY;\n\n\t\t\t// There was only one touch point, look for a swipe\n\t\t\tif( event.touches.length === 1 && this.touchStartCount !== 2 ) {\n\n\t\t\t\tlet availableRoutes = this.Reveal.availableRoutes({ includeFragments: true });\n\n\t\t\t\tlet deltaX = currentX - this.touchStartX,\n\t\t\t\t\tdeltaY = currentY - this.touchStartY;\n\n\t\t\t\tif( deltaX > SWIPE_THRESHOLD && Math.abs( deltaX ) > Math.abs( deltaY ) ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.left();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaX < -SWIPE_THRESHOLD && Math.abs( deltaX ) > Math.abs( deltaY ) ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tif( config.rtl ) {\n\t\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.right();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaY > SWIPE_THRESHOLD && availableRoutes.up ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tthis.Reveal.prev();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.up();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if( deltaY < -SWIPE_THRESHOLD && availableRoutes.down ) {\n\t\t\t\t\tthis.touchCaptured = true;\n\t\t\t\t\tif( config.navigationMode === 'linear' ) {\n\t\t\t\t\t\tthis.Reveal.next();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.Reveal.down();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If we're embedded, only block touch events if they have\n\t\t\t\t// triggered an action\n\t\t\t\tif( config.embedded ) {\n\t\t\t\t\tif( this.touchCaptured || this.Reveal.isVerticalSlide() ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Not embedded? Block them all to avoid needless tossing\n\t\t\t\t// around of the viewport in iOS\n\t\t\t\telse {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\t// There's a bug with swiping on some Android devices unless\n\t\t// the default action is always prevented\n\t\telse if( isAndroid ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\n\t}\n\n\t/**\n\t * Handler for the 'touchend' event.\n\t *\n\t * @param {object} event\n\t */\n\tonTouchEnd( event ) {\n\n\t\tthis.touchCaptured = false;\n\n\t}\n\n\t/**\n\t * Convert pointer down to touch start.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerDown( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchStart( event );\n\t\t}\n\n\t}\n\n\t/**\n\t * Convert pointer move to touch move.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerMove( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchMove( event );\n\t\t}\n\n\t}\n\n\t/**\n\t * Convert pointer up to touch end.\n\t *\n\t * @param {object} event\n\t */\n\tonPointerUp( event ) {\n\n\t\tif( event.pointerType === event.MSPOINTER_TYPE_TOUCH || event.pointerType === \"touch\" ) {\n\t\t\tevent.touches = [{ clientX: event.clientX, clientY: event.clientY }];\n\t\t\tthis.onTouchEnd( event );\n\t\t}\n\n\t}\n\n}","import { closest } from '../utils/util.js'\n\n/**\n * Manages focus when a presentation is embedded. This\n * helps us only capture keyboard from the presentation\n * a user is currently interacting with in a page where\n * multiple presentations are embedded.\n */\n\nconst STATE_FOCUS = 'focus';\nconst STATE_BLUR = 'blur';\n\nexport default class Focus {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t\tthis.onRevealPointerDown = this.onRevealPointerDown.bind( this );\n\t\tthis.onDocumentPointerDown = this.onDocumentPointerDown.bind( this );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.embedded ) {\n\t\t\tthis.blur();\n\t\t}\n\t\telse {\n\t\t\tthis.focus();\n\t\t\tthis.unbind();\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tif( this.Reveal.getConfig().embedded ) {\n\t\t\tthis.Reveal.getRevealElement().addEventListener( 'pointerdown', this.onRevealPointerDown, false );\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tthis.Reveal.getRevealElement().removeEventListener( 'pointerdown', this.onRevealPointerDown, false );\n\t\tdocument.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\n\t}\n\n\tfocus() {\n\n\t\tif( this.state !== STATE_FOCUS ) {\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'focused' );\n\t\t\tdocument.addEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\t\t}\n\n\t\tthis.state = STATE_FOCUS;\n\n\t}\n\n\tblur() {\n\n\t\tif( this.state !== STATE_BLUR ) {\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'focused' );\n\t\t\tdocument.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );\n\t\t}\n\n\t\tthis.state = STATE_BLUR;\n\n\t}\n\n\tisFocused() {\n\n\t\treturn this.state === STATE_FOCUS;\n\n\t}\n\n\tdestroy() {\n\n\t\tthis.Reveal.getRevealElement().classList.remove( 'focused' );\n\n\t}\n\n\tonRevealPointerDown( event ) {\n\n\t\tthis.focus();\n\n\t}\n\n\tonDocumentPointerDown( event ) {\n\n\t\tlet revealElement = closest( event.target, '.reveal' );\n\t\tif( !revealElement || revealElement !== this.Reveal.getRevealElement() ) {\n\t\t\tthis.blur();\n\t\t}\n\n\t}\n\n}","/**\n * Handles the showing of speaker notes\n */\nexport default class Notes {\n\n\tconstructor( Reveal ) {\n\n\t\tthis.Reveal = Reveal;\n\n\t}\n\n\trender() {\n\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.className = 'speaker-notes';\n\t\tthis.element.setAttribute( 'data-prevent-swipe', '' );\n\t\tthis.element.setAttribute( 'tabindex', '0' );\n\t\tthis.Reveal.getRevealElement().appendChild( this.element );\n\n\t}\n\n\t/**\n\t * Called when the reveal.js config is updated.\n\t */\n\tconfigure( config, oldConfig ) {\n\n\t\tif( config.showNotes ) {\n\t\t\tthis.element.setAttribute( 'data-layout', typeof config.showNotes === 'string' ? config.showNotes : 'inline' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Pick up notes from the current slide and display them\n\t * to the viewer.\n\t *\n\t * @see {@link config.showNotes}\n\t */\n\tupdate() {\n\n\t\tif( this.Reveal.getConfig().showNotes &&\n\t\t\tthis.element && this.Reveal.getCurrentSlide() &&\n\t\t\t!this.Reveal.isScrollView() &&\n\t\t\t!this.Reveal.isPrintView()\n\t\t) {\n\t\t\tthis.element.innerHTML = this.getSlideNotes() || 'No notes on this slide.';\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the visibility of the speaker notes sidebar that\n\t * is used to share annotated slides. The notes sidebar is\n\t * only visible if showNotes is true and there are notes on\n\t * one or more slides in the deck.\n\t */\n\tupdateVisibility() {\n\n\t\tif( this.Reveal.getConfig().showNotes &&\n\t\t\tthis.hasNotes() &&\n\t\t\t!this.Reveal.isScrollView() &&\n\t\t\t!this.Reveal.isPrintView()\n\t\t) {\n\t\t\tthis.Reveal.getRevealElement().classList.add( 'show-notes' );\n\t\t}\n\t\telse {\n\t\t\tthis.Reveal.getRevealElement().classList.remove( 'show-notes' );\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if there are speaker notes for ANY slide in the\n\t * presentation.\n\t */\n\thasNotes() {\n\n\t\treturn this.Reveal.getSlidesElement().querySelectorAll( '[data-notes], aside.notes' ).length > 0;\n\n\t}\n\n\t/**\n\t * Checks if this presentation is running inside of the\n\t * speaker notes window.\n\t *\n\t * @return {boolean}\n\t */\n\tisSpeakerNotesWindow() {\n\n\t\treturn !!window.location.search.match( /receiver/gi );\n\n\t}\n\n\t/**\n\t * Retrieves the speaker notes from a slide. Notes can be\n\t * defined in two ways:\n\t * 1. As a data-notes attribute on the slide
\n\t * 2. With

- - reveal.js - -

-
- Slides -