diff --git a/README.md b/README.md index 67ad4d0..b9e527a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,8 @@ # textlab-slides + +## reveal.js converter for Asciidoctor.js + +A reveal.js converter for [Asciidoctor.js](https://github.com/asciidoctor/asciidoctor.js) that transforms an AsciiDoc document into an HTML5 presentation designed to be executed by the [reveal.js](http://lab.hakim.se/reveal-js/) presentation framework. +For setup instructions and the AsciiDoc syntax to use to write a presentation see the module's documentation at [https://github.com/asciidoctor/asciidoctor-reveal.js](https://github.com/asciidoctor/asciidoctor-reveal.js). + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c396246 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +services: + prez: + image: hub.swarmlab.io:5480/textlab-slides + ports: + - "8001:8000" + volumes: + - ./slides/:/opt/slides/ + - ./output/:/opt/output/ + environment: + INDEX: index.html diff --git a/docker-compose.yml.sh b/docker-compose.yml.sh new file mode 100755 index 0000000..e6fb3f1 --- /dev/null +++ b/docker-compose.yml.sh @@ -0,0 +1 @@ +docker compose up -d diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..58c14dc --- /dev/null +++ b/dockerfile @@ -0,0 +1,147 @@ +FROM alpine:3.13 AS base + +ARG asciidoctor_version=2.0.15 +ARG asciidoctor_confluence_version=0.0.2 +ARG asciidoctor_pdf_version=1.6.0 +ARG asciidoctor_diagram_version=2.1.2 +ARG asciidoctor_epub3_version=1.5.1 +ARG asciidoctor_fb2_version=0.5.1 +ARG asciidoctor_mathematical_version=0.3.5 +ARG asciidoctor_revealjs_version=4.1.0 +ARG kramdown_asciidoc_version=1.0.1 +ARG asciidoctor_bibtex_version=0.8.0 + +ENV ASCIIDOCTOR_VERSION=${asciidoctor_version} \ + ASCIIDOCTOR_CONFLUENCE_VERSION=${asciidoctor_confluence_version} \ + ASCIIDOCTOR_PDF_VERSION=${asciidoctor_pdf_version} \ + ASCIIDOCTOR_DIAGRAM_VERSION=${asciidoctor_diagram_version} \ + ASCIIDOCTOR_EPUB3_VERSION=${asciidoctor_epub3_version} \ + ASCIIDOCTOR_FB2_VERSION=${asciidoctor_fb2_version} \ + ASCIIDOCTOR_MATHEMATICAL_VERSION=${asciidoctor_mathematical_version} \ + ASCIIDOCTOR_REVEALJS_VERSION=${asciidoctor_revealjs_version} \ + KRAMDOWN_ASCIIDOC_VERSION=${kramdown_asciidoc_version} \ + ASCIIDOCTOR_BIBTEX_VERSION=${asciidoctor_bibtex_version} + + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# Minimal image with asciidoctor +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + +FROM base AS main-minimal +RUN echo "assemble minimal main image" # keep here to help --cache-from along + +LABEL MAINTAINERS="Guillaume Scheibel , Damien DUPORTAL " + +RUN apk add --no-cache \ + ruby + +RUN gem install --no-document \ + "asciidoctor:${ASCIIDOCTOR_VERSION}" \ + "asciidoctor-pdf:${ASCIIDOCTOR_PDF_VERSION}" + + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# Haskell build for: erd +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + +FROM base AS build-haskell +RUN echo "building Haskell dependencies" # keep here to help --cache-from along + +RUN apk add --no-cache \ + alpine-sdk \ + cabal \ + ghc-dev \ + ghc \ + gmp-dev \ + gnupg \ + libffi-dev \ + linux-headers \ + perl-utils \ + wget \ + xz \ + zlib-dev + +RUN cabal v2-update \ + && cabal v2-install erd + + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# Final image +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + +FROM main-minimal AS main +RUN echo "assemble comprehensive main image" # keep here to help --cache-from along + +LABEL MAINTAINERS="Guillaume Scheibel , Damien DUPORTAL " + +# Installing packagse required for the runtime of +# any of the asciidoctor-* functionalities +RUN apk add --no-cache \ + bash \ + curl \ + ca-certificates \ + findutils \ + font-bakoma-ttf \ + git \ + graphviz \ + inotify-tools \ + make \ + openjdk8-jre \ + python3 \ + py3-pillow \ + py3-setuptools \ + ruby-bigdecimal \ + ruby-mathematical \ + ruby-rake \ + ttf-liberation \ + ttf-dejavu \ + tzdata \ + unzip \ + which \ + font-noto-cjk + +# Installing Ruby Gems for additional functionality +RUN apk add --no-cache --virtual .rubymakedepends \ + build-base \ + libxml2-dev \ + ruby-dev \ + && gem install --no-document \ + "asciidoctor-confluence:${ASCIIDOCTOR_CONFLUENCE_VERSION}" \ + "asciidoctor-diagram:${ASCIIDOCTOR_DIAGRAM_VERSION}" \ + "asciidoctor-epub3:${ASCIIDOCTOR_EPUB3_VERSION}" \ + "asciidoctor-fb2:${ASCIIDOCTOR_FB2_VERSION}" \ + "asciidoctor-mathematical:${ASCIIDOCTOR_MATHEMATICAL_VERSION}" \ + asciimath \ + "asciidoctor-revealjs:${ASCIIDOCTOR_REVEALJS_VERSION}" \ + coderay \ + epubcheck-ruby:4.2.4.0 \ + haml \ + "kramdown-asciidoc:${KRAMDOWN_ASCIIDOC_VERSION}" \ + pygments.rb \ + rouge \ + slim \ + thread_safe \ + tilt \ + text-hyphen \ + "asciidoctor-bibtex:${ASCIIDOCTOR_BIBTEX_VERSION}" \ + && apk del -r --no-cache .rubymakedepends + +# Installing Python dependencies for additional functionality +# such as diagrams (blockdiag) or syntax highligthing +RUN apk add --no-cache --virtual .pythonmakedepends \ + build-base \ + python3-dev \ + py3-pip \ + && pip3 install --no-cache-dir \ + actdiag \ + 'blockdiag[pdf]' \ + nwdiag \ + seqdiag \ + && apk del -r --no-cache .pythonmakedepends + +COPY --from=build-haskell root/.cabal/bin/erd /bin/ + +WORKDIR /documents +VOLUME /documents + +CMD ["/bin/bash"] diff --git a/output/css/a11y-dark.css b/output/css/a11y-dark.css new file mode 100644 index 0000000..5c82c4a --- /dev/null +++ b/output/css/a11y-dark.css @@ -0,0 +1,99 @@ +/* a11y-dark theme */ +/* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */ +/* @author: ericwbailey */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #d4d0ab; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #ffa07a; +} + +/* Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #f5ab35; +} + +/* Yellow */ +.hljs-attribute { + color: #ffd700; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #abe338; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #32aaee; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #dcc6e0; +} + +.hljs { + display: block; + overflow-x: auto; + background: #2b2b2b; + color: #f8f8f2; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +@media screen and (-ms-high-contrast: active) { + .hljs-addition, + .hljs-attribute, + .hljs-built_in, + .hljs-builtin-name, + .hljs-bullet, + .hljs-comment, + .hljs-link, + .hljs-literal, + .hljs-meta, + .hljs-number, + .hljs-params, + .hljs-string, + .hljs-symbol, + .hljs-type, + .hljs-quote { + color: highlight; + } + + .hljs-keyword, + .hljs-selector-tag { + font-weight: bold; + } +} diff --git a/output/css/my-css.css b/output/css/my-css.css new file mode 100644 index 0000000..b102bf5 --- /dev/null +++ b/output/css/my-css.css @@ -0,0 +1,15 @@ + +section.red.background { + background-color: red; +} + +section.small.text { + background-color: "#E1ECF4"; + font-size: 8px; /* Pixels */ +} + +.listsmalltext { + background-color: #E1ECF4; /* Remove quotes around color code */ + font-size: 1px; /* Adjust the size as needed */ +} + diff --git a/output/css/my-theme.css b/output/css/my-theme.css new file mode 100644 index 0000000..d22b86a --- /dev/null +++ b/output/css/my-theme.css @@ -0,0 +1,53 @@ + + +// Base settings for all themes that can optionally be +// overridden by the super-theme + +// Background of the presentation +//$backgroundColor: #E1ECF4; +$backgroundColor: red; + +// // Primary/body text +// $mainFont: 'Lato', sans-serif; +// $mainFontSize: 80px; +// $mainColor: #E1ECF4; +// +// // 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: 7.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/output/css/release-5.1.css b/output/css/release-5.1.css new file mode 100644 index 0000000..6f8d6b2 --- /dev/null +++ b/output/css/release-5.1.css @@ -0,0 +1,7 @@ +h1 { + text-wrap: balance; +} + +.big-fish { + font-size: 3em; +} diff --git a/output/images/swarm.png b/output/images/swarm.png new file mode 100644 index 0000000..0b556b6 Binary files /dev/null and b/output/images/swarm.png differ diff --git a/run-make-on-container.sh b/run-make-on-container.sh new file mode 100755 index 0000000..8f20c02 --- /dev/null +++ b/run-make-on-container.sh @@ -0,0 +1,2 @@ + +docker exec -it textlab-slides-prez-1 bash -c "make" diff --git a/slides/css/a11y-dark.css b/slides/css/a11y-dark.css new file mode 100644 index 0000000..5c82c4a --- /dev/null +++ b/slides/css/a11y-dark.css @@ -0,0 +1,99 @@ +/* a11y-dark theme */ +/* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */ +/* @author: ericwbailey */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #d4d0ab; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #ffa07a; +} + +/* Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #f5ab35; +} + +/* Yellow */ +.hljs-attribute { + color: #ffd700; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #abe338; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #32aaee; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #dcc6e0; +} + +.hljs { + display: block; + overflow-x: auto; + background: #2b2b2b; + color: #f8f8f2; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +@media screen and (-ms-high-contrast: active) { + .hljs-addition, + .hljs-attribute, + .hljs-built_in, + .hljs-builtin-name, + .hljs-bullet, + .hljs-comment, + .hljs-link, + .hljs-literal, + .hljs-meta, + .hljs-number, + .hljs-params, + .hljs-string, + .hljs-symbol, + .hljs-type, + .hljs-quote { + color: highlight; + } + + .hljs-keyword, + .hljs-selector-tag { + font-weight: bold; + } +} diff --git a/slides/css/my-css.css b/slides/css/my-css.css new file mode 100644 index 0000000..b102bf5 --- /dev/null +++ b/slides/css/my-css.css @@ -0,0 +1,15 @@ + +section.red.background { + background-color: red; +} + +section.small.text { + background-color: "#E1ECF4"; + font-size: 8px; /* Pixels */ +} + +.listsmalltext { + background-color: #E1ECF4; /* Remove quotes around color code */ + font-size: 1px; /* Adjust the size as needed */ +} + diff --git a/slides/css/my-theme.css b/slides/css/my-theme.css new file mode 100644 index 0000000..d22b86a --- /dev/null +++ b/slides/css/my-theme.css @@ -0,0 +1,53 @@ + + +// Base settings for all themes that can optionally be +// overridden by the super-theme + +// Background of the presentation +//$backgroundColor: #E1ECF4; +$backgroundColor: red; + +// // Primary/body text +// $mainFont: 'Lato', sans-serif; +// $mainFontSize: 80px; +// $mainColor: #E1ECF4; +// +// // 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: 7.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/slides/css/release-5.1.css b/slides/css/release-5.1.css new file mode 100644 index 0000000..57bb8ed --- /dev/null +++ b/slides/css/release-5.1.css @@ -0,0 +1,7 @@ +h1 { + text-wrap: balance; +} + +.big-fish { + font-size: 0.1em; +} diff --git a/slides/images/swarm.png b/slides/images/swarm.png new file mode 100644 index 0000000..0b556b6 Binary files /dev/null and b/slides/images/swarm.png differ diff --git a/slides/index.adoc b/slides/index.adoc new file mode 100644 index 0000000..1217ad6 --- /dev/null +++ b/slides/index.adoc @@ -0,0 +1,60 @@ +:revealjsdir: https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.9.2/ +:source-highlighter: highlight.js +:highlightjs-theme: ./css/a11y-dark.css +:highlightjs-languages: asciidoc +:icons: font +:imagesdir: images/ +// reveal.js config +:customcss: ./css/release-5.1.css +:revealjs_theme: moon +:revealjs_hash: true +:revealjs_width: 1650 +:backend: revealjs +:revealjs_plugin_zoom: enabled +:revealjs_plugins: {math: 'https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.9.2/plugin/math/math.js'} +:stem: latexmath + +== Ascidoc + +The environment + +https://docs.asciidoctor.org/reveal.js-converter/latest/converter/features/[] + + +[background-gradient="linear-gradient(to bottom, #002b36, #00b4e0)"] +== Gradient slide backgrounds + +[.big-fish] +🐟 + +[background-gradient="radial-gradient(#002b36, #00b4e0)"] +=== Radial gradient + +[.big-fish] +🐳 + + +== Docker Swarm + +image::swarm.png[height=580] + +[stem] +++++ +(a + b)^2 = a^2 + 2ab + b^2 +++++ + +[latexmath] +++++ +\lim_{n \to \infty}\frac{n}{\sqrt[n]{n!}} = {\large e} +++++ + +[latexmath] +++++ +y = x^2 +++++ + +[latexmath] +++++++++++++++++++++++++++++++++++++++++++++ +\[C = \alpha + \beta Y^{\gamma} + \epsilon\] +++++++++++++++++++++++++++++++++++++++++++++ + diff --git a/slides/revealjs-plugins/chalkboard/README.md b/slides/revealjs-plugins/chalkboard/README.md new file mode 100644 index 0000000..40ebbf1 --- /dev/null +++ b/slides/revealjs-plugins/chalkboard/README.md @@ -0,0 +1,157 @@ +# Chalkboard + +With this plugin you can add a chalkboard to reveal.js. The plugin provides two possibilities to include handwritten notes to your presentation: + +- you can make notes directly on the slides, e.g. to comment on certain aspects, +- you can open a chalkboard or whiteboard on which you can make notes. + +The main use case in mind when implementing the plugin is classroom usage in which you may want to explain some course content and quickly need to make some notes. + +The plugin records all drawings made so that they can be play backed using the `autoSlide` feature or the `audio-slideshow` plugin. + +[Check out the live demo](https://rajgoel.github.io/reveal.js-demos/chalkboard-demo.html) + +The chalkboard effect is based on [Chalkboard](https://github.com/mmoustafa/Chalkboard) by Mohamed Moustafa. + +Multi color support added by Kurt Rinnert [GitHub](https://github.com/rinnert). + +## Installation + +Copy the file `plugin.js` and the `img` directory into the plugin folder of your reveal.js presentation, i.e. `plugin/chalkboard` and load the plugin as shown below. + +```html + + + + +``` + +In order to include buttons for opening and closing the notes canvas or the chalkboard you should make sure that `font-awesome` is available. The easiest way is to include +```html + +``` +to the `head` section of you HTML-file. + +Alternatively, if you're using this package via NPM, you can use the built-in font-awesome distribution like so: +```html + +``` + +## Usage + +### Enable & disable + +With above configuration the notes canvas is opened and closed when pressing 'c' and the chalkboard is opened and closed when pressing 'b'. + +### Mouse +- Click the left mouse button and drag to write on notes canvas or chalkboard +- Click the right mouse button and drag to wipe away previous drawings + +### Touch +- Touch and move to write on notes canvas or chalkboard +- Touch and hold for half a second, then move to wipe away previous drawings + +### Keyboard +- Press the 'DEL' key to clear the chalkboard +- Press the 'd' key to download chalkboard drawings +- Press the 'BACKSPACE' key to delete all chalkboard drawings on the current slide +- Press the 'x' key to cycle colors forward +- Press the 'y' key to cycle colors backward + +## Playback + +If the `autoSlide` feature is set or if the `audio-slideshow` plugin is used, pre-recorded chalkboard drawings can be played. The slideshow plays back the user interaction with the chalkboard in the same way as it was conducted when recording the data. + +## Broadcasting + +The plugin supports broadcasting of drawings via the [`seminar`](https://github.com/rajgoel/reveal.js-plugins/tree/master/seminar) plugin. Alternatively, the [`multiplex`](https://github.com/reveal/multiplex) plugin can be used to share drawings (in this case, the `messageType` parameter (see Configuration) must be set to `'send'`). + + +## PDF-Export + +If the slideshow is opened in [print mode](https://revealjs.com/pdf-export/), the chalkboard drawings in the session storage (see `storage` option - print version must be opened in the same tab or window as the original slideshow) or provided in a file (see `src` option) are included in the PDF-file. Each drawing on the chalkboard is added after the slide that was shown when opening the chalkboard. Drawings on the notes canvas are not included in the PDF-file. + + +## Configuration + +The plugin has several configuration options: + +- `boardmarkerWidth`: an integer, the drawing width of the boardmarker; larger values draw thicker lines. +- `chalkWidth`: an integer, the drawing width of the chalk; larger values draw thicker lines. +- `chalkEffect`: a float in the range `[0.0, 1.0]`, the intesity of the chalk effect on the chalk board. Full effect (default) `1.0`, no effect `0.0`. +- `storage`: Optional variable name for session storage of drawings. +- `src`: Optional filename for pre-recorded drawings. +- `readOnly`: Configuation option allowing to prevent changes to existing drawings. If set to `true`, no changes can be made. However, recorded drawings for a slide or fragment can be cleared by pressing the 'DEL' key (i.e. by using the `RevealChalkboard.clear()` function). +- `toggleNotesButton`: If set to `true`, a button for opening and closing the notes canvas is shown. Alternatively, the css position attributes can be provided if the default position is not appropriate. +- `toggleChalkboardButton`: If set to `true`, a button for opening and closing the chalkboard is shown. Alternatively, the css position attributes can be provided if the default position is not appropriate. +- `colorButtons`: If set to `true`, the notes canvas and chalkboard will show a palette with buttons allowing to change the color. Alternatively, a numeric value can be assigned to the parameter limiting the number of colors buttons shown. +- `boardHandle`: If set to `true`, navigation buttons are shown, allowing to use multiple chalkboards on the same slide. +- `transition`: Gives the duration (in milliseconds) of the transition for a slide change, so that the notes canvas is drawn after the transition is completed. +- `theme`: Can be set to either `"chalkboard"` or `"whiteboard"`. + +The following configuration options allow to change the appearance of the notes canvas and the chalkboard. All of these options require two values, the first gives the value for the notes canvas, the second for the chalkboard. + +- `background`: The first value expects a (semi-)transparent color which is used to provide visual feedback that the notes canvas is enabled, the second value expects a filename to a background image for the chalkboard. +- `grid`: By default whiteboard and chalkboard themes include a grid pattern on the background. This pattern can be modified by setting the color, the distance between lines, and the line width, e.g. `{ color: 'rgb(127,127,255,0.1)', distance: 40, width: 2}`. Alternatively, the grid can be removed by setting the value to `false`. +- `eraser`: An image path and radius for the eraser. +- `boardmarkers`: A list of boardmarkers with given color and cursor. +- `chalks`: A list of chalks with given color and cursor. +- `rememberColor`: Whether to remember the last selected color for the slide canvas or the board. + +All of the configurations are optional and the default values shown below are used if the options are not provided. + +```javascript +Reveal.initialize({ + // ... + chalkboard: { + boardmarkerWidth: 3, + chalkWidth: 7, + chalkEffect: 1.0, + storage: null, + src: null, + readOnly: false, + messageType: 'broadcast', + toggleChalkboardButton: { left: "30px", bottom: "30px", top: "auto", right: "auto" }, + toggleNotesButton: { left: "30px", bottom: "30px", top: "auto", right: "auto" }, + colorButtons: true, + boardHandle: true, + transition: 800, + theme: "chalkboard", + background: [ 'rgba(127,127,127,.1)' , path + 'img/blackboard.png' ], + grid: { color: 'rgb(50,50,10,0.5)', distance: 80, width: 2}, + eraser: { src: path + 'img/sponge.png', radius: 20}, + boardmarkers : [ + { color: 'rgba(100,100,100,1)', cursor: 'url(' + path + 'img/boardmarker-black.png), auto'}, + { color: 'rgba(30,144,255, 1)', cursor: 'url(' + path + 'img/boardmarker-blue.png), auto'}, + { color: 'rgba(220,20,60,1)', cursor: 'url(' + path + 'img/boardmarker-red.png), auto'}, + { color: 'rgba(50,205,50,1)', cursor: 'url(' + path + 'img/boardmarker-green.png), auto'}, + { color: 'rgba(255,140,0,1)', cursor: 'url(' + path + 'img/boardmarker-orange.png), auto'}, + { color: 'rgba(150,0,20150,1)', cursor: 'url(' + path + 'img/boardmarker-purple.png), auto'}, + { color: 'rgba(255,220,0,1)', cursor: 'url(' + path + 'img/boardmarker-yellow.png), auto'} + ], + chalks: [ + { color: 'rgba(255,255,255,0.5)', cursor: 'url(' + path + 'img/chalk-white.png), auto'}, + { color: 'rgba(96, 154, 244, 0.5)', cursor: 'url(' + path + 'img/chalk-blue.png), auto'}, + { color: 'rgba(237, 20, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-red.png), auto'}, + { color: 'rgba(20, 237, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-green.png), auto'}, + { color: 'rgba(220, 133, 41, 0.5)', cursor: 'url(' + path + 'img/chalk-orange.png), auto'}, + { color: 'rgba(220,0,220,0.5)', cursor: 'url(' + path + 'img/chalk-purple.png), auto'}, + { color: 'rgba(255,220,0,0.5)', cursor: 'url(' + path + 'img/chalk-yellow.png), auto'} + ] + }, + // ... + +}); +``` + +## License + +MIT licensed + +Copyright (C) 2021 Asvin Goel diff --git a/slides/revealjs-plugins/chalkboard/img/blackboard.png b/slides/revealjs-plugins/chalkboard/img/blackboard.png new file mode 100644 index 0000000..50a2f64 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/blackboard.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/boardmarker-black.png b/slides/revealjs-plugins/chalkboard/img/boardmarker-black.png new file mode 100644 index 0000000..170b520 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/boardmarker-black.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/boardmarker-blue.png b/slides/revealjs-plugins/chalkboard/img/boardmarker-blue.png new file mode 100644 index 0000000..32f3ff8 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/boardmarker-blue.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/boardmarker-green.png b/slides/revealjs-plugins/chalkboard/img/boardmarker-green.png new file mode 100644 index 0000000..28a4221 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/boardmarker-green.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/boardmarker-orange.png b/slides/revealjs-plugins/chalkboard/img/boardmarker-orange.png new file mode 100644 index 0000000..7e8c2d2 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/boardmarker-orange.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/boardmarker-purple.png b/slides/revealjs-plugins/chalkboard/img/boardmarker-purple.png new file mode 100644 index 0000000..637066c Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/boardmarker-purple.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/boardmarker-red.png b/slides/revealjs-plugins/chalkboard/img/boardmarker-red.png new file mode 100644 index 0000000..713d6cd Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/boardmarker-red.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/boardmarker-yellow.png b/slides/revealjs-plugins/chalkboard/img/boardmarker-yellow.png new file mode 100644 index 0000000..23e87f5 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/boardmarker-yellow.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/chalk-blue.png b/slides/revealjs-plugins/chalkboard/img/chalk-blue.png new file mode 100644 index 0000000..f70c299 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/chalk-blue.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/chalk-green.png b/slides/revealjs-plugins/chalkboard/img/chalk-green.png new file mode 100644 index 0000000..39f3b20 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/chalk-green.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/chalk-orange.png b/slides/revealjs-plugins/chalkboard/img/chalk-orange.png new file mode 100644 index 0000000..488c847 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/chalk-orange.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/chalk-purple.png b/slides/revealjs-plugins/chalkboard/img/chalk-purple.png new file mode 100644 index 0000000..5bd29fb Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/chalk-purple.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/chalk-red.png b/slides/revealjs-plugins/chalkboard/img/chalk-red.png new file mode 100644 index 0000000..18d4dc7 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/chalk-red.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/chalk-white.png b/slides/revealjs-plugins/chalkboard/img/chalk-white.png new file mode 100644 index 0000000..fed89a3 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/chalk-white.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/chalk-yellow.png b/slides/revealjs-plugins/chalkboard/img/chalk-yellow.png new file mode 100644 index 0000000..0186bec Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/chalk-yellow.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/sponge.png b/slides/revealjs-plugins/chalkboard/img/sponge.png new file mode 100644 index 0000000..cbfb269 Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/sponge.png differ diff --git a/slides/revealjs-plugins/chalkboard/img/whiteboard.png b/slides/revealjs-plugins/chalkboard/img/whiteboard.png new file mode 100644 index 0000000..dbf570a Binary files /dev/null and b/slides/revealjs-plugins/chalkboard/img/whiteboard.png differ diff --git a/slides/revealjs-plugins/chalkboard/plugin.js b/slides/revealjs-plugins/chalkboard/plugin.js new file mode 100644 index 0000000..363d17b --- /dev/null +++ b/slides/revealjs-plugins/chalkboard/plugin.js @@ -0,0 +1,1836 @@ +/***************************************************************** +** Author: Asvin Goel, goel@telematique.eu +** +** A plugin for reveal.js adding a chalkboard. +** +** Version: 1.5.0 +** +** License: MIT license (see LICENSE.md) +** +** Credits: +** Chalkboard effect by Mohamed Moustafa https://github.com/mmoustafa/Chalkboard +** Multi color support by Kurt Rinnert https://github.com/rinnert +** Compatibility with reveal.js v4 by Hakim El Hattab https://github.com/hakimel +******************************************************************/ + +window.RevealChalkboard = window.RevealChalkboard || { + id: 'RevealChalkboard', + init: function(deck) { + initChalkboard(deck); + }, + configure: function(config) { configure(config); }, + toggleNotesCanvas: function() { toggleNotesCanvas(); }, + toggleChalkboard: function() { toggleChalkboard(); }, + colorIndex: function() { colorIndex(); }, + colorNext: function() { colorNext(); }, + colorPrev: function() {colorPrev(); }, + clear: function() { clear(); }, + reset: function() { reset(); }, + resetAll: function() { resetAll(); }, + updateStorage: function() { updateStorage(); }, + getData: function() { return getData(); }, + download: function() { download(); }, +}; + +function scriptPath() { + // obtain plugin path from the script element + var src; + if (document.currentScript) { + src = document.currentScript.src; + } else { + var sel = document.querySelector('script[src$="/chalkboard/plugin.js"]') + if (sel) { + src = sel.src; + } + } + var path = (src === undefined) ? "" : src.slice(0, src.lastIndexOf("/") + 1); +//console.log("Path: " + path); + return path; +} +var path = scriptPath(); + +const initChalkboard = function(Reveal){ +//console.warn(path); + /* Feature detection for passive event handling*/ + var passiveSupported = false; + + try { + window.addEventListener("test", null, Object.defineProperty({}, "passive", { get: function() { passiveSupported = true; } })); + } catch(err) {} + + +/***************************************************************** +** Configuration +******************************************************************/ + var background, pen, draw, color; + var grid = false; + var boardmarkerWidth = 3; + var chalkWidth = 7; + var chalkEffect = 1.0; + var rememberColor = [true, false]; + var eraser = { src: path + 'img/sponge.png', radius: 20}; + var boardmarkers = [ + { color: 'rgba(100,100,100,1)', cursor: 'url(' + path + 'img/boardmarker-black.png), auto'}, + { color: 'rgba(30,144,255, 1)', cursor: 'url(' + path + 'img/boardmarker-blue.png), auto'}, + { color: 'rgba(220,20,60,1)', cursor: 'url(' + path + 'img/boardmarker-red.png), auto'}, + { color: 'rgba(50,205,50,1)', cursor: 'url(' + path + 'img/boardmarker-green.png), auto'}, + { color: 'rgba(255,140,0,1)', cursor: 'url(' + path + 'img/boardmarker-orange.png), auto'}, + { color: 'rgba(150,0,20150,1)', cursor: 'url(' + path + 'img/boardmarker-purple.png), auto'}, + { color: 'rgba(255,220,0,1)', cursor: 'url(' + path + 'img/boardmarker-yellow.png), auto'} + ]; + var chalks = [ + { color: 'rgba(255,255,255,0.5)', cursor: 'url(' + path + 'img/chalk-white.png), auto'}, + { color: 'rgba(96, 154, 244, 0.5)', cursor: 'url(' + path + 'img/chalk-blue.png), auto'}, + { color: 'rgba(237, 20, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-red.png), auto'}, + { color: 'rgba(20, 237, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-green.png), auto'}, + { color: 'rgba(220, 133, 41, 0.5)', cursor: 'url(' + path + 'img/chalk-orange.png), auto'}, + { color: 'rgba(220,0,220,0.5)', cursor: 'url(' + path + 'img/chalk-purple.png), auto'}, + { color: 'rgba(255,220,0,0.5)', cursor: 'url(' + path + 'img/chalk-yellow.png), auto'} + ]; + var keyBindings = { + toggleNotesCanvas: { keyCode: 67, key: 'C', description: 'Toggle notes canvas' }, + toggleChalkboard: { keyCode: 66, key: 'B', description: 'Toggle chalkboard' }, + clear: { keyCode: 171, key: '+', description: 'Clear drawings on slide' }, + reset: { keyCode: 46, key: 'DEL', description: 'Reset drawings on slide' }, + resetAll: { keyCode: 8, key: 'BACKSPACE', description: 'Reset all drawings' }, + colorNext: { keyCode: 88, key: 'X', description: 'Next color' }, + colorPrev: { keyCode: 89, key: 'Y', description: 'Previous color' }, + download: { keyCode: 68, key: 'D', description: 'Download drawings' } + }; + + + var theme = "chalkboard"; + var color = [0, 0]; + var toggleChalkboardButton = true; + var toggleNotesButton = true; + var colorButtons = true; + var boardHandle = true; + var transition = 800; + + var readOnly = false; + var messageType = 'broadcast'; + + var config = configure( Reveal.getConfig().chalkboard || {} ); + if ( config.keyBindings ) { + for (var key in config.keyBindings) { + keyBindings[key] = config.keyBindings[key]; + }; + } + + function configure( config ) { + + if ( config.boardmarkerWidth || config.penWidth ) boardmarkerWidth = config.boardmarkerWidth || config.penWidth; + if ( config.chalkWidth ) chalkWidth = config.chalkWidth; + if ( config.chalkEffect ) chalkEffect = config.chalkEffect; + if ( config.rememberColor ) rememberColor = config.rememberColor; + if ( config.eraser ) eraser = config.eraser; + if ( config.boardmarkers ) boardmarkers = config.boardmarkers; + if ( config.chalks) chalks = config.chalks; + + if ( config.theme ) theme = config.theme; + switch ( theme ) { + case "whiteboard": + background = [ 'rgba(127,127,127,.1)' , path + 'img/whiteboard.png' ]; + draw = [ drawWithBoardmarker , drawWithBoardmarker ]; + pens = [ boardmarkers, boardmarkers ]; + grid = { color: 'rgb(127,127,255,0.1)', distance: 40, width: 2}; + break; + case "chalkboard": + default: + background = [ 'rgba(127,127,127,.1)' , path + 'img/blackboard.png' ]; + draw = [ drawWithBoardmarker , drawWithChalk ]; + pens = [ boardmarkers, chalks ]; + grid = { color: 'rgb(50,50,10,0.5)', distance: 80, width: 2}; + } + + if ( config.background ) background = config.background; + if ( config.grid != undefined ) grid = config.grid; + + if (config.toggleChalkboardButton != undefined) toggleChalkboardButton = config.toggleChalkboardButton; + if (config.toggleNotesButton != undefined) toggleNotesButton = config.toggleNotesButton; + if (config.colorButtons != undefined) colorButtons = config.colorButtons; + if (config.boardHandle != undefined) boardHandle = config.boardHandle; + if (config.transition) transition = config.transition; + + if (config.readOnly != undefined) readOnly = config.readOnly; + if (config.messageType) messageType = config.messageType; + + if ( drawingCanvas && ( config.theme || config.background || config.grid ) ) { + var canvas = document.getElementById( drawingCanvas[1].id ); + canvas.style.background = 'url("' + background[1] + '") repeat'; + clearCanvas( 1 ); + drawGrid(); + } + + return config; + } +/***************************************************************** +** Setup +******************************************************************/ + + function whenReady( callback ) { + // wait for drawings to be loaded and markdown to be parsed + if ( document.querySelectorAll(".pdf-page").length && loaded !== null ) { + callback(); + } + else { +console.log("Wait for pdf pages to be created and drawings to be loaded"); + setTimeout( whenReady, 500, callback ) + } + } + + + if ( toggleChalkboardButton ) { +//console.log("toggleChalkboardButton") + var button = document.createElement( 'div' ); + button.className = "chalkboard-button"; + button.id = "toggle-chalkboard"; + button.style.visibility = "visible"; + button.style.position = "absolute"; + button.style.zIndex = 30; + button.style.fontSize = "24px"; + + button.style.left = toggleChalkboardButton.left || "30px"; + button.style.bottom = toggleChalkboardButton.bottom || "30px"; + button.style.top = toggleChalkboardButton.top || "auto"; + button.style.right = toggleChalkboardButton.right || "auto"; + + button.innerHTML = '' + document.querySelector(".reveal").appendChild( button ); + } + if ( toggleNotesButton ) { +//console.log("toggleNotesButton") + var button = document.createElement( 'div' ); + button.className = "chalkboard-button"; + button.id = "toggle-notes"; + button.style.position = "absolute"; + button.style.zIndex = 30; + button.style.fontSize = "24px"; + + button.style.left = toggleNotesButton.left || "70px"; + button.style.bottom = toggleNotesButton.bottom || "30px"; + button.style.top = toggleNotesButton.top || "auto"; + button.style.right = toggleNotesButton.right || "auto"; + + button.innerHTML = '' + document.querySelector(".reveal").appendChild( button ); + } +//alert("Buttons"); + + var drawingCanvas = [ {id: "notescanvas" }, {id: "chalkboard" } ]; + setupDrawingCanvas(0); + setupDrawingCanvas(1); + + var mode = 0; // 0: notes canvas, 1: chalkboard + var board = 0; // board index (only for chalkboard) + + var mouseX = 0; + var mouseY = 0; + var xLast = null; + var yLast = null; + + var slideStart = Date.now(); + var slideIndices = { h:0, v:0 }; + var event = null; + var timeouts = [ [], [] ]; + var touchTimeout = null; + var slidechangeTimeout = null; + var playback = false; + + function createPalette( colors, length ) { + if ( length === true || length > colors.length ) { + length = colors.length; + } + var palette = document.createElement( 'div' ); + palette.classList.add('palette'); + var list = document.createElement( 'ul' ); + // color pickers + for (var i = 0; i < length; i++ ) { + var colorButton = document.createElement( 'li' ); + colorButton.setAttribute("data-color",i); + colorButton.innerHTML = ''; + colorButton.style.color = colors[i].color; + colorButton.addEventListener("click", function(e) { + colorIndex(e.target.parentElement.getAttribute("data-color")); + }); + list.appendChild( colorButton ); + } + palette.appendChild( list ); + return palette; + }; + + function setupDrawingCanvas( id ) { + var container = document.createElement( 'div' ); + container.id = drawingCanvas[id].id; + container.classList.add( 'overlay' ); + container.setAttribute( 'data-prevent-swipe', '' ); + container.oncontextmenu = function() { return false; } + container.style.cursor = pens[ id ][ color[id] ].cursor; + + drawingCanvas[id].width = window.innerWidth; + drawingCanvas[id].height = window.innerHeight; + drawingCanvas[id].scale = 1; + drawingCanvas[id].xOffset = 0; + drawingCanvas[id].yOffset = 0; + + if ( id == "0" ) { + container.style.background = 'rgba(0,0,0,0)'; + container.style.zIndex = 24; + container.style.opacity = 1; + container.style.visibility = 'visible'; + container.style.pointerEvents = "none"; + + var slides = document.querySelector(".slides"); + var aspectRatio = Reveal.getConfig().width / Reveal.getConfig().height; + if ( drawingCanvas[id].width > drawingCanvas[id].height*aspectRatio ) { + drawingCanvas[id].xOffset = (drawingCanvas[id].width - drawingCanvas[id].height*aspectRatio) / 2; + } + else if ( drawingCanvas[id].height > drawingCanvas[id].width/aspectRatio ) { + drawingCanvas[id].yOffset = ( drawingCanvas[id].height - drawingCanvas[id].width/aspectRatio ) / 2; + } + + if ( colorButtons ) { + var palette = createPalette( boardmarkers, colorButtons ); + palette.style.visibility = 'hidden'; // only show palette in drawing mode + container.appendChild(palette); + } + } + else { + container.style.background = 'url("' + background[id] + '") repeat'; + container.style.zIndex = 26; + container.style.opacity = 0; + container.style.visibility = 'hidden'; + + if ( colorButtons ) { + var palette = createPalette( chalks, colorButtons ); + container.appendChild(palette); + } + if ( boardHandle ) { + var handle = document.createElement( 'div' ); + handle.classList.add('boardhandle'); + handle.innerHTML='
'; + handle.querySelector("#previousboard").addEventListener("click", function(e) { + e.preventDefault(); + setBoard(board-1,true); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'setboard', timestamp: Date.now() - slideStart, index: board, status: { mode, board, color } }; + document.dispatchEvent( message ); + }); + handle.querySelector("#nextboard").addEventListener("click", function(e) { + e.preventDefault(); + setBoard(board+1,true); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'setboard', timestamp: Date.now() - slideStart, index: board, status: { mode, board, color } }; + document.dispatchEvent( message ); + }); + + container.appendChild(handle); + } + } + + + var sponge = document.createElement( 'img' ); + sponge.src = eraser.src; + sponge.id = "sponge"; + sponge.style.visibility = "hidden"; + sponge.style.position = "absolute"; + container.appendChild( sponge ); + drawingCanvas[id].sponge = sponge; + + var canvas = document.createElement( 'canvas' ); + canvas.width = drawingCanvas[id].width; + canvas.height = drawingCanvas[id].height; + canvas.setAttribute( 'data-chalkboard', id ); + canvas.style.cursor = pens[ id ][ color[id] ].cursor; + container.appendChild( canvas ); + drawingCanvas[id].canvas = canvas; + + drawingCanvas[id].context = canvas.getContext("2d"); + + + document.querySelector( '.reveal' ).appendChild( container ); + drawingCanvas[id].container = container; + } + + +/***************************************************************** +** Storage +******************************************************************/ + + var storage = [ + { width: Reveal.getConfig().width, height: Reveal.getConfig().height, data: []}, + { width: Reveal.getConfig().width, height: Reveal.getConfig().height, data: []} + ]; + + var loaded = null; + + if ( config.storage ) { + // Get chalkboard drawings from session storage + loaded = initStorage( sessionStorage.getItem( config.storage ) ); + } + + if ( !loaded && config.src != null ) { + // Get chalkboard drawings from the given file + loadData( config.src ); + } + + /** + * Initialize storage. + */ + function initStorage( json ) { + var success = false; + try { + var data = JSON.parse( json ); + for (var id = 0; id < data.length; id++) { + if ( drawingCanvas[id].width != data[id].width || drawingCanvas[id].height != data[id].height ) { + drawingCanvas[id].scale = Math.min( drawingCanvas[id].width/data[id].width, drawingCanvas[id].height/data[id].height); + drawingCanvas[id].xOffset = (drawingCanvas[id].width - data[id].width * drawingCanvas[id].scale)/2; + drawingCanvas[id].yOffset = (drawingCanvas[id].height - data[id].height * drawingCanvas[id].scale)/2; + } + if ( config.readOnly ) { + drawingCanvas[id].container.style.cursor = 'default'; + drawingCanvas[id].canvas.style.cursor = 'default'; + } + } + success = true; + storage = data; + } + catch ( err ) { + console.warn( "Cannot initialise storage!" ); + } + return success; + } + + + /** + * Load data. + */ + function loadData( filename ) { + var xhr = new XMLHttpRequest(); + xhr.onload = function() { + if (xhr.readyState === 4 && xhr.status != 404 ) { + loaded = initStorage(xhr.responseText); +console.log("Drawings loaded from file"); + } + else { + config.readOnly = undefined; + readOnly = undefined; + console.warn( 'Failed to get file ' + filename +". ReadyState: " + xhr.readyState + ", Status: " + xhr.status); + loaded = false; + } + }; + + xhr.open( 'GET', filename, true ); + try { + xhr.send(); + } + catch ( error ) { + config.readOnly = undefined; + readOnly = undefined; + console.warn( 'Failed to get file ' + filename + '. Make sure that the presentation and the file are served by a HTTP server and the file can be found there. ' + error ); + loaded = false; + } + } + + + function updateStorage() { + var json = JSON.stringify( storage ) + if ( config.storage ) { + sessionStorage.setItem( config.storage, json ) + } + return json; + } + + /** + * Get data as json string. + */ + function getData() { + // cleanup slide data without events + for (var id = 0; id < 2; id++) { + for (var i = storage[id].data.length-1; i >= 0; i--) { + if (storage[id].data[i].events.length == 0) { + storage[id].data.splice(i, 1); + } + } + } + + return updateStorage(); + } + + /** + * Download data. + */ + function downloadData() { + var a = document.createElement('a'); + document.body.appendChild(a); + try { + a.download = "chalkboard.json"; + var blob = new Blob( [ getData() ], { type: "application/json"} ); + a.href = window.URL.createObjectURL( blob ); + } catch( error ) { + a.innerHTML += " (" + error + ")"; + } + a.click(); + document.body.removeChild(a); + } + + /** + * Returns data object for the slide with the given indices. + */ + function getSlideData( indices, id ) { + if ( id == undefined ) id = mode; + if (!indices) indices = slideIndices; + var data; + for (var i = 0; i < storage[id].data.length; i++) { + if (storage[id].data[i].slide.h === indices.h && storage[id].data[i].slide.v === indices.v && storage[id].data[i].slide.f === indices.f ) { + data = storage[id].data[i]; + return data; + } + } + storage[id].data.push( { slide: indices, events: [], duration: 0 } ); + data = storage[id].data[storage[id].data.length-1]; + return data; + } + + /** + * Returns maximum duration of slide playback for both modes + */ + function getSlideDuration( indices ) { + if (!indices) indices = slideIndices; + var duration = 0; + for (var id = 0; id < 2; id++) { + for (var i = 0; i < storage[id].data.length; i++) { + if (storage[id].data[i].slide.h === indices.h && storage[id].data[i].slide.v === indices.v && storage[id].data[i].slide.f === indices.f ) { + duration = Math.max( duration, storage[id].data[i].duration ); + break; + } + } + } +//console.log( duration ); + return duration; + } + +/***************************************************************** +** Print +******************************************************************/ + var printMode = ( /print-pdf/gi ).test( window.location.search ); +//console.log("createPrintout" + printMode) + + function createPrintout( ) { +//console.warn(Reveal.getTotalSlides(),Reveal.getSlidesElement()); + if ( storage[1].data.length == 0 ) return; +console.log( 'Create printout(s) for ' + storage[1].data.length + " slides"); + drawingCanvas[0].container.style.opacity = 0; // do not print notes canvas + drawingCanvas[0].container.style.visibility = 'hidden'; + + var patImg = new Image(); + patImg.onload = function () { + var slides = getSlidesArray(); +//console.log(slides); + for (var i = storage[1].data.length-1; i>=0; i--) { +console.log( 'Create printout for slide ' + storage[1].data[i].slide.h + "." + storage[1].data[i].slide.v ); + var slideData = getSlideData( storage[1].data[i].slide, 1 ); + var drawings = createDrawings( slideData, patImg ); + var slide = slides[ storage[1].data[i].slide.h][ storage[1].data[i].slide.v ]; +//console.log("Slide:", slide); + addDrawings( slide, drawings ); + + } +// Reveal.sync(); + }; + patImg.src = background[1]; + } + + function getSlidesArray() { + var horizontal = document.querySelectorAll('.slides > div.pdf-page > section, .slides > section'); + var slides = []; + var slidenumber = undefined; + for ( var i=0; i < horizontal.length; i++) { + if ( horizontal[i].parentElement.classList.contains("pdf-page") ) { + // Horizontal slide + if ( horizontal[i].getAttribute("data-slide-number") != slidenumber ) { + // new slide + slides.push([]); + slides[slides.length-1].push(horizontal[i]); + slidenumber = horizontal[i].getAttribute("data-slide-number"); + } + else { + // fragment of same slide + slides[slides.length-1][slides[slides.length-1].length-1] = horizontal[i]; + } + } + else { + // Vertical slides + var vertical = horizontal[i].querySelectorAll('section'); + slides.push([]); + var slidenumber = undefined; + for ( var j=0; j < vertical.length; j++) { + if ( vertical[j].getAttribute("data-slide-number") != slidenumber ) { + // new slide + slides[slides.length-1].push(vertical[j]); + slidenumber = vertical[j].getAttribute("data-slide-number"); + } + else { + // fragment of same slide + slides[slides.length-1][slides[slides.length-1].length-1] = vertical[j]; + } + } + } + } +//console.log("Slides:", slides); + return slides; + } + + function cloneCanvas(oldCanvas) { + //create a new canvas + var newCanvas = document.createElement('canvas'); + var context = newCanvas.getContext('2d'); + //set dimensions + newCanvas.width = oldCanvas.width; + newCanvas.height = oldCanvas.height; + //apply the old canvas to the new one + context.drawImage(oldCanvas, 0, 0); + //return the new canvas + return newCanvas; + } + + function getCanvas( template, container, board ) { + var idx = container.findIndex(element => element.board === board); + if ( idx === -1 ) { + var canvas = cloneCanvas(template); + if ( !container.length ) { + idx = 0; + container.push({ board, canvas }); + } + else if ( board < container[0].board ) { + idx = 0; + container.unshift({ board, canvas }); + } + else if ( board > container[container.length-1].board ) { + idx = container.length; + container.push({ board, canvas }); + } + } + + return container[idx].canvas; + } + + function createDrawings( slideData, patImg ) { + var width = Reveal.getConfig().width; + var height = Reveal.getConfig().height; + var scale = 1; + var xOffset = 0; + var yOffset = 0; + if ( width != storage[1].width || height != storage[1].height ) { + scale = Math.min( width/storage[1].width, height/storage[1].height); + xOffset = (width - storage[1].width * scale)/2; + yOffset = (height - storage[1].height * scale)/2; + } + mode = 1; + board = 0; +console.log( 'Create printout(s) for slide ', slideData); + + var drawings = []; + var template = document.createElement('canvas'); + template.width = width; + template.height = height; + + var imgCtx = template.getContext("2d"); + imgCtx.fillStyle = imgCtx.createPattern( patImg ,'repeat'); + imgCtx.rect(0,0,width,height); + imgCtx.fill(); + + for (var j = 0; j < slideData.events.length; j++) { + switch ( slideData.events[j].type ) { + case "draw": + for (var k = 1; k < slideData.events[j].curve.length; k++) { + draw[1]( getCanvas(template,drawings,board).getContext("2d"), + xOffset + slideData.events[j].curve[k-1].x*scale, + yOffset + slideData.events[j].curve[k-1].y*scale, + xOffset + slideData.events[j].curve[k].x*scale, + yOffset + slideData.events[j].curve[k].y*scale + ); + } + break; + case "erase": + for (var k = 0; k < slideData.events[j].curve.length; k++) { + eraseWithSponge( getCanvas(template,drawings,board).getContext("2d"), + xOffset + slideData.events[j].curve[k].x*scale, + yOffset + slideData.events[j].curve[k].y*scale + ); + } + break; + case "setcolor": + setColor(slideData.events[j].index); + break; + case "setboard": + // Todo: create new canvas for each new index + setBoard(slideData.events[j].index); +//board = 0; + break; + case "clear": + getCanvas(template,drawings,board).getContext("2d").clearRect(0,0,width,height); + getCanvas(template,drawings,board).getContext("2d").fill(); + break; + default: + break; + } + } + + drawings = drawings.sort((a, b) => a.board > b.board && 1 || -1); + + mode = 0; + + return drawings; + } + + function addDrawings( slide, drawings ) { + var parent = slide.parentElement.parentElement; + var nextSlide = slide.parentElement.nextElementSibling; + + for (var i = 0; i < drawings.length; i++) { + var newPDFPage = document.createElement( 'div' ); + newPDFPage.classList.add('pdf-page'); + newPDFPage.style.height = Reveal.getConfig().height; +// newPDFPage.innerHTML = '

Drawing should be here!

'; + newPDFPage.append(drawings[i].canvas); +//console.log("Add drawing", newPDFPage); + if ( nextSlide != null ) { + parent.insertBefore( newPDFPage, nextSlide ); + } + else { + parent.append( newPDFPage ); + } + } + } + +/***************************************************************** +** Drawings +******************************************************************/ + + function drawWithBoardmarker(context,fromX,fromY,toX,toY){ + context.lineWidth = boardmarkerWidth; + context.lineCap = 'round'; + context.strokeStyle = boardmarkers[color[mode]].color; + context.beginPath(); + context.moveTo(fromX, fromY); + context.lineTo(toX, toY); + context.stroke(); + } + + function drawWithChalk(context,fromX,fromY,toX,toY) { + var brushDiameter = chalkWidth; + context.lineWidth = brushDiameter; + context.lineCap = 'round'; + context.fillStyle = chalks[color[mode]].color; // 'rgba(255,255,255,0.5)'; + context.strokeStyle = chalks[color[mode]].color; + /*var opacity = Math.min(0.8, Math.max(0,color[1].replace(/^.*,(.+)\)/,'$1') - 0.1)) + Math.random()*0.2;*/ + var opacity = 1.0; + context.strokeStyle = context.strokeStyle.replace(/[\d\.]+\)$/g, opacity + ')'); + context.beginPath(); + context.moveTo(fromX, fromY); + context.lineTo(toX, toY); + context.stroke(); + // Chalk Effect + var length = Math.round(Math.sqrt(Math.pow(toX-fromX,2)+Math.pow(toY-fromY,2))/(5/brushDiameter)); + var xUnit = (toX-fromX)/length; + var yUnit = (toY-fromY)/length; + for(var i=0; i (Math.random() * 0.9)) { + var xCurrent = fromX+(i*xUnit); + var yCurrent = fromY+(i*yUnit); + var xRandom = xCurrent+(Math.random()-0.5)*brushDiameter*1.2; + var yRandom = yCurrent+(Math.random()-0.5)*brushDiameter*1.2; + context.clearRect( xRandom, yRandom, Math.random()*2+2, Math.random()+1); + } + } + } + + function eraseWithSponge(context,x,y) { + context.save(); + context.beginPath(); + context.arc(x, y, eraser.radius, 0, 2 * Math.PI, false); + context.clip(); + context.clearRect(x - eraser.radius - 1, y - eraser.radius - 1, eraser.radius * 2 + 2, eraser.radius * 2 + 2); + context.restore(); + if ( mode == 1 && grid) { + redrawGrid(x,y,eraser.radius); + } + } + + + + /** + * Show an overlay for the chalkboard. + */ + function showChalkboard() { +//console.log("showChalkboard"); + clearTimeout(touchTimeout); + touchTimeout = null; + drawingCanvas[0].sponge.style.visibility = "hidden"; // make sure that the sponge from touch events is hidden + drawingCanvas[1].sponge.style.visibility = "hidden"; // make sure that the sponge from touch events is hidden + drawingCanvas[1].container.style.opacity = 1; + drawingCanvas[1].container.style.visibility = 'visible'; + mode = 1; + } + + + /** + * Closes open chalkboard. + */ + function closeChalkboard() { + clearTimeout(touchTimeout); + touchTimeout = null; + drawingCanvas[0].sponge.style.visibility = "hidden"; // make sure that the sponge from touch events is hidden + drawingCanvas[1].sponge.style.visibility = "hidden"; // make sure that the sponge from touch events is hidden + drawingCanvas[1].container.style.opacity = 0; + drawingCanvas[1].container.style.visibility = 'hidden'; + xLast = null; + yLast = null; + event = null; + mode = 0; + } + + /** + * Clear current canvas. + */ + function clearCanvas( id ) { + if ( id == 0 ) clearTimeout( slidechangeTimeout ); + drawingCanvas[id].context.clearRect(0,0,drawingCanvas[id].width,drawingCanvas[id].height); + if ( id == 1 && grid ) drawGrid(); + } + + /** + * Draw grid on background + */ + function drawGrid() { + var context = drawingCanvas[1].context; + + drawingCanvas[1].scale = Math.min( drawingCanvas[1].width/storage[1].width, drawingCanvas[1].height/storage[1].height ); + drawingCanvas[1].xOffset = (drawingCanvas[1].width - storage[1].width * drawingCanvas[1].scale)/2; + drawingCanvas[1].yOffset = (drawingCanvas[1].height - storage[1].height * drawingCanvas[1].scale)/2; + + var scale = drawingCanvas[1].scale; + var xOffset = drawingCanvas[1].xOffset; + var yOffset = drawingCanvas[1].yOffset; + + var distance = grid.distance*scale; + + var fromX = drawingCanvas[1].width/2 - distance/2 - Math.floor( (drawingCanvas[1].width - distance)/2 / distance ) * distance; + for( var x=fromX; x < drawingCanvas[1].width; x+=distance ) { + context.beginPath(); + context.lineWidth = grid.width*scale; + context.lineCap = 'round'; + context.fillStyle = grid.color; + context.strokeStyle = grid.color; + context.moveTo(x, 0); + context.lineTo(x, drawingCanvas[1].height); + context.stroke(); + } + var fromY = drawingCanvas[1].height/2 - distance/2 - Math.floor( (drawingCanvas[1].height - distance)/2 / distance ) * distance ; + + for( var y=fromY; y < drawingCanvas[1].height; y+=distance ) { + context.beginPath(); + context.lineWidth = grid.width*scale; + context.lineCap = 'round'; + context.fillStyle = grid.color; + context.strokeStyle = grid.color; + context.moveTo(0, y); + context.lineTo(drawingCanvas[1].width, y); + context.stroke(); + } + } + + function redrawGrid(centerX,centerY,diameter) { + var context = drawingCanvas[1].context; + + drawingCanvas[1].scale = Math.min( drawingCanvas[1].width/storage[1].width, drawingCanvas[1].height/storage[1].height ); + drawingCanvas[1].xOffset = (drawingCanvas[1].width - storage[1].width * drawingCanvas[1].scale)/2; + drawingCanvas[1].yOffset = (drawingCanvas[1].height - storage[1].height * drawingCanvas[1].scale)/2; + + var scale = drawingCanvas[1].scale; + var xOffset = drawingCanvas[1].xOffset; + var yOffset = drawingCanvas[1].yOffset; + + var distance = grid.distance*scale; + + var fromX = drawingCanvas[1].width/2 - distance/2 - Math.floor( (drawingCanvas[1].width - distance)/2 / distance ) * distance; + + for( var x=fromX + distance* Math.ceil( (centerX-diameter-fromX) / distance); x <= fromX + distance* Math.floor( (centerX+diameter-fromX) / distance); x+=distance ) { + context.beginPath(); + context.lineWidth = grid.width*scale; + context.lineCap = 'round'; + context.fillStyle = grid.color; + context.strokeStyle = grid.color; + context.moveTo(x, centerY - Math.sqrt( diameter*diameter - (centerX-x)*(centerX-x) )); + context.lineTo(x, centerY + Math.sqrt( diameter*diameter - (centerX-x)*(centerX-x) ) ); + context.stroke(); + } + var fromY = drawingCanvas[1].height/2 - distance/2 - Math.floor( (drawingCanvas[1].height - distance)/2 / distance ) * distance ; + for( var y=fromY + distance* Math.ceil( (centerY-diameter-fromY) / distance); y <= fromY + distance* Math.floor( (centerY+diameter-fromY) / distance); y+=distance ) { + context.beginPath(); + context.lineWidth = grid.width*scale; + context.lineCap = 'round'; + context.fillStyle = grid.color; + context.strokeStyle = grid.color; + context.moveTo(centerX - Math.sqrt( diameter*diameter - (centerY-y)*(centerY-y) ), y ); + context.lineTo(centerX + Math.sqrt( diameter*diameter - (centerY-y)*(centerY-y) ), y ); + context.stroke(); + } + } + + /** + * Set the color + */ + function setColor( index, record ) { + // protect against out of bounds (this could happen when + // replaying events recorded with different color settings). + if ( index >= boardmarkers[mode].length ) index = 0; + color[mode] = index; + drawingCanvas[mode].canvas.style.cursor = pens[mode][color[mode]].cursor; + if ( record ) { + recordEvent( { type: "setcolor", index: index, begin: Date.now() - slideStart } ); + updateStorage(); + } + } + + /** + * Set the board + */ + function setBoard( index, record ) { +//console.log("Set board",index); + board = index; + redrawChalkboard( board ); + + if ( record ) { + recordEvent( { type: "setboard", index: board, begin: Date.now() - slideStart } ); + updateStorage(); + } + } + + function redrawChalkboard( board ) { + clearCanvas( 1 ); + var slideData = getSlideData( slideIndices, 1 ); + var index = 0; + var play = ( board == 0 ); + while ( index < slideData.events.length && slideData.events[index].begin < Date.now() - slideStart) { + if ( slideData.events[index].type == "setboard" ) { + play = ( board == slideData.events[index].index ); + } + else if ( play || slideData.events[index].type == "setcolor" ) { + playEvent( 1, slideData.events[index], Date.now() - slideStart ); + } + index++; + } + } + + + /** + * Forward cycle color + */ + function cycleColorNext() { + color[mode] = (color[mode] + 1) % pens[mode].length; + return color[mode]; + } + + /** + * Backward cycle color + */ + function cycleColorPrev() { + color[mode] = (color[mode] + (pens[mode].length - 1)) % pens[mode].length; + return color[mode]; + } + +/***************************************************************** +** Broadcast +******************************************************************/ + + var eventQueue = []; + + document.addEventListener( 'received', function ( message ) { + if ( message.content && message.content.sender == 'chalkboard-plugin' ) { + // add message to queue + eventQueue.push(message); + } + if ( eventQueue.length == 1 ) processQueue(); + }); + +//console.log(JSON.stringify(message)); + function processQueue() { + // take first message from queue + var message = eventQueue.shift(); + + // synchronize time with seminar host + slideStart = Date.now() - message.content.timestamp; + // set status + if ( mode < message.content.status.mode ) { + // open chalkboard + showChalkboard(); + } + else if ( mode > message.content.status.mode ) { + // close chalkboard + closeChalkboard(); + } + if ( board != message.content.status.board ) { + board = message.content.status.board; + redrawChalkboard( board ); + }; + color = message.content.status.color; + + switch ( message.content.type ) { + case 'showChalkboard': + showChalkboard(); + break; + case 'closeChalkboard': + closeChalkboard(); + break; + case 'startDrawing': + startDrawing(message.content.x, message.content.y, message.content.erase); + break; + case 'startErasing': + if ( message.content ) { + message.content.type = "erase"; + message.content.begin = Date.now() - slideStart; + eraseWithSponge(drawingCanvas[mode].context, message.content.x, message.content.y); + } + break; + case 'drawSegment': + drawSegment(message.content.x, message.content.y, message.content.erase); + break; + case 'stopDrawing': + stopDrawing(); + break; + case 'clear': + clear(); + break; + case 'setcolor': + setColor(message.content.index, true); + break; + case 'setboard': + setBoard(message.content.index, true); + break; + case 'resetSlide': + resetSlide(true); + break; + case 'init': + storage = message.content.storage; + for (var id = 0; id < 2; id++ ) { + drawingCanvas[id].scale = Math.min( drawingCanvas[id].width/storage[id].width, drawingCanvas[id].height/storage[id].height ); + drawingCanvas[id].xOffset = (drawingCanvas[id].width - storage[id].width * drawingCanvas[id].scale)/2; + drawingCanvas[id].yOffset = (drawingCanvas[id].height - storage[id].height * drawingCanvas[id].scale)/2; + } + clearCanvas( 0 ); + clearCanvas( 1 ); + if ( !playback ) { + slidechangeTimeout = setTimeout( startPlayback, transition, getSlideDuration(), 0 ); + } + if ( mode == 1 && message.content.mode == 0) { + setTimeout( closeChalkboard, transition + 50 ); + } + if ( mode == 0 && message.content.mode == 1) { + setTimeout( showChalkboard, transition + 50 ); + } + mode = message.content.mode; + break; + default: + break; + } + + // continue with next message if queued + if ( eventQueue.length > 0 ) { + processQueue(); + } + else { + updateStorage(); + } + } + + document.addEventListener( 'welcome', function( user ) { + // broadcast storage + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', recipient: user.id, type: 'init', timestamp: Date.now() - slideStart, storage: storage, status: { mode, board, color } }; + document.dispatchEvent( message ); + }); + +/***************************************************************** +** Playback +******************************************************************/ + + document.addEventListener('seekplayback', function( event ) { +//console.log('event seekplayback ' + event.timestamp); + stopPlayback(); + if ( !playback || event.timestamp == 0) { + // in other cases startplayback fires after seeked + startPlayback( event.timestamp ); + } +//console.log('seeked'); + }); + + + document.addEventListener('startplayback', function( event ) { +//console.log('event startplayback ' + event.timestamp); + stopPlayback(); + playback = true; + startPlayback( event.timestamp ); + }); + + document.addEventListener('stopplayback', function( event ) { +//console.log('event stopplayback ' + (Date.now() - slideStart) ); + playback = false; + stopPlayback(); + }); + + document.addEventListener('startrecording', function( event ) { +//console.log('event startrecording ' + event.timestamp); + startRecording(); + }); + + function recordEvent( event ) { + var slideData = getSlideData(); + var i = slideData.events.length; + while ( i > 0 && event.begin < slideData.events[i-1].begin ) { + i--; + } + slideData.events.splice( i, 0, event); + slideData.duration = Math.max( slideData.duration, Date.now() - slideStart ) + 1; + } + + function startRecording() { + resetSlide( true ); + slideStart = Date.now(); + } + + function startPlayback( timestamp, finalMode ) { +//console.log("playback " + timestamp ); + slideStart = Date.now() - timestamp; + closeChalkboard(); + mode = 0; + board = 0; + for ( var id = 0; id < 2; id++ ) { + clearCanvas( id ); + var slideData = getSlideData( slideIndices, id ); +//console.log( timestamp +" / " + JSON.stringify(slideData)); + var index = 0; + while ( index < slideData.events.length && slideData.events[index].begin < (Date.now() - slideStart) ) { + playEvent( id, slideData.events[index], timestamp ); + index++; + } + + while ( playback && index < slideData.events.length ) { + timeouts[id].push( setTimeout( playEvent, slideData.events[index].begin - (Date.now() - slideStart), id, slideData.events[index], timestamp ) ); + index++; + } + } +//console.log("Mode: " + finalMode + "/" + mode ); + if ( finalMode != undefined ) { + mode = finalMode; + } + if( mode == 1 ) showChalkboard(); +//console.log("playback (ok)"); + + }; + + function stopPlayback() { +//console.log("stopPlayback"); +//console.log("Timeouts: " + timeouts[0].length + "/"+ timeouts[1].length); + for ( var id = 0; id < 2; id++ ) { + for (var i = 0; i < timeouts[id].length; i++) { + clearTimeout(timeouts[id][i]); + } + timeouts[id] = []; + } + }; + + function playEvent( id, event, timestamp ) { +//console.log( timestamp +" / " + JSON.stringify(event)); +//console.log( id + ": " + timestamp +" / " + event.begin +" / " + event.type +" / " + mode ); + switch ( event.type ) { + case "open": + if ( timestamp <= event.begin ) { + showChalkboard(); + } + else { + mode = 1; + } + + break; + case "close": + if ( timestamp < event.begin ) { + closeChalkboard(); + } + else { + mode = 0; + } + break; + case "clear": + clearCanvas( id ); + break; + case "setcolor": + setColor(event.index); + break; + case "setboard": + setBoard(event.index); + break; + case "draw": + drawCurve( id, event, timestamp ); + break; + case "erase": + eraseCurve( id, event, timestamp ); + break; + + } + }; + + function drawCurve( id, event, timestamp ) { + if ( event.curve.length > 1 ) { + var ctx = drawingCanvas[id].context; + var scale = drawingCanvas[id].scale; + var xOffset = drawingCanvas[id].xOffset; + var yOffset = drawingCanvas[id].yOffset; + + var stepDuration = ( event.end - event.begin )/ ( event.curve.length - 1 ); +//console.log("---"); + for (var i = 1; i < event.curve.length; i++) { + if (event.begin + i * stepDuration <= (Date.now() - slideStart)) { +//console.log( "Draw " + timestamp +" / " + event.begin + " + " + i + " * " + stepDuration ); + draw[id](ctx, xOffset + event.curve[i-1].x*scale, yOffset + event.curve[i-1].y*scale, xOffset + event.curve[i].x*scale, yOffset + event.curve[i].y*scale); + } + else if ( playback ) { +//console.log( "Cue " + timestamp +" / " + (Date.now() - slideStart) +" / " + event.begin + " + " + i + " * " + stepDuration + " = " + Math.max(0,event.begin + i * stepDuration - timestamp) ); + timeouts.push( setTimeout( + draw[id], Math.max(0,event.begin + i * stepDuration - (Date.now() - slideStart)), ctx, + xOffset + event.curve[i-1].x*scale, + yOffset + event.curve[i-1].y*scale, + xOffset + event.curve[i].x*scale, + yOffset + event.curve[i].y*scale + ) + ); + } + } + } + + }; + + function eraseCurve( id, event, timestamp ) { + if ( event.curve.length > 1 ) { + var ctx = drawingCanvas[id].context; + var scale = drawingCanvas[id].scale; + var xOffset = drawingCanvas[id].xOffset; + var yOffset = drawingCanvas[id].yOffset; + + var stepDuration = ( event.end - event.begin )/ event.curve.length; + for (var i = 0; i < event.curve.length; i++) { + if (event.begin + i * stepDuration <= (Date.now() - slideStart)) { + eraseWithSponge(ctx, xOffset + event.curve[i].x*scale, yOffset + event.curve[i].y*scale); + } + else if ( playback ) { + timeouts.push( setTimeout( + eraseWithSponge, Math.max(0,event.begin + i * stepDuration - (Date.now() - slideStart)), ctx, + xOffset + event.curve[i].x * scale, + yOffset + event.curve[i].y * scale + ) + ); + } + } + } + + }; + + + function startDrawing( x, y, erase ) { + var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + xLast = x * scale + xOffset; + yLast = y * scale + yOffset; + if ( erase == true) { + event = { type: "erase", begin: Date.now() - slideStart, end: null, curve: [{x: x, y: y}]}; + drawingCanvas[mode].canvas.style.cursor = 'url("' + eraser.src + '") ' + eraser.radius + ' ' + eraser.radius + ', auto'; + eraseWithSponge(ctx, x * scale + xOffset, y * scale + yOffset); + } + else { + event = { type: "draw", begin: Date.now() - slideStart, end: null, curve: [{x: x, y: y}] }; + } + } + + + function showSponge(x,y) { + if ( event ) { + event.type = "erase"; + event.begin = Date.now() - slideStart; + // show sponge image + drawingCanvas[mode].sponge.style.left = (x - eraser.radius) +"px" ; + drawingCanvas[mode].sponge.style.top = (y - eraser.radius) +"px" ; + drawingCanvas[mode].sponge.style.visibility = "visible"; + eraseWithSponge(drawingCanvas[mode].context,x,y); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'startErasing', timestamp: Date.now() - slideStart, status: { mode, board, color }, x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale }; + document.dispatchEvent( message ); + } + } + + function drawSegment( x, y, erase ) { + var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + if ( !event ) { + // safeguard if broadcast hickup + startDrawing( x, y, erase ); + } + event.curve.push({x: x, y: y}); + if(y * scale + yOffset < drawingCanvas[mode].height && x * scale + xOffset < drawingCanvas[mode].width) { + if ( erase ) { + eraseWithSponge(ctx, x * scale + xOffset, y * scale + yOffset); + } + else { + draw[mode](ctx, xLast, yLast, x * scale + xOffset, y * scale + yOffset); + } + xLast = x * scale + xOffset; + yLast = y * scale + yOffset; + } + } + + function stopDrawing() { + if ( event ) { + event.end = Date.now() - slideStart; + if ( event.type == "erase" || event.curve.length > 1 ) { + // do not save a line with a single point only + recordEvent( event ); + updateStorage(); + } + event = null; + } + } + + +/***************************************************************** +** User interface +******************************************************************/ + + +// TODO: check all touchevents + document.addEventListener('touchstart', function(evt) { +//console.log("Touch start"); + if ( !readOnly && evt.target.getAttribute('data-chalkboard') == mode ) { +// var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + + evt.preventDefault(); + var touch = evt.touches[0]; + mouseX = touch.pageX; + mouseY = touch.pageY; + startDrawing( (mouseX - xOffset)/scale, (mouseY-yOffset)/scale, false ); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'startDrawing', timestamp: Date.now() - slideStart, status: { mode, board, color }, x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale, erase: false }; + document.dispatchEvent( message ); +/* + xLast = mouseX; + yLast = mouseY; + event = { type: "draw", begin: Date.now() - slideStart, end: null, curve: [{x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale}] }; +*/ + touchTimeout = setTimeout( showSponge, 500, mouseX, mouseY ); + } + }, passiveSupported ? {passive: false} : false); + + document.addEventListener('touchmove', function(evt) { +//console.log("Touch move"); + clearTimeout( touchTimeout ); + touchTimeout = null; + if ( event ) { +// var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + + var touch = evt.touches[0]; + mouseX = touch.pageX; + mouseY = touch.pageY; + if (mouseY < drawingCanvas[mode].height && mouseX < drawingCanvas[mode].width) { + evt.preventDefault(); + // move sponge + if ( event.type == "erase" ) { + drawingCanvas[mode].sponge.style.left = (mouseX - eraser.radius) +"px" ; + drawingCanvas[mode].sponge.style.top = (mouseY - eraser.radius) +"px" ; + } + } + + drawSegment( (mouseX - xOffset)/scale, (mouseY-yOffset)/scale, ( event.type == "erase" ) ); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'drawSegment', timestamp: Date.now() - slideStart, status: { mode, board, color }, x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale, erase: ( event.type == "erase" ) }; + document.dispatchEvent( message ); +/* + if (mouseY < drawingCanvas[mode].height && mouseX < drawingCanvas[mode].width) { + evt.preventDefault(); + event.curve.push({x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale}); + if ( event.type == "erase" ) { + drawingCanvas[mode].sponge.style.left = (mouseX - eraser.radius) +"px" ; + drawingCanvas[mode].sponge.style.top = (mouseY - eraser.radius) +"px" ; + eraseWithSponge(ctx, mouseX, mouseY); + } + else { + draw[mode](ctx, xLast, yLast, mouseX, mouseY); + } + xLast = mouseX; + yLast = mouseY; + } +*/ + } + }, false); + + + document.addEventListener('touchend', function(evt) { + clearTimeout( touchTimeout ); + touchTimeout = null; + // hide sponge image + drawingCanvas[mode].sponge.style.visibility = "hidden"; + stopDrawing(); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', timestamp: Date.now() - slideStart, type: 'stopDrawing', status: { mode, board, color } }; + document.dispatchEvent( message ); +/* + if ( event ) { + event.end = Date.now() - slideStart; + if ( event.type == "erase" || event.curve.length > 1 ) { + // do not save a line with a single point only + recordEvent( event ); + } + event = null; + } +*/ + }, false); + + document.addEventListener( 'mousedown', function( evt ) { +//console.log("Mouse down"); +//console.log( "Read only: " + readOnly ); + if ( !readOnly && evt.target.getAttribute('data-chalkboard') == mode ) { +//console.log( "mousedown: " + evt.button ); +// var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + + mouseX = evt.pageX; + mouseY = evt.pageY; + startDrawing( (mouseX - xOffset)/scale, (mouseY-yOffset)/scale, ( evt.button == 2 || evt.button == 1) ); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'startDrawing', timestamp: Date.now() - slideStart, status: { mode, board, color }, x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale, erase: ( evt.button == 2 || evt.button == 1) }; + document.dispatchEvent( message ); +/* + xLast = mouseX; + yLast = mouseY; + if ( evt.button == 2) { + event = { type: "erase", begin: Date.now() - slideStart, end: null, curve: [{x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale}]}; + drawingCanvas[mode].canvas.style.cursor = 'url("' + path + 'img/sponge.png") ' + eraser.radius + ' ' + eraser.radius + ', auto'; + eraseWithSponge(ctx,mouseX,mouseY); + } + else { + event = { type: "draw", begin: Date.now() - slideStart, end: null, curve: [{x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale}] }; + } +*/ + } + } ); + + document.addEventListener( 'mousemove', function( evt ) { +//console.log("Mouse move"); + if ( event ) { +// var ctx = drawingCanvas[mode].context; + var scale = drawingCanvas[mode].scale; + var xOffset = drawingCanvas[mode].xOffset; + var yOffset = drawingCanvas[mode].yOffset; + + mouseX = evt.pageX; + mouseY = evt.pageY; + drawSegment( (mouseX - xOffset)/scale, (mouseY-yOffset)/scale, ( event.type == "erase" ) ); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'drawSegment', timestamp: Date.now() - slideStart, status: { mode, board, color }, x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale, erase: ( event.type == "erase" ) }; + document.dispatchEvent( message ); +/* + event.curve.push({x: (mouseX - xOffset)/scale, y: (mouseY-yOffset)/scale}); + if(mouseY < drawingCanvas[mode].height && mouseX < drawingCanvas[mode].width) { + if ( event.type == "erase" ) { + eraseWithSponge(ctx,mouseX,mouseY); + } + else { + draw[mode](ctx, xLast, yLast, mouseX,mouseY); + } + xLast = mouseX; + yLast = mouseY; + } +*/ + } + } ); + + + document.addEventListener( 'mouseup', function( evt ) { + drawingCanvas[mode].canvas.style.cursor = pens[mode][color[mode]].cursor; + if ( event ) { + stopDrawing(); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'stopDrawing', timestamp: Date.now() - slideStart, status: { mode, board, color } }; + document.dispatchEvent( message ); +/* if(evt.button == 2){ + } + event.end = Date.now() - slideStart; + if ( event.type == "erase" || event.curve.length > 1 ) { + // do not save a line with a single point only + recordEvent( event ); + } + event = null; +*/ + } + } ); + + + window.addEventListener( "resize", function() { +//console.log("resize"); + // Resize the canvas and draw everything again + var timestamp = Date.now() - slideStart; + if ( !playback ) { + timestamp = getSlideDuration(); + } + +//console.log( drawingCanvas[0].scale + "/" + drawingCanvas[0].xOffset + "/" +drawingCanvas[0].yOffset ); + for (var id = 0; id < 2; id++ ) { + drawingCanvas[id].width = window.innerWidth; + drawingCanvas[id].height = window.innerHeight; + drawingCanvas[id].canvas.width = drawingCanvas[id].width; + drawingCanvas[id].canvas.height = drawingCanvas[id].height; + drawingCanvas[id].context.canvas.width = drawingCanvas[id].width; + drawingCanvas[id].context.canvas.height = drawingCanvas[id].height; + + drawingCanvas[id].scale = Math.min( drawingCanvas[id].width/storage[id].width, drawingCanvas[id].height/storage[id].height ); + drawingCanvas[id].xOffset = (drawingCanvas[id].width - storage[id].width * drawingCanvas[id].scale)/2; + drawingCanvas[id].yOffset = (drawingCanvas[id].height - storage[id].height * drawingCanvas[id].scale)/2; +//console.log( drawingCanvas[id].scale + "/" + drawingCanvas[id].xOffset + "/" +drawingCanvas[id].yOffset ); + } +//console.log( window.innerWidth + "/" + window.innerHeight); + startPlayback( timestamp, mode, true ); + + } ); + + Reveal.addEventListener( 'ready', function( evt ) { +//console.log('ready'); + if ( !printMode ) { + slideStart = Date.now() - getSlideDuration(); + slideIndices = Reveal.getIndices(); + if ( !playback ) { + startPlayback( getSlideDuration(), 0 ); + } + if ( Reveal.isAutoSliding() ) { + var event = new CustomEvent('startplayback'); + event.timestamp = 0; + document.dispatchEvent( event ); + } + updateStorage(); + } + else { +console.log("Create printouts when ready"); + whenReady( createPrintout ); + } + }); + Reveal.addEventListener( 'slidechanged', function( evt ) { +// clearTimeout( slidechangeTimeout ); +//console.log('slidechanged'); + if ( !printMode ) { + slideStart = Date.now() - getSlideDuration(); + slideIndices = Reveal.getIndices(); + closeChalkboard(); + clearCanvas( 0 ); + clearCanvas( 1 ); + if ( !playback ) { + slidechangeTimeout = setTimeout( startPlayback, transition, getSlideDuration(), 0 ); + } + if ( Reveal.isAutoSliding() ) { + var event = new CustomEvent('startplayback'); + event.timestamp = 0; + document.dispatchEvent( event ); + } + + updateStorage(); + } + }); + Reveal.addEventListener( 'fragmentshown', function( evt ) { +// clearTimeout( slidechangeTimeout ); +//console.log('fragmentshown'); + if ( !printMode ) { + slideStart = Date.now() - getSlideDuration(); + slideIndices = Reveal.getIndices(); + closeChalkboard(); + clearCanvas( 0 ); + clearCanvas( 1 ); + if ( Reveal.isAutoSliding() ) { + var event = new CustomEvent('startplayback'); + event.timestamp = 0; + document.dispatchEvent( event ); + } + else if ( !playback ) { + // + startPlayback( getSlideDuration(), 0 ); +// closeChalkboard(); + } + } + }); + Reveal.addEventListener( 'fragmenthidden', function( evt ) { +// clearTimeout( slidechangeTimeout ); +//console.log('fragmenthidden'); + if ( !printMode ) { + slideStart = Date.now() - getSlideDuration(); + slideIndices = Reveal.getIndices(); + closeChalkboard(); + clearCanvas( 0 ); + clearCanvas( 1 ); + if ( Reveal.isAutoSliding() ) { + document.dispatchEvent( new CustomEvent('stopplayback') ); + } + else if ( !playback ) { + startPlayback( getSlideDuration() ); + closeChalkboard(); + } + } + }); + + Reveal.addEventListener( 'autoslideresumed', function( evt ) { +//console.log('autoslideresumed'); + var event = new CustomEvent('startplayback'); + event.timestamp = 0; + document.dispatchEvent( event ); + }); + Reveal.addEventListener( 'autoslidepaused', function( evt ) { +//console.log('autoslidepaused'); + document.dispatchEvent( new CustomEvent('stopplayback') ); + + // advance to end of slide +// closeChalkboard(); + startPlayback( getSlideDuration(), 0 ); + }); + + function toggleNotesCanvas() { + if ( !readOnly ) { + if ( mode == 1 ) { + toggleChalkboard(); + notescanvas.style.background = background[0]; //'rgba(255,0,0,0.5)'; + notescanvas.style.pointerEvents = "auto"; + } + else { + if ( notescanvas.style.pointerEvents != "none" ) { + // hide notes canvas + if ( colorButtons) { + notescanvas.querySelector(".palette").style.visibility = "hidden"; + } + event = null; + notescanvas.style.background = 'rgba(0,0,0,0)'; + notescanvas.style.pointerEvents = "none"; + } + else { + // show notes canvas + if ( colorButtons) { + notescanvas.querySelector(".palette").style.visibility = "visible"; + } + notescanvas.style.background = background[0]; //'rgba(255,0,0,0.5)'; + notescanvas.style.pointerEvents = "auto"; + + var idx = 0; + if (color[mode]) { + idx = color[mode]; + } + + setColor(idx, true); + + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'setcolor', timestamp: Date.now() - slideStart, status: { mode, board, color }, index: idx }; + document.dispatchEvent( message ); + } + } + } + }; + + function toggleChalkboard() { +//console.log("toggleChalkboard " + mode); + if ( mode == 1 ) { + event = null; + if ( !readOnly ) { + recordEvent( { type:"close", begin: Date.now() - slideStart } ); + updateStorage(); + } + closeChalkboard(); + + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'closeChalkboard', timestamp: Date.now() - slideStart, status: { mode, board, color } }; + document.dispatchEvent( message ); + } + else { + showChalkboard(); + if ( !readOnly ) { + recordEvent( { type:"open", begin: Date.now() - slideStart } ); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'showChalkboard', timestamp: Date.now() - slideStart, status: { mode, board, color } }; + document.dispatchEvent( message ); + + var idx = 0; + + if (rememberColor[mode]) { + idx = color[mode]; + } + + setColor(idx, true); + + // broadcast + message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'setcolor', timestamp: Date.now() - slideStart, index: idx, status: { mode, board, color } }; + document.dispatchEvent( message ); + + } + } + }; + + function clear() { + if ( !readOnly ) { + recordEvent( { type:"clear", begin: Date.now() - slideStart } ); + clearCanvas( mode ); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'clear', timestamp: Date.now() - slideStart, status: { mode, board, color } }; + document.dispatchEvent( message ); + } + }; + + function colorIndex( idx ) { + if ( !readOnly ) { + setColor(idx, true); +// recordEvent( { type: "setcolor", index: idx, begin: Date.now() - slideStart } ); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'setcolor', timestamp: Date.now() - slideStart, index: idx, status: { mode, board, color } }; + document.dispatchEvent( message ); + } + } + + function colorNext() { + if ( !readOnly ) { + let idx = cycleColorNext(); + setColor(idx, true); +// recordEvent( { type: "setcolor", index: idx, begin: Date.now() - slideStart } ); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'setcolor', timestamp: Date.now() - slideStart, index: idx, status: { mode, board, color } }; + document.dispatchEvent( message ); + } + } + + function colorPrev() { + if ( !readOnly ) { + let idx = cycleColorPrev(); + setColor(idx, true); +// recordEvent( { type: "setcolor", index: idx, begin: Date.now() - slideStart } ); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'setcolor', timestamp: Date.now() - slideStart, index: idx, status: { mode, board, color } }; + document.dispatchEvent( message ); + } + } + + function resetSlide( force ) { + var ok = force || confirm("Please confirm to delete chalkboard drawings on this slide!"); + if ( ok ) { +//console.log("resetSlide "); + stopPlayback(); + slideStart = Date.now(); + event = null; + closeChalkboard(); + + clearCanvas( 0 ); + clearCanvas( 1 ); + + mode = 1; + var slideData = getSlideData(); + slideData.duration = 0; + slideData.events = []; + mode = 0; + var slideData = getSlideData(); + slideData.duration = 0; + slideData.events = []; + + updateStorage(); + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'resetSlide', timestamp: Date.now() - slideStart, status: { mode, board, color } }; + document.dispatchEvent( message ); + } + }; + + function resetStorage( force ) { + var ok = force || confirm("Please confirm to delete all chalkboard drawings!"); + if ( ok ) { + stopPlayback(); + slideStart = Date.now(); + clearCanvas( 0 ); + clearCanvas( 1 ); + if ( mode == 1 ) { + event = null; + closeChalkboard(); + } + + storage = [ + { width: Reveal.getConfig().width, height: Reveal.getConfig().height, data: []}, + { width: Reveal.getConfig().width, height: Reveal.getConfig().height, data: []} + ]; +/* + storage = [ + { width: drawingCanvas[0].width - 2 * drawingCanvas[0].xOffset, height: drawingCanvas[0].height - 2 * drawingCanvas[0].yOffset, data: []}, + { width: drawingCanvas[1].width, height: drawingCanvas[1].height, data: []} + ]; +*/ + if ( config.storage ) { + sessionStorage.setItem( config.storage, null ) + } + // broadcast + var message = new CustomEvent(messageType); + message.content = { sender: 'chalkboard-plugin', type: 'init', timestamp: Date.now() - slideStart, storage: storage, status: { mode, board, color } }; + document.dispatchEvent( message ); + } + }; + + +/* + this.drawWithBoardmarker = drawWithBoardmarker; + this.drawWithChalk = drawWithChalk; + this.startRecording = startRecording; +*/ + this.toggleNotesCanvas = toggleNotesCanvas; + this.toggleChalkboard = toggleChalkboard; + this.colorIndex = colorIndex; + this.colorNext = colorNext; + this.colorPrev = colorPrev; + this.clear = clear; + this.reset = resetSlide; + this.resetAll = resetStorage; + this.download = downloadData; + this.updateStorage = updateStorage; + this.getData = getData; + this.configure = configure; + + + for (var key in keyBindings) { + if ( keyBindings[key] ) { + Reveal.addKeyBinding( keyBindings[key], RevealChalkboard[key] ); + } + }; + + return this; +}; diff --git a/slides/revealjs-plugins/chalkboard/style.css b/slides/revealjs-plugins/chalkboard/style.css new file mode 100644 index 0000000..4a60a93 --- /dev/null +++ b/slides/revealjs-plugins/chalkboard/style.css @@ -0,0 +1,38 @@ +div.palette, div.boardhandle { + position: absolute; +/* + height: 260px; + margin: -130px 0 0 0px; +*/ + top: 50%; + transform: translateY(-50%); + font-size: 24px; + border-radius: 10px; + border-top: 4px solid #222; + border-right: 4px solid #222; + border-bottom: 4px solid #222; + background: black; + transition: transform 0.3s; +} + +div.palette { + left: -10px; + padding-left:10px; +} + +div.boardhandle { + right: -10px; + padding-right:10px; +} + +div.palette > ul, +div.boardhandle > ul { + list-style-type: none; + margin: 0; + padding: 0; +} + +div.palette > ul > li, +div.boardhandle > ul > li { + margin: 10px; +} diff --git a/slides/revealjs-plugins/menu/LICENSE b/slides/revealjs-plugins/menu/LICENSE new file mode 100644 index 0000000..e1ec16e --- /dev/null +++ b/slides/revealjs-plugins/menu/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2020 Greg Denehy + +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/slides/revealjs-plugins/menu/README.md b/slides/revealjs-plugins/menu/README.md new file mode 100644 index 0000000..3b0de0f --- /dev/null +++ b/slides/revealjs-plugins/menu/README.md @@ -0,0 +1,368 @@ +# reveal.js-menu + +A slideout menu plugin for [Reveal.js](https://github.com/hakimel/reveal.js) to quickly jump to any slide by title. Also optionally change the theme and set the default transition. [Check out the live demo](https://denehyg.github.io/reveal.js-menu) + +## Installation + +### Bower + +Download and install the package in your project: + +`bower install reveal.js-menu` + +Add the plugin to your presentation, as below. + +```javascript + + +``` + +### npm + +Download and install the package in your project: + +`npm install --save reveal.js-menu` + +Add the plugin to your presentation, as below. + +```javascript + + +``` + +### Manual + +Copy this repository into the plugins folder of your reveal.js presentation, ie `plugins/menu`. + +Add the plugin to the dependencies in your presentation, as below. + +```javascript + + +``` + +## Configuration + +You can configure the menu for your presentation by providing a `menu` option in the reveal.js initialization options. Note that all config values are optional and will default as specified below. + +```javascript +Reveal.initialize({ + // ... + + menu: { + // Specifies which side of the presentation the menu will + // be shown. Use 'left' or 'right'. + side: 'left', + + // Specifies the width of the menu. + // Can be one of the following: + // 'normal', 'wide', 'third', 'half', 'full', or + // any valid css length value + width: 'normal', + + // Add slide numbers to the titles in the slide list. + // Use 'true' or format string (same as reveal.js slide numbers) + numbers: false, + + // Specifies which slide elements will be used for generating + // the slide titles in the menu. The default selects the first + // heading element found in the slide, but you can specify any + // valid css selector and the text from the first matching + // element will be used. + // Note: that a section data-menu-title attribute or an element + // with a menu-title class will take precedence over this option + titleSelector: 'h1, h2, h3, h4, h5, h6', + + // If slides do not have a matching title, attempt to use the + // start of the text content as the title instead + useTextContentForMissingTitles: false, + + // Hide slides from the menu that do not have a title. + // Set to 'true' to only list slides with titles. + hideMissingTitles: false, + + // Adds markers to the slide titles to indicate the + // progress through the presentation. Set to 'false' + // to hide the markers. + markers: true, + + // Specify custom panels to be included in the menu, by + // providing an array of objects with 'title', 'icon' + // properties, and either a 'src' or 'content' property. + custom: false, + + // Specifies the themes that will be available in the themes + // menu panel. Set to 'true' to show the themes menu panel + // with the default themes list. Alternatively, provide an + // array to specify the themes to make available in the + // themes menu panel, for example... + // + // [ + // { name: 'Black', theme: 'dist/theme/black.css' }, + // { name: 'White', theme: 'dist/theme/white.css' }, + // { name: 'League', theme: 'dist/theme/league.css' }, + // { + // name: 'Dark', + // theme: 'lib/reveal.js/dist/theme/black.css', + // highlightTheme: 'lib/reveal.js/plugin/highlight/monokai.css' + // }, + // { + // name: 'Code: Zenburn', + // highlightTheme: 'lib/reveal.js/plugin/highlight/zenburn.css' + // } + // ] + // + // Note: specifying highlightTheme without a theme will + // change the code highlight theme while leaving the + // presentation theme unchanged. + themes: false, + + // Specifies the path to the default theme files. If your + // presentation uses a different path to the standard reveal + // layout then you need to provide this option, but only + // when 'themes' is set to 'true'. If you provide your own + // list of themes or 'themes' is set to 'false' the + // 'themesPath' option is ignored. + themesPath: 'dist/theme/', + + // Specifies if the transitions menu panel will be shown. + // Set to 'true' to show the transitions menu panel with + // the default transitions list. Alternatively, provide an + // array to specify the transitions to make available in + // the transitions panel, for example... + // ['None', 'Fade', 'Slide'] + transitions: false, + + // Adds a menu button to the slides to open the menu panel. + // Set to 'false' to hide the button. + openButton: true, + + // If 'true' allows the slide number in the presentation to + // open the menu panel. The reveal.js slideNumber option must + // be displayed for this to take effect + openSlideNumber: false, + + // If true allows the user to open and navigate the menu using + // the keyboard. Standard keyboard interaction with reveal + // will be disabled while the menu is open. + keyboard: true, + + // Normally the menu will close on user actions such as + // selecting a menu item, or clicking the presentation area. + // If 'true', the sticky option will leave the menu open + // until it is explicitly closed, that is, using the close + // button or pressing the ESC or m key (when the keyboard + // interaction option is enabled). + sticky: false, + + // If 'true' standard menu items will be automatically opened + // when navigating using the keyboard. Note: this only takes + // effect when both the 'keyboard' and 'sticky' options are enabled. + autoOpen: true, + + // If 'true' the menu will not be created until it is explicitly + // requested by calling RevealMenu.init(). Note this will delay + // the creation of all menu panels, including custom panels, and + // the menu button. + delayInit: false, + + // If 'true' the menu will be shown when the menu is initialised. + openOnInit: false, + + // By default the menu will load it's own font-awesome library + // icons. If your presentation needs to load a different + // font-awesome library the 'loadIcons' option can be set to false + // and the menu will not attempt to load the font-awesome library. + loadIcons: true + } +}); +``` + +### Themes Stylesheet + +If you are using the themes panel you need to ensure the theme stylesheet in the presentation uses the `id="theme"` attribute. For example... + +```html + +``` + +If your themes configuration includes code highlight themes you need to ensure the highlights theme stylesheet in the presentation uses the `id="highlight-theme"` attribute. For example... + +```html + +``` + +## Slide Titles + +The slide titles used in the menu can be supplied explicitly or are taken directly from the presentation, using the following rules... + +###### 1. The section's `data-menu-title` attribute. + +If the slide's section element contains a `data-menu-title` attribute this will be used for the slide title in the menu. For example... + +```html +
+

Title

+

...

+
+``` + +###### 2. Any element with the class `menu-title`. + +If the slide's section contains an element with the class `menu-title` then the element's text will be used for the title. The first such element found will be used if there are more than one. Note the element need not be displayed to be used. For example... + +```html +
+

Title

+ +

...

+
+``` + +###### 3. The first heading found or a custom element selector + +The `titleSelector` option can be used to customise the elements that will be used to generate the slide titles in the menu. The default option selects the first heading element found in the slide. For example... + +```html +
+

This will be the slide title in the menu

+

Title

+

...

+
+``` + +Any valid CSS selector should work but note the selector will only be applied to elements contained within the slide section. You could use the `'h1'` selector to only use level 1 headings or `'p'` to use the first paragraph element. For example, `titleSelector: 'p.lead'` would be used like this... + +```html +
+

Title

+

This will be the slide title in the menu

+

...

+
+``` + +Using `titleSelector: ''` will ignore all elements and no title will be provided, unless the slide section contains a `data-menu-title` attribute or an element with the `menu-title` class. + +###### 4. No title is provided + +If no title can be found using the above methods, a default title incorporating the slide number will be used. For example, the following would result in a slide title in the format of 'Slide 12'... + +```html +
+

...

+
+``` + +If the `hideMissingTitles` option is set to `true`, however, the slide will not be listed in the menu. + +## Custom Menu Panels + +Additional custom panels can be added the menu using the `custom` option. + +```javascript +Reveal.initialize({ + // ... + + menu: { + // ... + + custom: [ + { + title: 'Links', + icon: '', + src: 'links.html' + }, + { + title: 'About', + icon: '', + content: '

This slidedeck is created with reveal.js

' + } + ] + } +}); +``` + +`title` and `icon` are used for the toolbar buttons at the top of the menu. There are two approaches you can use to provide content for the panels... + +- You can provide a URL in `src` to load html from another file. +- Alternatively, you can provide html in `content` and this will be added to the custom panel. + +###### Custom slide menu items + +You can provide menu items in your custom panels using the following format. This allows you to define your own navigation links for your presentation. + +```html +

Links

+ +``` + +You are not limited to linking to presentation slides. You can provide any link you wish. + +```html +

External Links

+ +``` + +Using menu items enables keyboard navigation of your links as with the other panels. However, you don't have to use menu items for your links. You can simply provide standard links and unordered lists in your html. Notice you can provide your custom menu items mixed with other html if you wish. + +## Ready Event + +A 'menu-ready' event is fired when reveal.js-menu has loaded all non-async dependencies and is ready to start navigating. + +```javascript +Reveal.addEventListener('menu-ready', function (event) { + // your code +}); +``` + +## API + +The `RevealMenu` object exposes a JavaScript API for controlling the menu: + +| Function | Description | +| ----------------------- | ------------------------------------------------------------------------------------------------------------ | +| toggle(event) | Toggles the open state of the menu, ie open if it is closed, and close if it is open | +| openMenu(event) | Opens the menu | +| closeMenu(event, force) | Closes the menu. To force the menu to close (ie when `sticky` option is `true`) call `closeMenu(null, true)` | +| openPanel(event, ref) | Opens the menu to a specific panel, passing the name of the panel or the panel element itself | +| isOpen() | Returns true if the menu is open | +| initialiseMenu() | Initialises the menu if it has not already been initialised. Used in conjunction with the `delayInit` option | +| isMenuInitialised() | Returns true if the menu has been initialised | + +## Compatibility + +reveal.js-menu v2.0 is built for reveal.js v4. It will not work with reveal.js v3. If you require a menu for reveal.js v3 you will need to install reveal.js-menu v1.2.0. + +v2.0 also introduces API changes that are not backwards compatible. `init()` has been renamed to `initMenu()` to deconflict with the reveal.js v4 plugin API. `isInit()` has also been changed to `isMenuInitialised()`. + +## License + +MIT licensed + +Copyright (C) 2020 Greg Denehy diff --git a/slides/revealjs-plugins/menu/font-awesome/LICENSE.txt b/slides/revealjs-plugins/menu/font-awesome/LICENSE.txt new file mode 100644 index 0000000..28c1c4b --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/LICENSE.txt @@ -0,0 +1,34 @@ +Font Awesome Free License +------------------------- + +Font Awesome Free is free, open source, and GPL friendly. You can use it for +commercial projects, open source projects, or really almost whatever you want. +Full Font Awesome Free license: https://fontawesome.com/license. + +# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) +In the Font Awesome Free download, the CC BY 4.0 license applies to all icons +packaged as SVG and JS file types. + +# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL) +In the Font Awesome Free download, the SIL OLF license applies to all icons +packaged as web and desktop font files. + +# Code: MIT License (https://opensource.org/licenses/MIT) +In the Font Awesome Free download, the MIT license applies to all non-font and +non-icon files. + +# Attribution +Attribution is required by MIT, SIL OLF, and CC BY licenses. Downloaded Font +Awesome Free files already contain embedded comments with sufficient +attribution, so you shouldn't need to do anything additional when using these +files normally. + +We've kept attribution comments terse, so we ask that you do not actively work +to remove them from files, especially code. They're a great way for folks to +learn about Font Awesome. + +# Brand Icons +All brand icons are trademarks of their respective owners. The use of these +trademarks does not indicate endorsement of the trademark holder by Font +Awesome, nor vice versa. **Please do not use brand logos for any purpose except +to represent the company, product, or service to which they refer.** diff --git a/slides/revealjs-plugins/menu/font-awesome/css/all.css b/slides/revealjs-plugins/menu/font-awesome/css/all.css new file mode 100644 index 0000000..7fec2e3 --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/css/all.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/slides/revealjs-plugins/menu/font-awesome/css/brands.css b/slides/revealjs-plugins/menu/font-awesome/css/brands.css new file mode 100644 index 0000000..2d9e4c6 --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/css/brands.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"} \ No newline at end of file diff --git a/slides/revealjs-plugins/menu/font-awesome/css/fontawesome.css b/slides/revealjs-plugins/menu/font-awesome/css/fontawesome.css new file mode 100644 index 0000000..68b26ef --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/css/fontawesome.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-concierge-bell:before{content:"\f562"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/slides/revealjs-plugins/menu/font-awesome/css/regular.css b/slides/revealjs-plugins/menu/font-awesome/css/regular.css new file mode 100644 index 0000000..02b22fa --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/css/regular.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400} \ No newline at end of file diff --git a/slides/revealjs-plugins/menu/font-awesome/css/solid.css b/slides/revealjs-plugins/menu/font-awesome/css/solid.css new file mode 100644 index 0000000..aed56a2 --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/css/solid.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} \ No newline at end of file diff --git a/slides/revealjs-plugins/menu/font-awesome/css/svg-with-js.css b/slides/revealjs-plugins/menu/font-awesome/css/svg-with-js.css new file mode 100644 index 0000000..504203d --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/css/svg-with-js.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;transform:translate(-50%,-50%);transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;transform:scale(.25);transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;transform:scale(.25);transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;transform:scale(.25);transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;transform:scale(.25);transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;transform:scale(.25);transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1em}.svg-inline--fa.fa-stack-2x{height:2em;width:2em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/slides/revealjs-plugins/menu/font-awesome/css/v4-shims.css b/slides/revealjs-plugins/menu/font-awesome/css/v4-shims.css new file mode 100644 index 0000000..b10f655 --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/css/v4-shims.css @@ -0,0 +1,2170 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa.fa-glass:before { + content: "\f000"; } + +.fa.fa-meetup { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-star-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-star-o:before { + content: "\f005"; } + +.fa.fa-remove:before { + content: "\f00d"; } + +.fa.fa-close:before { + content: "\f00d"; } + +.fa.fa-gear:before { + content: "\f013"; } + +.fa.fa-trash-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-trash-o:before { + content: "\f2ed"; } + +.fa.fa-file-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-o:before { + content: "\f15b"; } + +.fa.fa-clock-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-clock-o:before { + content: "\f017"; } + +.fa.fa-arrow-circle-o-down { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-down:before { + content: "\f358"; } + +.fa.fa-arrow-circle-o-up { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-up:before { + content: "\f35b"; } + +.fa.fa-play-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-play-circle-o:before { + content: "\f144"; } + +.fa.fa-repeat:before { + content: "\f01e"; } + +.fa.fa-rotate-right:before { + content: "\f01e"; } + +.fa.fa-refresh:before { + content: "\f021"; } + +.fa.fa-list-alt { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-dedent:before { + content: "\f03b"; } + +.fa.fa-video-camera:before { + content: "\f03d"; } + +.fa.fa-picture-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-picture-o:before { + content: "\f03e"; } + +.fa.fa-photo { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-photo:before { + content: "\f03e"; } + +.fa.fa-image { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-image:before { + content: "\f03e"; } + +.fa.fa-pencil:before { + content: "\f303"; } + +.fa.fa-map-marker:before { + content: "\f3c5"; } + +.fa.fa-pencil-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-pencil-square-o:before { + content: "\f044"; } + +.fa.fa-share-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-share-square-o:before { + content: "\f14d"; } + +.fa.fa-check-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-check-square-o:before { + content: "\f14a"; } + +.fa.fa-arrows:before { + content: "\f0b2"; } + +.fa.fa-times-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-times-circle-o:before { + content: "\f057"; } + +.fa.fa-check-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-check-circle-o:before { + content: "\f058"; } + +.fa.fa-mail-forward:before { + content: "\f064"; } + +.fa.fa-eye { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-eye-slash { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-warning:before { + content: "\f071"; } + +.fa.fa-calendar:before { + content: "\f073"; } + +.fa.fa-arrows-v:before { + content: "\f338"; } + +.fa.fa-arrows-h:before { + content: "\f337"; } + +.fa.fa-bar-chart { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-bar-chart:before { + content: "\f080"; } + +.fa.fa-bar-chart-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-bar-chart-o:before { + content: "\f080"; } + +.fa.fa-twitter-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-facebook-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gears:before { + content: "\f085"; } + +.fa.fa-thumbs-o-up { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-up:before { + content: "\f164"; } + +.fa.fa-thumbs-o-down { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-down:before { + content: "\f165"; } + +.fa.fa-heart-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-heart-o:before { + content: "\f004"; } + +.fa.fa-sign-out:before { + content: "\f2f5"; } + +.fa.fa-linkedin-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-linkedin-square:before { + content: "\f08c"; } + +.fa.fa-thumb-tack:before { + content: "\f08d"; } + +.fa.fa-external-link:before { + content: "\f35d"; } + +.fa.fa-sign-in:before { + content: "\f2f6"; } + +.fa.fa-github-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-lemon-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-lemon-o:before { + content: "\f094"; } + +.fa.fa-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-square-o:before { + content: "\f0c8"; } + +.fa.fa-bookmark-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-bookmark-o:before { + content: "\f02e"; } + +.fa.fa-twitter { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-facebook { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-facebook:before { + content: "\f39e"; } + +.fa.fa-facebook-f { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-facebook-f:before { + content: "\f39e"; } + +.fa.fa-github { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-credit-card { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-feed:before { + content: "\f09e"; } + +.fa.fa-hdd-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hdd-o:before { + content: "\f0a0"; } + +.fa.fa-hand-o-right { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-o-right:before { + content: "\f0a4"; } + +.fa.fa-hand-o-left { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-o-left:before { + content: "\f0a5"; } + +.fa.fa-hand-o-up { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-o-up:before { + content: "\f0a6"; } + +.fa.fa-hand-o-down { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-o-down:before { + content: "\f0a7"; } + +.fa.fa-arrows-alt:before { + content: "\f31e"; } + +.fa.fa-group:before { + content: "\f0c0"; } + +.fa.fa-chain:before { + content: "\f0c1"; } + +.fa.fa-scissors:before { + content: "\f0c4"; } + +.fa.fa-files-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-files-o:before { + content: "\f0c5"; } + +.fa.fa-floppy-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-floppy-o:before { + content: "\f0c7"; } + +.fa.fa-navicon:before { + content: "\f0c9"; } + +.fa.fa-reorder:before { + content: "\f0c9"; } + +.fa.fa-pinterest { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pinterest-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus:before { + content: "\f0d5"; } + +.fa.fa-money { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-money:before { + content: "\f3d1"; } + +.fa.fa-unsorted:before { + content: "\f0dc"; } + +.fa.fa-sort-desc:before { + content: "\f0dd"; } + +.fa.fa-sort-asc:before { + content: "\f0de"; } + +.fa.fa-linkedin { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-linkedin:before { + content: "\f0e1"; } + +.fa.fa-rotate-left:before { + content: "\f0e2"; } + +.fa.fa-legal:before { + content: "\f0e3"; } + +.fa.fa-tachometer:before { + content: "\f3fd"; } + +.fa.fa-dashboard:before { + content: "\f3fd"; } + +.fa.fa-comment-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-comment-o:before { + content: "\f075"; } + +.fa.fa-comments-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-comments-o:before { + content: "\f086"; } + +.fa.fa-flash:before { + content: "\f0e7"; } + +.fa.fa-clipboard { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-paste { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-paste:before { + content: "\f328"; } + +.fa.fa-lightbulb-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-lightbulb-o:before { + content: "\f0eb"; } + +.fa.fa-exchange:before { + content: "\f362"; } + +.fa.fa-cloud-download:before { + content: "\f381"; } + +.fa.fa-cloud-upload:before { + content: "\f382"; } + +.fa.fa-bell-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-bell-o:before { + content: "\f0f3"; } + +.fa.fa-cutlery:before { + content: "\f2e7"; } + +.fa.fa-file-text-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-text-o:before { + content: "\f15c"; } + +.fa.fa-building-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-building-o:before { + content: "\f1ad"; } + +.fa.fa-hospital-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hospital-o:before { + content: "\f0f8"; } + +.fa.fa-tablet:before { + content: "\f3fa"; } + +.fa.fa-mobile:before { + content: "\f3cd"; } + +.fa.fa-mobile-phone:before { + content: "\f3cd"; } + +.fa.fa-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-circle-o:before { + content: "\f111"; } + +.fa.fa-mail-reply:before { + content: "\f3e5"; } + +.fa.fa-github-alt { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-folder-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-folder-o:before { + content: "\f07b"; } + +.fa.fa-folder-open-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-folder-open-o:before { + content: "\f07c"; } + +.fa.fa-smile-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-smile-o:before { + content: "\f118"; } + +.fa.fa-frown-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-frown-o:before { + content: "\f119"; } + +.fa.fa-meh-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-meh-o:before { + content: "\f11a"; } + +.fa.fa-keyboard-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-keyboard-o:before { + content: "\f11c"; } + +.fa.fa-flag-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-flag-o:before { + content: "\f024"; } + +.fa.fa-mail-reply-all:before { + content: "\f122"; } + +.fa.fa-star-half-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-star-half-o:before { + content: "\f089"; } + +.fa.fa-star-half-empty { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-star-half-empty:before { + content: "\f089"; } + +.fa.fa-star-half-full { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-star-half-full:before { + content: "\f089"; } + +.fa.fa-code-fork:before { + content: "\f126"; } + +.fa.fa-chain-broken:before { + content: "\f127"; } + +.fa.fa-shield:before { + content: "\f3ed"; } + +.fa.fa-calendar-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-calendar-o:before { + content: "\f133"; } + +.fa.fa-maxcdn { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-html5 { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-css3 { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ticket:before { + content: "\f3ff"; } + +.fa.fa-minus-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-minus-square-o:before { + content: "\f146"; } + +.fa.fa-level-up:before { + content: "\f3bf"; } + +.fa.fa-level-down:before { + content: "\f3be"; } + +.fa.fa-pencil-square:before { + content: "\f14b"; } + +.fa.fa-external-link-square:before { + content: "\f360"; } + +.fa.fa-compass { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down:before { + content: "\f150"; } + +.fa.fa-toggle-down { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-toggle-down:before { + content: "\f150"; } + +.fa.fa-caret-square-o-up { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-up:before { + content: "\f151"; } + +.fa.fa-toggle-up { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-toggle-up:before { + content: "\f151"; } + +.fa.fa-caret-square-o-right { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-right:before { + content: "\f152"; } + +.fa.fa-toggle-right { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-toggle-right:before { + content: "\f152"; } + +.fa.fa-eur:before { + content: "\f153"; } + +.fa.fa-euro:before { + content: "\f153"; } + +.fa.fa-gbp:before { + content: "\f154"; } + +.fa.fa-usd:before { + content: "\f155"; } + +.fa.fa-dollar:before { + content: "\f155"; } + +.fa.fa-inr:before { + content: "\f156"; } + +.fa.fa-rupee:before { + content: "\f156"; } + +.fa.fa-jpy:before { + content: "\f157"; } + +.fa.fa-cny:before { + content: "\f157"; } + +.fa.fa-rmb:before { + content: "\f157"; } + +.fa.fa-yen:before { + content: "\f157"; } + +.fa.fa-rub:before { + content: "\f158"; } + +.fa.fa-ruble:before { + content: "\f158"; } + +.fa.fa-rouble:before { + content: "\f158"; } + +.fa.fa-krw:before { + content: "\f159"; } + +.fa.fa-won:before { + content: "\f159"; } + +.fa.fa-btc { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin:before { + content: "\f15a"; } + +.fa.fa-file-text:before { + content: "\f15c"; } + +.fa.fa-sort-alpha-asc:before { + content: "\f15d"; } + +.fa.fa-sort-alpha-desc:before { + content: "\f15e"; } + +.fa.fa-sort-amount-asc:before { + content: "\f160"; } + +.fa.fa-sort-amount-desc:before { + content: "\f161"; } + +.fa.fa-sort-numeric-asc:before { + content: "\f162"; } + +.fa.fa-sort-numeric-desc:before { + content: "\f163"; } + +.fa.fa-youtube-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-youtube { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-xing { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-xing-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-youtube-play { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-youtube-play:before { + content: "\f167"; } + +.fa.fa-dropbox { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-stack-overflow { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-instagram { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-flickr { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-adn { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square:before { + content: "\f171"; } + +.fa.fa-tumblr { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-tumblr-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-long-arrow-down:before { + content: "\f309"; } + +.fa.fa-long-arrow-up:before { + content: "\f30c"; } + +.fa.fa-long-arrow-left:before { + content: "\f30a"; } + +.fa.fa-long-arrow-right:before { + content: "\f30b"; } + +.fa.fa-apple { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-windows { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-android { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-linux { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-dribbble { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-skype { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-foursquare { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-trello { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gratipay { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gittip { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gittip:before { + content: "\f184"; } + +.fa.fa-sun-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-sun-o:before { + content: "\f185"; } + +.fa.fa-moon-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-moon-o:before { + content: "\f186"; } + +.fa.fa-vk { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-weibo { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-renren { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pagelines { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-stack-exchange { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right:before { + content: "\f35a"; } + +.fa.fa-arrow-circle-o-left { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-left:before { + content: "\f359"; } + +.fa.fa-caret-square-o-left { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-left:before { + content: "\f191"; } + +.fa.fa-toggle-left { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-toggle-left:before { + content: "\f191"; } + +.fa.fa-dot-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-dot-circle-o:before { + content: "\f192"; } + +.fa.fa-vimeo-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-try:before { + content: "\f195"; } + +.fa.fa-turkish-lira:before { + content: "\f195"; } + +.fa.fa-plus-square-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-plus-square-o:before { + content: "\f0fe"; } + +.fa.fa-slack { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wordpress { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-openid { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-institution:before { + content: "\f19c"; } + +.fa.fa-bank:before { + content: "\f19c"; } + +.fa.fa-mortar-board:before { + content: "\f19d"; } + +.fa.fa-yahoo { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-reddit { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-reddit-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-stumbleupon-circle { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-stumbleupon { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-delicious { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-digg { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-pp { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-alt { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-drupal { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-joomla { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-spoon:before { + content: "\f2e5"; } + +.fa.fa-behance { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-behance-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-steam { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-steam-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-automobile:before { + content: "\f1b9"; } + +.fa.fa-cab:before { + content: "\f1ba"; } + +.fa.fa-envelope-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-envelope-o:before { + content: "\f0e0"; } + +.fa.fa-deviantart { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-soundcloud { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-file-pdf-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-pdf-o:before { + content: "\f1c1"; } + +.fa.fa-file-word-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-word-o:before { + content: "\f1c2"; } + +.fa.fa-file-excel-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-excel-o:before { + content: "\f1c3"; } + +.fa.fa-file-powerpoint-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-powerpoint-o:before { + content: "\f1c4"; } + +.fa.fa-file-image-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-image-o:before { + content: "\f1c5"; } + +.fa.fa-file-photo-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-photo-o:before { + content: "\f1c5"; } + +.fa.fa-file-picture-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-picture-o:before { + content: "\f1c5"; } + +.fa.fa-file-archive-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-archive-o:before { + content: "\f1c6"; } + +.fa.fa-file-zip-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-zip-o:before { + content: "\f1c6"; } + +.fa.fa-file-audio-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-audio-o:before { + content: "\f1c7"; } + +.fa.fa-file-sound-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-sound-o:before { + content: "\f1c7"; } + +.fa.fa-file-video-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-video-o:before { + content: "\f1c8"; } + +.fa.fa-file-movie-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-movie-o:before { + content: "\f1c8"; } + +.fa.fa-file-code-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-file-code-o:before { + content: "\f1c9"; } + +.fa.fa-vine { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-codepen { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-jsfiddle { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-life-ring { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-life-bouy { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-life-bouy:before { + content: "\f1cd"; } + +.fa.fa-life-buoy { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-life-buoy:before { + content: "\f1cd"; } + +.fa.fa-life-saver { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-life-saver:before { + content: "\f1cd"; } + +.fa.fa-support { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-support:before { + content: "\f1cd"; } + +.fa.fa-circle-o-notch:before { + content: "\f1ce"; } + +.fa.fa-rebel { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ra { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ra:before { + content: "\f1d0"; } + +.fa.fa-resistance { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-resistance:before { + content: "\f1d0"; } + +.fa.fa-empire { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ge { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ge:before { + content: "\f1d1"; } + +.fa.fa-git-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-git { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-hacker-news { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square:before { + content: "\f1d4"; } + +.fa.fa-yc-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-yc-square:before { + content: "\f1d4"; } + +.fa.fa-tencent-weibo { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-qq { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-weixin { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wechat { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wechat:before { + content: "\f1d7"; } + +.fa.fa-send:before { + content: "\f1d8"; } + +.fa.fa-paper-plane-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-paper-plane-o:before { + content: "\f1d8"; } + +.fa.fa-send-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-send-o:before { + content: "\f1d8"; } + +.fa.fa-circle-thin { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-circle-thin:before { + content: "\f111"; } + +.fa.fa-header:before { + content: "\f1dc"; } + +.fa.fa-sliders:before { + content: "\f1de"; } + +.fa.fa-futbol-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-futbol-o:before { + content: "\f1e3"; } + +.fa.fa-soccer-ball-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-soccer-ball-o:before { + content: "\f1e3"; } + +.fa.fa-slideshare { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-twitch { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-yelp { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-newspaper-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-newspaper-o:before { + content: "\f1ea"; } + +.fa.fa-paypal { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-wallet { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-visa { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-mastercard { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-discover { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-amex { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-paypal { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-stripe { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bell-slash-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-bell-slash-o:before { + content: "\f1f6"; } + +.fa.fa-trash:before { + content: "\f2ed"; } + +.fa.fa-copyright { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-eyedropper:before { + content: "\f1fb"; } + +.fa.fa-area-chart:before { + content: "\f1fe"; } + +.fa.fa-pie-chart:before { + content: "\f200"; } + +.fa.fa-line-chart:before { + content: "\f201"; } + +.fa.fa-lastfm { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-lastfm-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ioxhost { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-angellist { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-cc:before { + content: "\f20a"; } + +.fa.fa-ils:before { + content: "\f20b"; } + +.fa.fa-shekel:before { + content: "\f20b"; } + +.fa.fa-sheqel:before { + content: "\f20b"; } + +.fa.fa-meanpath { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-meanpath:before { + content: "\f2b4"; } + +.fa.fa-buysellads { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-connectdevelop { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-dashcube { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-forumbee { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-leanpub { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-sellsy { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-shirtsinbulk { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-simplybuilt { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-skyatlas { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-diamond { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-diamond:before { + content: "\f3a5"; } + +.fa.fa-intersex:before { + content: "\f224"; } + +.fa.fa-facebook-official { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-facebook-official:before { + content: "\f09a"; } + +.fa.fa-pinterest-p { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-whatsapp { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-hotel:before { + content: "\f236"; } + +.fa.fa-viacoin { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-medium { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-yc { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-yc:before { + content: "\f23b"; } + +.fa.fa-optin-monster { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-opencart { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-expeditedssl { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-battery-4:before { + content: "\f240"; } + +.fa.fa-battery:before { + content: "\f240"; } + +.fa.fa-battery-3:before { + content: "\f241"; } + +.fa.fa-battery-2:before { + content: "\f242"; } + +.fa.fa-battery-1:before { + content: "\f243"; } + +.fa.fa-battery-0:before { + content: "\f244"; } + +.fa.fa-object-group { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-object-ungroup { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o:before { + content: "\f249"; } + +.fa.fa-cc-jcb { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-cc-diners-club { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-clone { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hourglass-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hourglass-o:before { + content: "\f254"; } + +.fa.fa-hourglass-1:before { + content: "\f251"; } + +.fa.fa-hourglass-2:before { + content: "\f252"; } + +.fa.fa-hourglass-3:before { + content: "\f253"; } + +.fa.fa-hand-rock-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-rock-o:before { + content: "\f255"; } + +.fa.fa-hand-grab-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-grab-o:before { + content: "\f255"; } + +.fa.fa-hand-paper-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-paper-o:before { + content: "\f256"; } + +.fa.fa-hand-stop-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-stop-o:before { + content: "\f256"; } + +.fa.fa-hand-scissors-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-scissors-o:before { + content: "\f257"; } + +.fa.fa-hand-lizard-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-lizard-o:before { + content: "\f258"; } + +.fa.fa-hand-spock-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-spock-o:before { + content: "\f259"; } + +.fa.fa-hand-pointer-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-pointer-o:before { + content: "\f25a"; } + +.fa.fa-hand-peace-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-hand-peace-o:before { + content: "\f25b"; } + +.fa.fa-registered { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-creative-commons { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gg { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gg-circle { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-tripadvisor { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-get-pocket { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wikipedia-w { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-safari { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-chrome { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-firefox { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-opera { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-internet-explorer { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-television:before { + content: "\f26c"; } + +.fa.fa-contao { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-500px { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-amazon { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-calendar-plus-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-calendar-plus-o:before { + content: "\f271"; } + +.fa.fa-calendar-minus-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-calendar-minus-o:before { + content: "\f272"; } + +.fa.fa-calendar-times-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-calendar-times-o:before { + content: "\f273"; } + +.fa.fa-calendar-check-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-calendar-check-o:before { + content: "\f274"; } + +.fa.fa-map-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-map-o:before { + content: "\f279"; } + +.fa.fa-commenting { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-commenting:before { + content: "\f4ad"; } + +.fa.fa-commenting-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-commenting-o:before { + content: "\f4ad"; } + +.fa.fa-houzz { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-vimeo { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-vimeo:before { + content: "\f27d"; } + +.fa.fa-black-tie { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-fonticons { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-reddit-alien { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-edge { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-credit-card-alt:before { + content: "\f09d"; } + +.fa.fa-codiepie { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-modx { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-fort-awesome { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-usb { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-product-hunt { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-mixcloud { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-scribd { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pause-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-pause-circle-o:before { + content: "\f28b"; } + +.fa.fa-stop-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-stop-circle-o:before { + content: "\f28d"; } + +.fa.fa-bluetooth { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-bluetooth-b { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-gitlab { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wpbeginner { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wpforms { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-envira { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt:before { + content: "\f368"; } + +.fa.fa-question-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-question-circle-o:before { + content: "\f059"; } + +.fa.fa-volume-control-phone:before { + content: "\f2a0"; } + +.fa.fa-asl-interpreting:before { + content: "\f2a3"; } + +.fa.fa-deafness:before { + content: "\f2a4"; } + +.fa.fa-hard-of-hearing:before { + content: "\f2a4"; } + +.fa.fa-glide { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-glide-g { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-signing:before { + content: "\f2a7"; } + +.fa.fa-viadeo { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-viadeo-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-snapchat { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-ghost { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-square { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-first-order { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-yoast { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-themeisle { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official:before { + content: "\f2b3"; } + +.fa.fa-google-plus-circle { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-circle:before { + content: "\f2b3"; } + +.fa.fa-font-awesome { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-fa { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-fa:before { + content: "\f2b4"; } + +.fa.fa-handshake-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-handshake-o:before { + content: "\f2b5"; } + +.fa.fa-envelope-open-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-envelope-open-o:before { + content: "\f2b6"; } + +.fa.fa-linode { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-address-book-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-address-book-o:before { + content: "\f2b9"; } + +.fa.fa-vcard:before { + content: "\f2bb"; } + +.fa.fa-address-card-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-address-card-o:before { + content: "\f2bb"; } + +.fa.fa-vcard-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-vcard-o:before { + content: "\f2bb"; } + +.fa.fa-user-circle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-user-circle-o:before { + content: "\f2bd"; } + +.fa.fa-user-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-user-o:before { + content: "\f007"; } + +.fa.fa-id-badge { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-drivers-license:before { + content: "\f2c2"; } + +.fa.fa-id-card-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-id-card-o:before { + content: "\f2c2"; } + +.fa.fa-drivers-license-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-drivers-license-o:before { + content: "\f2c2"; } + +.fa.fa-quora { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-free-code-camp { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-telegram { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-thermometer-4:before { + content: "\f2c7"; } + +.fa.fa-thermometer:before { + content: "\f2c7"; } + +.fa.fa-thermometer-3:before { + content: "\f2c8"; } + +.fa.fa-thermometer-2:before { + content: "\f2c9"; } + +.fa.fa-thermometer-1:before { + content: "\f2ca"; } + +.fa.fa-thermometer-0:before { + content: "\f2cb"; } + +.fa.fa-bathtub:before { + content: "\f2cd"; } + +.fa.fa-s15:before { + content: "\f2cd"; } + +.fa.fa-window-maximize { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-window-restore { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle:before { + content: "\f410"; } + +.fa.fa-window-close-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-window-close-o:before { + content: "\f410"; } + +.fa.fa-times-rectangle-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle-o:before { + content: "\f410"; } + +.fa.fa-bandcamp { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-grav { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-etsy { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-imdb { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-ravelry { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-eercast { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-eercast:before { + content: "\f2da"; } + +.fa.fa-snowflake-o { + font-family: 'Font Awesome 5 Free'; + font-weight: 400; } + +.fa.fa-snowflake-o:before { + content: "\f2dc"; } + +.fa.fa-superpowers { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-wpexplorer { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } + +.fa.fa-spotify { + font-family: 'Font Awesome 5 Brands'; + font-weight: 400; } diff --git a/slides/revealjs-plugins/menu/font-awesome/css/v4-shims.min.css b/slides/revealjs-plugins/menu/font-awesome/css/v4-shims.min.css new file mode 100644 index 0000000..a47c8e2 --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/css/v4-shims.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa.fa-glass:before{content:"\f000"}.fa.fa-meetup{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-star-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-file-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-pencil:before{content:"\f303"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-share-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart:before{content:"\f080"}.fa.fa-bar-chart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart-o:before{content:"\f080"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-lemon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-scissors:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-google-plus,.fa.fa-google-plus-square,.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f3fd"}.fa.fa-comment-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard,.fa.fa-paste{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paste:before{content:"\f328"}.fa.fa-lightbulb-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f381"}.fa.fa-cloud-upload:before{content:"\f382"}.fa.fa-bell-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f089"}.fa.fa-star-half-empty{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f089"}.fa.fa-star-half-full{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f089"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before{content:"\f127"}.fa.fa-shield:before{content:"\f3ed"}.fa.fa-calendar-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ticket:before{content:"\f3ff"}.fa.fa-minus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\f155"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\f156"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f15e"}.fa.fa-sort-amount-asc:before{content:"\f160"}.fa.fa-sort-amount-desc:before{content:"\f161"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f163"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-play,.fa.fa-youtube-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\f195"}.fa.fa-plus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-google,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle,.fa.fa-yahoo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-spoon:before{content:"\f2e5"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-envelope-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-deviantart,.fa.fa-soundcloud{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-ring{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-bouy:before{content:"\f1cd"}.fa.fa-life-buoy{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-buoy:before{content:"\f1cd"}.fa.fa-life-saver{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-saver:before{content:"\f1cd"}.fa.fa-support{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-sliders:before{content:"\f1de"}.fa.fa-futbol-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-angellist,.fa.fa-ioxhost,.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-meanpath{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-meanpath:before{content:"\f2b4"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before{content:"\f224"}.fa.fa-facebook-official{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-clone,.fa.fa-hourglass-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-chrome,.fa.fa-creative-commons,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-internet-explorer,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square,.fa.fa-opera,.fa.fa-safari,.fa.fa-tripadvisor,.fa.fa-wikipedia-w{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat,.fa.fa-snapchat-ghost,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-viadeo,.fa.fa-viadeo-square,.fa.fa-yoast{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-spotify,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 5 Brands";font-weight:400} \ No newline at end of file diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.eot b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.eot new file mode 100644 index 0000000..f8e4818 Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.eot differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.svg b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..68eb65a --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.svg @@ -0,0 +1,1127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.ttf b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..2b00dae Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.ttf differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.woff b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.woff new file mode 100644 index 0000000..9e4b7e1 Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.woff differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.woff2 b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..b9e58c5 Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-brands-400.woff2 differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.eot b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.eot new file mode 100644 index 0000000..5217c95 Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.eot differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.svg b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..5f49543 --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.svg @@ -0,0 +1,467 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.ttf b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..cefbd50 Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.ttf differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.woff b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.woff new file mode 100644 index 0000000..954b059 Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.woff differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.woff2 b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..bd35950 Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-regular-400.woff2 differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.eot b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.eot new file mode 100644 index 0000000..cc691d6 Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.eot differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.svg b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..1534b64 --- /dev/null +++ b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.svg @@ -0,0 +1,2231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.ttf b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..618136a Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.ttf differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.woff b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.woff new file mode 100644 index 0000000..af47657 Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.woff differ diff --git a/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.woff2 b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..9ef566a Binary files /dev/null and b/slides/revealjs-plugins/menu/font-awesome/webfonts/fa-solid-900.woff2 differ diff --git a/slides/revealjs-plugins/menu/menu.css b/slides/revealjs-plugins/menu/menu.css new file mode 100644 index 0000000..5a300fd --- /dev/null +++ b/slides/revealjs-plugins/menu/menu.css @@ -0,0 +1,346 @@ +.slide-menu-wrapper { + font-family: 'Source Sans Pro', Helvetica, sans-serif; +} + +.slide-menu-wrapper .slide-menu { + background-color: #333; + z-index: 200; + position: fixed; + top: 0; + width: 300px; + height: 100%; + /*overflow-y: scroll;*/ + transition: transform 0.3s; + font-size: 16px; + font-weight: normal; +} + +.slide-menu-wrapper .slide-menu.slide-menu--wide { + width: 500px; +} + +.slide-menu-wrapper .slide-menu.slide-menu--third { + width: 33%; +} + +.slide-menu-wrapper .slide-menu.slide-menu--half { + width: 50%; +} + +.slide-menu-wrapper .slide-menu.slide-menu--full { + width: 95%; +} + +/* + * Slides menu + */ + +.slide-menu-wrapper .slide-menu-items { + margin: 0; + padding: 0; + width: 100%; + border-bottom: solid 1px #555; +} + +.slide-menu-wrapper .slide-menu-item, +.slide-menu-wrapper .slide-menu-item-vertical { + display: block; + text-align: left; + padding: 10px 18px; + color: #aaa; + cursor: pointer; +} + +.slide-menu-wrapper .slide-menu-item-vertical { + padding-left: 30px; +} + +.slide-menu-wrapper .slide-menu--wide .slide-menu-item-vertical, +.slide-menu-wrapper .slide-menu--third .slide-menu-item-vertical, +.slide-menu-wrapper .slide-menu--half .slide-menu-item-vertical, +.slide-menu-wrapper .slide-menu--full .slide-menu-item-vertical, +.slide-menu-wrapper .slide-menu--custom .slide-menu-item-vertical { + padding-left: 50px; +} + +.slide-menu-wrapper .slide-menu-item { + border-top: solid 1px #555; +} + +.slide-menu-wrapper .active-menu-panel li.selected { + background-color: #222; + color: white; +} + +.slide-menu-wrapper .active-menu-panel li.active { + color: #eee; +} + +.slide-menu-wrapper .slide-menu-item.no-title .slide-menu-item-title, +.slide-menu-wrapper .slide-menu-item-vertical.no-title .slide-menu-item-title { + font-style: italic; +} + +.slide-menu-wrapper .slide-menu-item-number { + color: #999; + padding-right: 6px; +} + +.slide-menu-wrapper .slide-menu-item i.far, +.slide-menu-wrapper .slide-menu-item i.fas, +.slide-menu-wrapper .slide-menu-item-vertical i.far, +.slide-menu-wrapper .slide-menu-item-vertical i.fas, +.slide-menu-wrapper .slide-menu-item svg.svg-inline--fa, +.slide-menu-wrapper .slide-menu-item-vertical svg.svg-inline--fa { + padding-right: 12px; + display: none; +} + +.slide-menu-wrapper .slide-menu-item.past i.fas.past, +.slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past, +.slide-menu-wrapper .slide-menu-item.active i.fas.active, +.slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active, +.slide-menu-wrapper .slide-menu-item.future i.far.future, +.slide-menu-wrapper .slide-menu-item-vertical.future i.far.future, +.slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past, +.slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past, +.slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active, +.slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active, +.slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future, +.slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future { + display: inline-block; +} + +.slide-menu-wrapper .slide-menu-item.past i.fas.past, +.slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past, +.slide-menu-wrapper .slide-menu-item.future i.far.future, +.slide-menu-wrapper .slide-menu-item-vertical.future i.far.future, +.slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past, +.slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past, +.slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future, +.slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future { + opacity: 0.4; +} + +.slide-menu-wrapper .slide-menu-item.active i.fas.active, +.slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active, +.slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active, +.slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active { + opacity: 0.8; +} + +.slide-menu-wrapper .slide-menu--left { + left: 0; + -webkit-transform: translateX(-100%); + -ms-transform: translateX(-100%); + transform: translateX(-100%); +} + +.slide-menu-wrapper .slide-menu--left.active { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); +} + +.slide-menu-wrapper .slide-menu--right { + right: 0; + -webkit-transform: translateX(100%); + -ms-transform: translateX(100%); + transform: translateX(100%); +} + +.slide-menu-wrapper .slide-menu--right.active { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); +} + +.slide-menu-wrapper { + transition: transform 0.3s; +} + +/* + * Toolbar + */ +.slide-menu-wrapper .slide-menu-toolbar { + height: 60px; + width: 100%; + font-size: 12px; + display: table; + table-layout: fixed; /* ensures equal width */ + margin: 0; + padding: 0; + border-bottom: solid 2px #666; +} + +.slide-menu-wrapper .slide-menu-toolbar > li { + display: table-cell; + line-height: 150%; + text-align: center; + vertical-align: middle; + cursor: pointer; + color: #aaa; + border-radius: 3px; +} + +.slide-menu-wrapper .slide-menu-toolbar > li.toolbar-panel-button i, +.slide-menu-wrapper + .slide-menu-toolbar + > li.toolbar-panel-button + svg.svg-inline--fa { + font-size: 1.7em; +} + +.slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button { + color: white; + text-shadow: 0 1px black; + text-decoration: underline; +} + +.slide-menu-toolbar > li.toolbar-panel-button:hover { + color: white; +} + +.slide-menu-toolbar + > li.toolbar-panel-button:hover + span.slide-menu-toolbar-label, +.slide-menu-wrapper + .slide-menu-toolbar + > li.active-toolbar-button + span.slide-menu-toolbar-label { + visibility: visible; +} + +/* + * Panels + */ +.slide-menu-wrapper .slide-menu-panel { + position: absolute; + width: 100%; + visibility: hidden; + height: calc(100% - 60px); + overflow-x: hidden; + overflow-y: auto; + color: #aaa; +} + +.slide-menu-wrapper .slide-menu-panel.active-menu-panel { + visibility: visible; +} + +.slide-menu-wrapper .slide-menu-panel h1, +.slide-menu-wrapper .slide-menu-panel h2, +.slide-menu-wrapper .slide-menu-panel h3, +.slide-menu-wrapper .slide-menu-panel h4, +.slide-menu-wrapper .slide-menu-panel h5, +.slide-menu-wrapper .slide-menu-panel h6 { + margin: 20px 0 10px 0; + color: #fff; + line-height: 1.2; + letter-spacing: normal; + text-shadow: none; +} + +.slide-menu-wrapper .slide-menu-panel h1 { + font-size: 1.6em; +} +.slide-menu-wrapper .slide-menu-panel h2 { + font-size: 1.4em; +} +.slide-menu-wrapper .slide-menu-panel h3 { + font-size: 1.3em; +} +.slide-menu-wrapper .slide-menu-panel h4 { + font-size: 1.1em; +} +.slide-menu-wrapper .slide-menu-panel h5 { + font-size: 1em; +} +.slide-menu-wrapper .slide-menu-panel h6 { + font-size: 0.9em; +} + +.slide-menu-wrapper .slide-menu-panel p { + margin: 10px 0 5px 0; +} + +.slide-menu-wrapper .slide-menu-panel a { + color: #ccc; + text-decoration: underline; +} + +.slide-menu-wrapper .slide-menu-panel a:hover { + color: white; +} + +.slide-menu-wrapper .slide-menu-item a { + text-decoration: none; +} + +.slide-menu-wrapper .slide-menu-custom-panel { + width: calc(100% - 20px); + padding-left: 10px; + padding-right: 10px; +} + +.slide-menu-wrapper .slide-menu-custom-panel .slide-menu-items { + width: calc(100% + 20px); + margin-left: -10px; + margin-right: 10px; +} + +/* + * Theme and Transitions buttons + */ + +.slide-menu-wrapper div[data-panel='Themes'] li, +.slide-menu-wrapper div[data-panel='Transitions'] li { + display: block; + text-align: left; + cursor: pointer; + color: #848484; +} + +/* + * Menu controls + */ +.reveal .slide-menu-button { + position: fixed; + left: 30px; + bottom: 30px; + z-index: 30; + font-size: 24px; +} + +/* + * Menu overlay + */ + +.slide-menu-wrapper .slide-menu-overlay { + position: fixed; + z-index: 199; + top: 0; + left: 0; + overflow: hidden; + width: 0; + height: 0; + background-color: #000; + opacity: 0; + transition: opacity 0.3s, width 0s 0.3s, height 0s 0.3s; +} + +.slide-menu-wrapper .slide-menu-overlay.active { + width: 100%; + height: 100%; + opacity: 0.7; + transition: opacity 0.3s; +} + +/* + * Hide menu for pdf printing + */ +body.print-pdf .slide-menu-wrapper .slide-menu, +body.print-pdf .reveal .slide-menu-button, +body.print-pdf .slide-menu-wrapper .slide-menu-overlay { + display: none; +} diff --git a/slides/revealjs-plugins/menu/menu.esm.js b/slides/revealjs-plugins/menu/menu.esm.js new file mode 100644 index 0000000..e58b5d2 --- /dev/null +++ b/slides/revealjs-plugins/menu/menu.esm.js @@ -0,0 +1 @@ +var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t,n){return e(n={path:t,exports:{},require:function(e,t){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==t&&n.path)}},n.exports),n.exports}var n=function(e){return e&&e.Math==Math&&e},i=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")(),r=function(e){try{return!!e()}catch(e){return!0}},a=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),o={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,l={f:s&&!o.call({1:2},1)?function(e){var t=s(this,e);return!!t&&t.enumerable}:o},c=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},u={}.toString,f=function(e){return u.call(e).slice(8,-1)},d="".split,p=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?d.call(e,""):Object(e)}:Object,h=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},m=function(e){return p(h(e))},v=function(e){return"object"==typeof e?null!==e:"function"==typeof e},g=function(e,t){if(!v(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!v(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!v(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!v(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},y={}.hasOwnProperty,b=function(e,t){return y.call(e,t)},S=i.document,E=v(S)&&v(S.createElement),x=!a&&!r((function(){return 7!=Object.defineProperty((e="div",E?S.createElement(e):{}),"a",{get:function(){return 7}}).a;var e})),w=Object.getOwnPropertyDescriptor,L={f:a?w:function(e,t){if(e=m(e),t=g(t,!0),x)try{return w(e,t)}catch(e){}if(b(e,t))return c(!l.f.call(e,t),e[t])}},T=function(e){if(!v(e))throw TypeError(String(e)+" is not an object");return e},C=Object.defineProperty,O={f:a?C:function(e,t,n){if(T(e),t=g(t,!0),T(n),x)try{return C(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},A=a?function(e,t,n){return O.f(e,t,c(1,n))}:function(e,t,n){return e[t]=n,e},k=function(e,t){try{A(i,e,t)}catch(n){i[e]=t}return t},I=i["__core-js_shared__"]||k("__core-js_shared__",{}),P=Function.toString;"function"!=typeof I.inspectSource&&(I.inspectSource=function(e){return P.call(e)});var M,N,R,j,_=I.inspectSource,F=i.WeakMap,W="function"==typeof F&&/native code/.test(_(F)),H=t((function(e){(e.exports=function(e,t){return I[e]||(I[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.5",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),$=0,D=Math.random(),B=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++$+D).toString(36)},q=H("keys"),U={},G=i.WeakMap;if(W){var V=new G,K=V.get,z=V.has,X=V.set;M=function(e,t){return X.call(V,e,t),t},N=function(e){return K.call(V,e)||{}},R=function(e){return z.call(V,e)}}else{var Y=q[j="state"]||(q[j]=B(j));U[Y]=!0,M=function(e,t){return A(e,Y,t),t},N=function(e){return b(e,Y)?e[Y]:{}},R=function(e){return b(e,Y)}}var J={set:M,get:N,has:R,enforce:function(e){return R(e)?N(e):M(e,{})},getterFor:function(e){return function(t){var n;if(!v(t)||(n=N(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Z=t((function(e){var t=J.get,n=J.enforce,r=String(String).split("String");(e.exports=function(e,t,a,o){var s=!!o&&!!o.unsafe,l=!!o&&!!o.enumerable,c=!!o&&!!o.noTargetGet;"function"==typeof a&&("string"!=typeof t||b(a,"name")||A(a,"name",t),n(a).source=r.join("string"==typeof t?t:"")),e!==i?(s?!c&&e[t]&&(l=!0):delete e[t],l?e[t]=a:A(e,t,a)):l?e[t]=a:k(t,a)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||_(this)}))})),Q=i,ee=function(e){return"function"==typeof e?e:void 0},te=function(e,t){return arguments.length<2?ee(Q[e])||ee(i[e]):Q[e]&&Q[e][t]||i[e]&&i[e][t]},ne=Math.ceil,ie=Math.floor,re=function(e){return isNaN(e=+e)?0:(e>0?ie:ne)(e)},ae=Math.min,oe=function(e){return e>0?ae(re(e),9007199254740991):0},se=Math.max,le=Math.min,ce=function(e,t){var n=re(e);return n<0?se(n+t,0):le(n,t)},ue=function(e){return function(t,n,i){var r,a=m(t),o=oe(a.length),s=ce(i,o);if(e&&n!=n){for(;o>s;)if((r=a[s++])!=r)return!0}else for(;o>s;s++)if((e||s in a)&&a[s]===n)return e||s||0;return!e&&-1}},fe={includes:ue(!0),indexOf:ue(!1)},de=fe.indexOf,pe=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype"),he={f:Object.getOwnPropertyNames||function(e){return function(e,t){var n,i=m(e),r=0,a=[];for(n in i)!b(U,n)&&b(i,n)&&a.push(n);for(;t.length>r;)b(i,n=t[r++])&&(~de(a,n)||a.push(n));return a}(e,pe)}},me={f:Object.getOwnPropertySymbols},ve=te("Reflect","ownKeys")||function(e){var t=he.f(T(e)),n=me.f;return n?t.concat(n(e)):t},ge=function(e,t){for(var n=ve(t),i=O.f,r=L.f,a=0;ay;y++)if((o||y in m)&&(d=v(f=m[y],y,h),e))if(t)S[y]=d;else if(d)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:We.call(S,f)}else if(r)return!1;return a?-1:i||r?r:S}},$e={forEach:He(0),map:He(1),filter:He(2),some:He(3),every:He(4),find:He(5),findIndex:He(6)},De=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))},Be=Object.defineProperty,qe={},Ue=function(e){throw e},Ge=function(e,t){if(b(qe,e))return qe[e];t||(t={});var n=[][e],i=!!b(t,"ACCESSORS")&&t.ACCESSORS,o=b(t,0)?t[0]:Ue,s=b(t,1)?t[1]:void 0;return qe[e]=!!n&&!r((function(){if(i&&!a)return!0;var e={length:-1};i?Be(e,1,{enumerable:!0,get:Ue}):e[1]=1,n.call(e,o,s)}))},Ve=$e.every,Ke=De("every"),ze=Ge("every");Ce({target:"Array",proto:!0,forced:!Ke||!ze},{every:function(e){return Ve(this,e,arguments.length>1?arguments[1]:void 0)}});var Xe,Ye,Je=te("navigator","userAgent")||"",Ze=i.process,Qe=Ze&&Ze.versions,et=Qe&&Qe.v8;et?Ye=(Xe=et.split("."))[0]+Xe[1]:Je&&(!(Xe=Je.match(/Edge\/(\d+)/))||Xe[1]>=74)&&(Xe=Je.match(/Chrome\/(\d+)/))&&(Ye=Xe[1]);var tt=Ye&&+Ye,nt=je("species"),it=function(e){return tt>=51||!r((function(){var t=[];return(t.constructor={})[nt]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},rt=$e.filter,at=it("filter"),ot=Ge("filter");Ce({target:"Array",proto:!0,forced:!at||!ot},{filter:function(e){return rt(this,e,arguments.length>1?arguments[1]:void 0)}});var st=$e.forEach,lt=De("forEach"),ct=Ge("forEach"),ut=lt&&ct?[].forEach:function(e){return st(this,e,arguments.length>1?arguments[1]:void 0)};Ce({target:"Array",proto:!0,forced:[].forEach!=ut},{forEach:ut});var ft=fe.indexOf,dt=[].indexOf,pt=!!dt&&1/[1].indexOf(1,-0)<0,ht=De("indexOf"),mt=Ge("indexOf",{ACCESSORS:!0,1:0});Ce({target:"Array",proto:!0,forced:pt||!ht||!mt},{indexOf:function(e){return pt?dt.apply(this,arguments)||0:ft(this,e,arguments.length>1?arguments[1]:void 0)}}),Ce({target:"Array",stat:!0},{isArray:ke});var vt=[].join,gt=p!=Object,yt=De("join",",");Ce({target:"Array",proto:!0,forced:gt||!yt},{join:function(e){return vt.call(m(this),void 0===e?",":e)}});var bt=Math.min,St=[].lastIndexOf,Et=!!St&&1/[1].lastIndexOf(1,-0)<0,xt=De("lastIndexOf"),wt=Ge("indexOf",{ACCESSORS:!0,1:0}),Lt=Et||!xt||!wt?function(e){if(Et)return St.apply(this,arguments)||0;var t=m(this),n=oe(t.length),i=n-1;for(arguments.length>1&&(i=bt(i,re(arguments[1]))),i<0&&(i=n+i);i>=0;i--)if(i in t&&t[i]===e)return i||0;return-1}:St;Ce({target:"Array",proto:!0,forced:Lt!==[].lastIndexOf},{lastIndexOf:Lt});var Tt=$e.map,Ct=it("map"),Ot=Ge("map");Ce({target:"Array",proto:!0,forced:!Ct||!Ot},{map:function(e){return Tt(this,e,arguments.length>1?arguments[1]:void 0)}});var At=function(e,t,n){var i=g(t);i in e?O.f(e,i,c(0,n)):e[i]=n},kt=it("slice"),It=Ge("slice",{ACCESSORS:!0,0:0,1:2}),Pt=je("species"),Mt=[].slice,Nt=Math.max;Ce({target:"Array",proto:!0,forced:!kt||!It},{slice:function(e,t){var n,i,r,a=m(this),o=oe(a.length),s=ce(e,o),l=ce(void 0===t?o:t,o);if(ke(a)&&("function"!=typeof(n=a.constructor)||n!==Array&&!ke(n.prototype)?v(n)&&null===(n=n[Pt])&&(n=void 0):n=void 0,n===Array||void 0===n))return Mt.call(a,s,l);for(i=new(void 0===n?Array:n)(Nt(l-s,0)),r=0;s>>0||(Qt.test(n)?16:10))}:Zt;Ce({global:!0,forced:parseInt!=en},{parseInt:en});var tn=function(){var e=T(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function nn(e,t){return RegExp(e,t)}var rn,an,on={UNSUPPORTED_Y:r((function(){var e=nn("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET:r((function(){var e=nn("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},sn=RegExp.prototype.exec,ln=String.prototype.replace,cn=sn,un=(rn=/a/,an=/b*/g,sn.call(rn,"a"),sn.call(an,"a"),0!==rn.lastIndex||0!==an.lastIndex),fn=on.UNSUPPORTED_Y||on.BROKEN_CARET,dn=void 0!==/()??/.exec("")[1];(un||dn||fn)&&(cn=function(e){var t,n,i,r,a=this,o=fn&&a.sticky,s=tn.call(a),l=a.source,c=0,u=e;return o&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),u=String(e).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&"\n"!==e[a.lastIndex-1])&&(l="(?: "+l+")",u=" "+u,c++),n=new RegExp("^(?:"+l+")",s)),dn&&(n=new RegExp("^"+l+"$(?!\\s)",s)),un&&(t=a.lastIndex),i=sn.call(o?n:a,u),o?i?(i.input=i.input.slice(c),i[0]=i[0].slice(c),i.index=a.lastIndex,a.lastIndex+=i[0].length):a.lastIndex=0:un&&i&&(a.lastIndex=a.global?i.index+i[0].length:t),dn&&i&&i.length>1&&ln.call(i[0],n,(function(){for(r=1;r1?arguments[1]:void 0,i=oe(t.length),r=void 0===n?i:xn(oe(n),i),a=String(e);return En?En.call(t,a,r):t.slice(r-a.length,r)===a}});var Ln=je("species"),Tn=!r((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),Cn="$0"==="a".replace(/./,"$0"),On=je("replace"),An=!!/./[On]&&""===/./[On]("a","$0"),kn=!r((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),In=function(e,t,n,i){var a=je(e),o=!r((function(){var t={};return t[a]=function(){return 7},7!=""[e](t)})),s=o&&!r((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[Ln]=function(){return n},n.flags="",n[a]=/./[a]),n.exec=function(){return t=!0,null},n[a](""),!t}));if(!o||!s||"replace"===e&&(!Tn||!Cn||An)||"split"===e&&!kn){var l=/./[a],c=n(a,""[e],(function(e,t,n,i,r){return t.exec===pn?o&&!r?{done:!0,value:l.call(t,n,i)}:{done:!0,value:e.call(n,t,i)}:{done:!1}}),{REPLACE_KEEPS_$0:Cn,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:An}),u=c[0],f=c[1];Z(String.prototype,e,u),Z(RegExp.prototype,a,2==t?function(e,t){return f.call(e,this,t)}:function(e){return f.call(e,this)})}i&&A(RegExp.prototype[a],"sham",!0)},Pn=function(e){return function(t,n){var i,r,a=String(h(t)),o=re(n),s=a.length;return o<0||o>=s?e?"":void 0:(i=a.charCodeAt(o))<55296||i>56319||o+1===s||(r=a.charCodeAt(o+1))<56320||r>57343?e?a.charAt(o):i:e?a.slice(o,o+2):r-56320+(i-55296<<10)+65536}},Mn={codeAt:Pn(!1),charAt:Pn(!0)}.charAt,Nn=function(e,t,n){return t+(n?Mn(e,t).length:1)},Rn=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==f(e))throw TypeError("RegExp#exec called on incompatible receiver");return pn.call(e,t)},jn=Math.max,_n=Math.min,Fn=Math.floor,Wn=/\$([$&'`]|\d\d?|<[^>]*>)/g,Hn=/\$([$&'`]|\d\d?)/g;In("replace",2,(function(e,t,n,i){var r=i.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,a=i.REPLACE_KEEPS_$0,o=r?"$":"$0";return[function(n,i){var r=h(this),a=null==n?void 0:n[e];return void 0!==a?a.call(n,r,i):t.call(String(r),n,i)},function(e,i){if(!r&&a||"string"==typeof i&&-1===i.indexOf(o)){var l=n(t,e,this,i);if(l.done)return l.value}var c=T(e),u=String(this),f="function"==typeof i;f||(i=String(i));var d=c.global;if(d){var p=c.unicode;c.lastIndex=0}for(var h=[];;){var m=Rn(c,u);if(null===m)break;if(h.push(m),!d)break;""===String(m[0])&&(c.lastIndex=Nn(u,oe(c.lastIndex),p))}for(var v,g="",y=0,b=0;b=y&&(g+=u.slice(y,E)+O,y=E+S.length)}return g+u.slice(y)}];function s(e,n,i,r,a,o){var s=i+e.length,l=r.length,c=Hn;return void 0!==a&&(a=Ae(a),c=Wn),t.call(o,c,(function(t,o){var c;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,i);case"'":return n.slice(s);case"<":c=a[o.slice(1,-1)];break;default:var u=+o;if(0===u)return t;if(u>l){var f=Fn(u/10);return 0===f?t:f<=l?void 0===r[f-1]?o.charAt(1):r[f-1]+o.charAt(1):t}c=r[u-1]}return void 0===c?"":c}))}}));var $n=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};In("search",1,(function(e,t,n){return[function(t){var n=h(this),i=null==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var r=T(e),a=String(this),o=r.lastIndex;$n(o,0)||(r.lastIndex=0);var s=Rn(r,a);return $n(r.lastIndex,o)||(r.lastIndex=o),null===s?-1:s.index}]}));var Dn=je("species"),Bn=[].push,qn=Math.min,Un=!r((function(){return!RegExp(4294967295,"y")}));In("split",2,(function(e,t,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var i=String(h(this)),r=void 0===n?4294967295:n>>>0;if(0===r)return[];if(void 0===e)return[i];if(!vn(e))return t.call(i,e,r);for(var a,o,s,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),u=0,f=new RegExp(e.source,c+"g");(a=pn.call(f,i))&&!((o=f.lastIndex)>u&&(l.push(i.slice(u,a.index)),a.length>1&&a.index=r));)f.lastIndex===a.index&&f.lastIndex++;return u===i.length?!s&&f.test("")||l.push(""):l.push(i.slice(u)),l.length>r?l.slice(0,r):l}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=h(this),a=null==t?void 0:t[e];return void 0!==a?a.call(t,r,n):i.call(String(r),t,n)},function(e,r){var a=n(i,e,this,r,i!==t);if(a.done)return a.value;var o=T(e),s=String(this),l=function(e,t){var n,i=T(e).constructor;return void 0===i||null==(n=T(i)[Dn])?t:Oe(n)}(o,RegExp),c=o.unicode,u=(o.ignoreCase?"i":"")+(o.multiline?"m":"")+(o.unicode?"u":"")+(Un?"y":"g"),f=new l(Un?o:"^(?:"+o.source+")",u),d=void 0===r?4294967295:r>>>0;if(0===d)return[];if(0===s.length)return null===Rn(f,s)?[s]:[];for(var p=0,h=0,m=[];h1?arguments[1]:void 0,t.length)),i=String(e);return Vn?Vn.call(t,i,n):t.slice(n,n+i.length)===i}});var Xn,Yn=Kt.trim;Ce({target:"String",proto:!0,forced:(Xn="trim",r((function(){return!!Bt[Xn]()||"​…᠎"!="​…᠎"[Xn]()||Bt[Xn].name!==Xn})))},{trim:function(){return Yn(this)}});for(var Jn in{CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}){var Zn=i[Jn],Qn=Zn&&Zn.prototype;if(Qn&&Qn.forEach!==ut)try{A(Qn,"forEach",ut)}catch(e){Qn.forEach=ut}}var ei=[].slice,ti=function(e){return function(t,n){var i=arguments.length>2,r=i?ei.call(arguments,2):void 0;return e(i?function(){("function"==typeof t?t:Function(t)).apply(this,r)}:t,n)}};Ce({global:!0,bind:!0,forced:/MSIE .\./.test(Je)},{setTimeout:ti(i.setTimeout),setInterval:ti(i.setInterval)});String.prototype.startsWith||(String.prototype.startsWith=function(e,t){return this.substr(t||0,e.length)===e}),String.prototype.endsWith||(String.prototype.endsWith=function(e,t){return(void 0===t||t>this.length)&&(t=this.length),this.substring(t-e.length,t)===e});export default function(){var e,t,n,i,r=(e=/(msie) ([\w.]+)/.exec(window.navigator.userAgent.toLowerCase()))&&"msie"===e[1]?parseFloat(e[2]):null,a=!1;function o(e){(i=e.menu||{}).path=i.path||function(){var e;if(document.querySelector('script[src$="menu.js"]')){var t=document.querySelector('script[src$="menu.js"]');t&&(e=t.src.slice(0,-7))}else e=import.meta.url.slice(0,import.meta.url.lastIndexOf("/")+1);return e}()||"plugin/menu/",i.path.endsWith("/")||(i.path+="/"),void 0===i.side&&(i.side="left"),void 0===i.numbers&&(i.numbers=!1),"string"!=typeof i.titleSelector&&(i.titleSelector="h1, h2, h3, h4, h5"),void 0===i.hideMissingTitles&&(i.hideMissingTitles=!1),void 0===i.useTextContentForMissingTitles&&(i.useTextContentForMissingTitles=!1),void 0===i.markers&&(i.markers=!0),"string"!=typeof i.themesPath&&(i.themesPath="dist/theme/"),i.themesPath.endsWith("/")||(i.themesPath+="/"),O("link#theme")||(i.themes=!1),!0===i.themes?i.themes=[{name:"Black",theme:i.themesPath+"black.css"},{name:"White",theme:i.themesPath+"white.css"},{name:"League",theme:i.themesPath+"league.css"},{name:"Sky",theme:i.themesPath+"sky.css"},{name:"Beige",theme:i.themesPath+"beige.css"},{name:"Simple",theme:i.themesPath+"simple.css"},{name:"Serif",theme:i.themesPath+"serif.css"},{name:"Blood",theme:i.themesPath+"blood.css"},{name:"Night",theme:i.themesPath+"night.css"},{name:"Moon",theme:i.themesPath+"moon.css"},{name:"Solarized",theme:i.themesPath+"solarized.css"}]:Array.isArray(i.themes)||(i.themes=!1),void 0===i.transitions&&(i.transitions=!1),!0===i.transitions?i.transitions=["None","Fade","Slide","Convex","Concave","Zoom"]:!1===i.transitions||Array.isArray(i.transitions)&&i.transitions.every((function(e){return"string"==typeof e}))||(console.error("reveal.js-menu error: transitions config value must be 'true' or an array of strings, eg ['None', 'Fade', 'Slide')"),i.transitions=!1),r&&r<=9&&(i.transitions=!1),void 0===i.openButton&&(i.openButton=!0),void 0===i.openSlideNumber&&(i.openSlideNumber=!1),void 0===i.keyboard&&(i.keyboard=!0),void 0===i.sticky&&(i.sticky=!1),void 0===i.autoOpen&&(i.autoOpen=!0),void 0===i.delayInit&&(i.delayInit=!1),void 0===i.openOnInit&&(i.openOnInit=!1)}var s=!0;function l(){s=!1}function c(){O("nav.slide-menu").addEventListener("mousemove",(function e(t){O("nav.slide-menu").removeEventListener("mousemove",e),s=!0}))}function u(e){var t=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-e.scrollLeft,n+=e.offsetTop-e.scrollTop,e=e.offsetParent;return{top:n,left:t}}(e).top-e.offsetParent.offsetTop;if(t<0)return-t;var n=e.offsetParent.offsetHeight-(e.offsetTop-e.offsetParent.scrollTop+e.offsetHeight);return n<0?n:0}function f(e){var t=u(e);t&&(l(),e.scrollIntoView(t>0),c())}function d(e){l(),e.offsetParent.scrollTop=e.offsetTop,c()}function p(e){l(),e.offsetParent.scrollTop=e.offsetTop-e.offsetParent.offsetHeight+e.offsetHeight,c()}function h(e){e.classList.add("selected"),f(e),i.sticky&&i.autoOpen&&E(e)}function m(e){if(b())switch(e.stopImmediatePropagation(),e.keyCode){case 72:case 37:!function(){var e=parseInt(O(".active-toolbar-button").getAttribute("data-button"))-1;e<0&&(e=T-1);S(null,O('.toolbar-panel-button[data-button="'+e+'"]').getAttribute("data-panel"))}();break;case 76:case 39:l=(parseInt(O(".active-toolbar-button").getAttribute("data-button"))+1)%T,S(null,O('.toolbar-panel-button[data-button="'+l+'"]').getAttribute("data-panel"));break;case 75:case 38:if(s=O(".active-menu-panel .slide-menu-items li.selected")||O(".active-menu-panel .slide-menu-items li.active"))A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(O('.active-menu-panel .slide-menu-items li[data-item="'+(parseInt(s.getAttribute("data-item"))-1)+'"]')||s);else(o=O(".active-menu-panel .slide-menu-items li.slide-menu-item"))&&h(o);break;case 74:case 40:if(s=O(".active-menu-panel .slide-menu-items li.selected")||O(".active-menu-panel .slide-menu-items li.active"))A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(O('.active-menu-panel .slide-menu-items li[data-item="'+(parseInt(s.getAttribute("data-item"))+1)+'"]')||s);else(o=O(".active-menu-panel .slide-menu-items li.slide-menu-item"))&&h(o);break;case 33:case 85:var t=A(".active-menu-panel .slide-menu-items li").filter((function(e){return u(e)>0})),n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})),i=t.length>0&&Math.abs(u(t[t.length-1]))0&&(p(i),i=(n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})))[0]==i?t[t.length-1]:n[0]),A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(i),d(i));break;case 34:case 68:n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)}));var r=A(".active-menu-panel .slide-menu-items li").filter((function(e){return u(e)<0})),a=r.length>0&&Math.abs(u(r[0]))0&&(d(a),a=(n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})))[n.length-1]==a?r[0]:n[n.length-1]),A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(a),p(a));break;case 36:A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),(o=O(".active-menu-panel .slide-menu-items li:first-of-type"))&&(o.classList.add("selected"),f(o));break;case 35:var o;A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),(o=O(".active-menu-panel .slide-menu-items:last-of-type li:last-of-type"))&&(o.classList.add("selected"),f(o));break;case 32:case 13:var s;(s=O(".active-menu-panel .slide-menu-items li.selected"))&&E(s,!0);break;case 27:g(null,!0)}var l}function v(e){(e&&e.preventDefault(),b())||(O("body").classList.add("slide-menu-active"),O(".reveal").classList.add("has-"+i.effect+"-"+i.side),O(".slide-menu").classList.add("active"),O(".slide-menu-overlay").classList.add("active"),i.themes&&(A('div[data-panel="Themes"] li').forEach((function(e){e.classList.remove("active")})),A('li[data-theme="'+O("link#theme").getAttribute("href")+'"]').forEach((function(e){e.classList.add("active")}))),i.transitions&&(A('div[data-panel="Transitions"] li').forEach((function(e){e.classList.remove("active")})),A('li[data-transition="'+n.transition+'"]').forEach((function(e){e.classList.add("active")}))),A(".slide-menu-panel li.active").forEach((function(e){e.classList.add("selected"),f(e)})))}function g(e,t){e&&e.preventDefault(),i.sticky&&!t||(O("body").classList.remove("slide-menu-active"),O(".reveal").classList.remove("has-"+i.effect+"-"+i.side),O(".slide-menu").classList.remove("active"),O(".slide-menu-overlay").classList.remove("active"),A(".slide-menu-panel li.selected").forEach((function(e){e.classList.remove("selected")})))}function y(e){b()?g(e,!0):v(e)}function b(){return O("body").classList.contains("slide-menu-active")}function S(e,t){v(e);var n=t;"string"!=typeof t&&(n=e.currentTarget.getAttribute("data-panel")),O(".slide-menu-toolbar > li.active-toolbar-button").classList.remove("active-toolbar-button"),O('li[data-panel="'+n+'"]').classList.add("active-toolbar-button"),O(".slide-menu-panel.active-menu-panel").classList.remove("active-menu-panel"),O('div[data-panel="'+n+'"]').classList.add("active-menu-panel")}function E(e,n){var r=parseInt(e.getAttribute("data-slide-h")),a=parseInt(e.getAttribute("data-slide-v")),o=e.getAttribute("data-theme"),s=e.getAttribute("data-highlight-theme"),l=e.getAttribute("data-transition");isNaN(r)||isNaN(a)||t.slide(r,a),o&&I("theme",o),s&&I("highlight-theme",s),l&&t.configure({transition:l});var c=O("a",e);c&&(n||!i.sticky||i.autoOpen&&c.href.startsWith("#")||c.href.startsWith(window.location.origin+window.location.pathname+"#"))&&c.click(),g()}function x(e){"A"!==e.target.nodeName&&e.preventDefault(),E(e.currentTarget)}function w(){var e=t.getState();A("li.slide-menu-item, li.slide-menu-item-vertical").forEach((function(t){t.classList.remove("past"),t.classList.remove("active"),t.classList.remove("future");var n=parseInt(t.getAttribute("data-slide-h")),i=parseInt(t.getAttribute("data-slide-v"));n",s.appendChild(k("br"),O("i",s)),s.appendChild(k("span",{class:"slide-menu-toolbar-label"},e),O("i",s)),s.onclick=r,d.appendChild(s),s},r=function(e,r,a,o,s){function l(e,t){if(""===e)return null;var n=t?O(e,r):O(e);return n?n.textContent:null}var c=r.getAttribute("data-menu-title")||l(".menu-title",r)||l(i.titleSelector,r);if(!c&&i.useTextContentForMissingTitles&&(c=r.textContent.trim())&&(c=c.split("\n").map((function(e){return e.trim()})).join(" ").trim().replace(/^(.{16}[^\s]*).*/,"$1").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")+"..."),!c){if(i.hideMissingTitles)return"";e+=" no-title",c="Slide "+(a+1)}var u=k("li",{class:e,"data-item":a,"data-slide-h":o,"data-slide-v":void 0===s?0:s});if(i.markers&&(u.appendChild(k("i",{class:"fas fa-check-circle fa-fw past"})),u.appendChild(k("i",{class:"fas fa-arrow-alt-circle-right fa-fw active"})),u.appendChild(k("i",{class:"far fa-circle fa-fw future"}))),i.numbers){var f=[],d="h.v";switch("string"==typeof i.numbers?d=i.numbers:"string"==typeof n.slideNumber&&(d=n.slideNumber),d){case"c":f.push(a+1);break;case"c/t":f.push(a+1,"/",t.getTotalSlides());break;case"h/v":f.push(o+1),"number"!=typeof s||isNaN(s)||f.push("/",s+1);break;default:f.push(o+1),"number"!=typeof s||isNaN(s)||f.push(".",s+1)}u.appendChild(k("span",{class:"slide-menu-item-number"},f.join("")+". "))}return u.appendChild(k("span",{class:"slide-menu-item-title"},c)),u},o=function(e){s&&(A(".active-menu-panel .slide-menu-items li.selected").forEach((function(e){e.classList.remove("selected")})),e.currentTarget.classList.add("selected"))},l=O(".reveal").parentElement,c=k("div",{class:"slide-menu-wrapper"});l.appendChild(c);var u=k("nav",{class:"slide-menu slide-menu--"+i.side});"string"==typeof i.width&&(-1!=["normal","wide","third","half","full"].indexOf(i.width)?u.classList.add("slide-menu--"+i.width):(u.classList.add("slide-menu--custom"),u.style.width=i.width)),c.appendChild(u),L();var f=k("div",{class:"slide-menu-overlay"});c.appendChild(f),f.onclick=function(){g(null,!0)};var d=k("ol",{class:"slide-menu-toolbar"});O(".slide-menu").appendChild(d),e("Slides","Slides","fa-images","fas",S,!0),i.custom&&i.custom.forEach((function(t,n,i){e(t.title,"Custom"+n,t.icon,null,S)})),i.themes&&e("Themes","Themes","fa-adjust","fas",S),i.transitions&&e("Transitions","Transitions","fa-sticky-note","fas",S);var p=k("li",{id:"close",class:"toolbar-panel-button"});if(p.appendChild(k("i",{class:"fas fa-times"})),p.appendChild(k("br")),p.appendChild(k("span",{class:"slide-menu-toolbar-label"},"Close")),p.onclick=function(){g(null,!0)},d.appendChild(p),function e(){if(document.querySelector("section[data-markdown]:not([data-markdown-parsed])"))setTimeout(e,100);else{var t=k("div",{"data-panel":"Slides",class:"slide-menu-panel active-menu-panel"});t.appendChild(k("ul",{class:"slide-menu-items"})),u.appendChild(t);var n=O('.slide-menu-panel[data-panel="Slides"] > .slide-menu-items'),i=0;A(".slides > section").forEach((function(e,t){var a=A("section",e);if(a.length>0)a.forEach((function(e,a){var o=r(0===a?"slide-menu-item":"slide-menu-item-vertical",e,i,t,a);o&&n.appendChild(o),i++}));else{var o=r("slide-menu-item",e,i,t);o&&n.appendChild(o),i++}})),A(".slide-menu-item, .slide-menu-item-vertical").forEach((function(e){e.onclick=x})),w()}}(),t.addEventListener("slidechanged",w),i.custom){var h=function(){this.status>=200&&this.status<300?(this.panel.innerHTML=this.responseText,C(this.panel)):I(this)},E=function(){I(this)},C=function(e){A("ul.slide-menu-items li.slide-menu-item",e).forEach((function(e,t){e.setAttribute("data-item",t+1),e.onclick=x,e.addEventListener("mouseenter",o)}))},I=function(e){var t="

ERROR: The attempt to fetch "+e.responseURL+" failed with HTTP status "+e.status+" ("+e.statusText+").

Remember that you need to serve the presentation HTML from a HTTP server.

";e.panel.innerHTML=t};i.custom.forEach((function(e,t,n){var i=k("div",{"data-panel":"Custom"+t,class:"slide-menu-panel slide-menu-custom-panel"});e.content?(i.innerHTML=e.content,C(i)):e.src&&function(e,t){var n=new XMLHttpRequest;n.panel=e,n.arguments=Array.prototype.slice.call(arguments,2),n.onload=h,n.onerror=E,n.open("get",t,!0),n.send(null)}(i,e.src),u.appendChild(i)}))}if(i.themes){var P=k("div",{class:"slide-menu-panel","data-panel":"Themes"});u.appendChild(P);var M=k("ul",{class:"slide-menu-items"});P.appendChild(M),i.themes.forEach((function(e,t){var n={class:"slide-menu-item","data-item":""+(t+1)};e.theme&&(n["data-theme"]=e.theme),e.highlightTheme&&(n["data-highlight-theme"]=e.highlightTheme);var i=k("li",n,e.name);M.appendChild(i),i.onclick=x}))}if(i.transitions){P=k("div",{class:"slide-menu-panel","data-panel":"Transitions"});u.appendChild(P);M=k("ul",{class:"slide-menu-items"});P.appendChild(M),i.transitions.forEach((function(e,t){var n=k("li",{class:"slide-menu-item","data-transition":e.toLowerCase(),"data-item":""+(t+1)},e);M.appendChild(n),n.onclick=x}))}if(i.openButton){var N=k("div",{class:"slide-menu-button"}),R=k("a",{href:"#"});R.appendChild(k("i",{class:"fas fa-bars"})),N.appendChild(R),O(".reveal").appendChild(N),N.onclick=v}if(i.openSlideNumber)O("div.slide-number").onclick=v;A(".slide-menu-panel .slide-menu-items li").forEach((function(e){e.addEventListener("mouseenter",o)}))}if(i.keyboard){if(document.addEventListener("keydown",m,!1),window.addEventListener("message",(function(e){var t;try{t=JSON.parse(e.data)}catch(e){}t&&"triggerKey"===t.method&&m({keyCode:t.args[0],stopImmediatePropagation:function(){}})})),n.keyboardCondition&&"function"==typeof n.keyboardCondition){var j=n.keyboardCondition;n.keyboardCondition=function(e){return j(e)&&(!b()||77==e.keyCode)}}else n.keyboardCondition=function(e){return!b()||77==e.keyCode};t.addKeyBinding({keyCode:77,key:"M",description:"Toggle menu"},y)}i.openOnInit&&v(),a=!0}function O(e,t){return t||(t=document),t.querySelector(e)}function A(e,t){return t||(t=document),Array.prototype.slice.call(t.querySelectorAll(e))}function k(e,t,n){var i=document.createElement(e);return t&&Object.getOwnPropertyNames(t).forEach((function(e){i.setAttribute(e,t[e])})),n&&(i.innerHTML=n),i}function I(e,t){var n=O("link#"+e),i=n.parentElement,r=n.nextElementSibling;n.remove();var a=n.cloneNode();a.setAttribute("href",t),a.onload=function(){L()},i.insertBefore(a,r)}function P(e,t,n){var i,r=document.querySelector("head");"script"===t?((i=document.createElement("script")).type="text/javascript",i.src=e):"stylesheet"===t&&((i=document.createElement("link")).rel="stylesheet",i.href=e);var a=function(){"function"==typeof n&&(n.call(),n=null)};i.onload=a,i.onreadystatechange=function(){"loaded"===this.readyState&&a()},r.appendChild(i)}function M(){var e,a,o,s=!r||r>=9;t.isSpeakerNotes()&&window.location.search.endsWith("controls=false")&&(s=!1),s&&(i.delayInit||C(),e="menu-ready",(o=document.createEvent("HTMLEvents",1,2)).initEvent(e,!0,!0),function(e,t){for(var n in t)e[n]=t[n]}(o,a),document.querySelector(".reveal").dispatchEvent(o),n.postMessageEvents&&window.parent!==window.self&&window.parent.postMessage(JSON.stringify({namespace:"reveal",eventName:e,state:t.getState()}),"*"))}return{id:"menu",init:function(e){o(n=(t=e).getConfig()),P(i.path+"menu.css","stylesheet",(function(){void 0===i.loadIcons||i.loadIcons?P(i.path+"font-awesome/css/all.css","stylesheet",M):M()}))},toggle:y,openMenu:v,closeMenu:g,openPanel:S,isOpen:b,initialiseMenu:C,isMenuInitialised:function(){return a}}} diff --git a/slides/revealjs-plugins/menu/menu.js b/slides/revealjs-plugins/menu/menu.js new file mode 100644 index 0000000..dfec193 --- /dev/null +++ b/slides/revealjs-plugins/menu/menu.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).RevealMenu=t()}(this,(function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function t(e,t,n){return e(n={path:t,exports:{},require:function(e,t){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==t&&n.path)}},n.exports),n.exports}var n=function(e){return e&&e.Math==Math&&e},r=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")(),i=function(e){try{return!!e()}catch(e){return!0}},a=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),o={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,l={f:s&&!o.call({1:2},1)?function(e){var t=s(this,e);return!!t&&t.enumerable}:o},c=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},u={}.toString,f=function(e){return u.call(e).slice(8,-1)},d="".split,p=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?d.call(e,""):Object(e)}:Object,h=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},m=function(e){return p(h(e))},v=function(e){return"object"==typeof e?null!==e:"function"==typeof e},g=function(e,t){if(!v(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!v(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!v(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!v(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},y={}.hasOwnProperty,b=function(e,t){return y.call(e,t)},S=r.document,E=v(S)&&v(S.createElement),x=!a&&!i((function(){return 7!=Object.defineProperty((e="div",E?S.createElement(e):{}),"a",{get:function(){return 7}}).a;var e})),w=Object.getOwnPropertyDescriptor,L={f:a?w:function(e,t){if(e=m(e),t=g(t,!0),x)try{return w(e,t)}catch(e){}if(b(e,t))return c(!l.f.call(e,t),e[t])}},T=function(e){if(!v(e))throw TypeError(String(e)+" is not an object");return e},C=Object.defineProperty,O={f:a?C:function(e,t,n){if(T(e),t=g(t,!0),T(n),x)try{return C(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},A=a?function(e,t,n){return O.f(e,t,c(1,n))}:function(e,t,n){return e[t]=n,e},k=function(e,t){try{A(r,e,t)}catch(n){r[e]=t}return t},I=r["__core-js_shared__"]||k("__core-js_shared__",{}),P=Function.toString;"function"!=typeof I.inspectSource&&(I.inspectSource=function(e){return P.call(e)});var M,R,j,N,_=I.inspectSource,F=r.WeakMap,W="function"==typeof F&&/native code/.test(_(F)),H=t((function(e){(e.exports=function(e,t){return I[e]||(I[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.5",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),U=0,$=Math.random(),D=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++U+$).toString(36)},q=H("keys"),B={},G=r.WeakMap;if(W){var V=new G,K=V.get,z=V.has,X=V.set;M=function(e,t){return X.call(V,e,t),t},R=function(e){return K.call(V,e)||{}},j=function(e){return z.call(V,e)}}else{var Y=q[N="state"]||(q[N]=D(N));B[Y]=!0,M=function(e,t){return A(e,Y,t),t},R=function(e){return b(e,Y)?e[Y]:{}},j=function(e){return b(e,Y)}}var J={set:M,get:R,has:j,enforce:function(e){return j(e)?R(e):M(e,{})},getterFor:function(e){return function(t){var n;if(!v(t)||(n=R(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Z=t((function(e){var t=J.get,n=J.enforce,i=String(String).split("String");(e.exports=function(e,t,a,o){var s=!!o&&!!o.unsafe,l=!!o&&!!o.enumerable,c=!!o&&!!o.noTargetGet;"function"==typeof a&&("string"!=typeof t||b(a,"name")||A(a,"name",t),n(a).source=i.join("string"==typeof t?t:"")),e!==r?(s?!c&&e[t]&&(l=!0):delete e[t],l?e[t]=a:A(e,t,a)):l?e[t]=a:k(t,a)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||_(this)}))})),Q=r,ee=function(e){return"function"==typeof e?e:void 0},te=function(e,t){return arguments.length<2?ee(Q[e])||ee(r[e]):Q[e]&&Q[e][t]||r[e]&&r[e][t]},ne=Math.ceil,re=Math.floor,ie=function(e){return isNaN(e=+e)?0:(e>0?re:ne)(e)},ae=Math.min,oe=function(e){return e>0?ae(ie(e),9007199254740991):0},se=Math.max,le=Math.min,ce=function(e,t){var n=ie(e);return n<0?se(n+t,0):le(n,t)},ue=function(e){return function(t,n,r){var i,a=m(t),o=oe(a.length),s=ce(r,o);if(e&&n!=n){for(;o>s;)if((i=a[s++])!=i)return!0}else for(;o>s;s++)if((e||s in a)&&a[s]===n)return e||s||0;return!e&&-1}},fe={includes:ue(!0),indexOf:ue(!1)},de=fe.indexOf,pe=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"].concat("length","prototype"),he={f:Object.getOwnPropertyNames||function(e){return function(e,t){var n,r=m(e),i=0,a=[];for(n in r)!b(B,n)&&b(r,n)&&a.push(n);for(;t.length>i;)b(r,n=t[i++])&&(~de(a,n)||a.push(n));return a}(e,pe)}},me={f:Object.getOwnPropertySymbols},ve=te("Reflect","ownKeys")||function(e){var t=he.f(T(e)),n=me.f;return n?t.concat(n(e)):t},ge=function(e,t){for(var n=ve(t),r=O.f,i=L.f,a=0;ay;y++)if((o||y in m)&&(d=v(f=m[y],y,h),e))if(t)S[y]=d;else if(d)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:We.call(S,f)}else if(i)return!1;return a?-1:r||i?i:S}},Ue={forEach:He(0),map:He(1),filter:He(2),some:He(3),every:He(4),find:He(5),findIndex:He(6)},$e=function(e,t){var n=[][e];return!!n&&i((function(){n.call(null,t||function(){throw 1},1)}))},De=Object.defineProperty,qe={},Be=function(e){throw e},Ge=function(e,t){if(b(qe,e))return qe[e];t||(t={});var n=[][e],r=!!b(t,"ACCESSORS")&&t.ACCESSORS,o=b(t,0)?t[0]:Be,s=b(t,1)?t[1]:void 0;return qe[e]=!!n&&!i((function(){if(r&&!a)return!0;var e={length:-1};r?De(e,1,{enumerable:!0,get:Be}):e[1]=1,n.call(e,o,s)}))},Ve=Ue.every,Ke=$e("every"),ze=Ge("every");Ce({target:"Array",proto:!0,forced:!Ke||!ze},{every:function(e){return Ve(this,e,arguments.length>1?arguments[1]:void 0)}});var Xe,Ye,Je=te("navigator","userAgent")||"",Ze=r.process,Qe=Ze&&Ze.versions,et=Qe&&Qe.v8;et?Ye=(Xe=et.split("."))[0]+Xe[1]:Je&&(!(Xe=Je.match(/Edge\/(\d+)/))||Xe[1]>=74)&&(Xe=Je.match(/Chrome\/(\d+)/))&&(Ye=Xe[1]);var tt=Ye&&+Ye,nt=Ne("species"),rt=function(e){return tt>=51||!i((function(){var t=[];return(t.constructor={})[nt]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},it=Ue.filter,at=rt("filter"),ot=Ge("filter");Ce({target:"Array",proto:!0,forced:!at||!ot},{filter:function(e){return it(this,e,arguments.length>1?arguments[1]:void 0)}});var st=Ue.forEach,lt=$e("forEach"),ct=Ge("forEach"),ut=lt&&ct?[].forEach:function(e){return st(this,e,arguments.length>1?arguments[1]:void 0)};Ce({target:"Array",proto:!0,forced:[].forEach!=ut},{forEach:ut});var ft=fe.indexOf,dt=[].indexOf,pt=!!dt&&1/[1].indexOf(1,-0)<0,ht=$e("indexOf"),mt=Ge("indexOf",{ACCESSORS:!0,1:0});Ce({target:"Array",proto:!0,forced:pt||!ht||!mt},{indexOf:function(e){return pt?dt.apply(this,arguments)||0:ft(this,e,arguments.length>1?arguments[1]:void 0)}}),Ce({target:"Array",stat:!0},{isArray:ke});var vt=[].join,gt=p!=Object,yt=$e("join",",");Ce({target:"Array",proto:!0,forced:gt||!yt},{join:function(e){return vt.call(m(this),void 0===e?",":e)}});var bt=Math.min,St=[].lastIndexOf,Et=!!St&&1/[1].lastIndexOf(1,-0)<0,xt=$e("lastIndexOf"),wt=Ge("indexOf",{ACCESSORS:!0,1:0}),Lt=Et||!xt||!wt?function(e){if(Et)return St.apply(this,arguments)||0;var t=m(this),n=oe(t.length),r=n-1;for(arguments.length>1&&(r=bt(r,ie(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}:St;Ce({target:"Array",proto:!0,forced:Lt!==[].lastIndexOf},{lastIndexOf:Lt});var Tt=Ue.map,Ct=rt("map"),Ot=Ge("map");Ce({target:"Array",proto:!0,forced:!Ct||!Ot},{map:function(e){return Tt(this,e,arguments.length>1?arguments[1]:void 0)}});var At=function(e,t,n){var r=g(t);r in e?O.f(e,r,c(0,n)):e[r]=n},kt=rt("slice"),It=Ge("slice",{ACCESSORS:!0,0:0,1:2}),Pt=Ne("species"),Mt=[].slice,Rt=Math.max;Ce({target:"Array",proto:!0,forced:!kt||!It},{slice:function(e,t){var n,r,i,a=m(this),o=oe(a.length),s=ce(e,o),l=ce(void 0===t?o:t,o);if(ke(a)&&("function"!=typeof(n=a.constructor)||n!==Array&&!ke(n.prototype)?v(n)&&null===(n=n[Pt])&&(n=void 0):n=void 0,n===Array||void 0===n))return Mt.call(a,s,l);for(r=new(void 0===n?Array:n)(Rt(l-s,0)),i=0;s>>0||(Qt.test(n)?16:10))}:Zt;Ce({global:!0,forced:parseInt!=en},{parseInt:en});var tn=function(){var e=T(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function nn(e,t){return RegExp(e,t)}var rn,an,on={UNSUPPORTED_Y:i((function(){var e=nn("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET:i((function(){var e=nn("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},sn=RegExp.prototype.exec,ln=String.prototype.replace,cn=sn,un=(rn=/a/,an=/b*/g,sn.call(rn,"a"),sn.call(an,"a"),0!==rn.lastIndex||0!==an.lastIndex),fn=on.UNSUPPORTED_Y||on.BROKEN_CARET,dn=void 0!==/()??/.exec("")[1];(un||dn||fn)&&(cn=function(e){var t,n,r,i,a=this,o=fn&&a.sticky,s=tn.call(a),l=a.source,c=0,u=e;return o&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),u=String(e).slice(a.lastIndex),a.lastIndex>0&&(!a.multiline||a.multiline&&"\n"!==e[a.lastIndex-1])&&(l="(?: "+l+")",u=" "+u,c++),n=new RegExp("^(?:"+l+")",s)),dn&&(n=new RegExp("^"+l+"$(?!\\s)",s)),un&&(t=a.lastIndex),r=sn.call(o?n:a,u),o?r?(r.input=r.input.slice(c),r[0]=r[0].slice(c),r.index=a.lastIndex,a.lastIndex+=r[0].length):a.lastIndex=0:un&&r&&(a.lastIndex=a.global?r.index+r[0].length:t),dn&&r&&r.length>1&&ln.call(r[0],n,(function(){for(i=1;i1?arguments[1]:void 0,r=oe(t.length),i=void 0===n?r:xn(oe(n),r),a=String(e);return En?En.call(t,a,i):t.slice(i-a.length,i)===a}});var Ln=Ne("species"),Tn=!i((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$
")})),Cn="$0"==="a".replace(/./,"$0"),On=Ne("replace"),An=!!/./[On]&&""===/./[On]("a","$0"),kn=!i((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),In=function(e,t,n,r){var a=Ne(e),o=!i((function(){var t={};return t[a]=function(){return 7},7!=""[e](t)})),s=o&&!i((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[Ln]=function(){return n},n.flags="",n[a]=/./[a]),n.exec=function(){return t=!0,null},n[a](""),!t}));if(!o||!s||"replace"===e&&(!Tn||!Cn||An)||"split"===e&&!kn){var l=/./[a],c=n(a,""[e],(function(e,t,n,r,i){return t.exec===pn?o&&!i?{done:!0,value:l.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:Cn,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:An}),u=c[0],f=c[1];Z(String.prototype,e,u),Z(RegExp.prototype,a,2==t?function(e,t){return f.call(e,this,t)}:function(e){return f.call(e,this)})}r&&A(RegExp.prototype[a],"sham",!0)},Pn=function(e){return function(t,n){var r,i,a=String(h(t)),o=ie(n),s=a.length;return o<0||o>=s?e?"":void 0:(r=a.charCodeAt(o))<55296||r>56319||o+1===s||(i=a.charCodeAt(o+1))<56320||i>57343?e?a.charAt(o):r:e?a.slice(o,o+2):i-56320+(r-55296<<10)+65536}},Mn={codeAt:Pn(!1),charAt:Pn(!0)}.charAt,Rn=function(e,t,n){return t+(n?Mn(e,t).length:1)},jn=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==f(e))throw TypeError("RegExp#exec called on incompatible receiver");return pn.call(e,t)},Nn=Math.max,_n=Math.min,Fn=Math.floor,Wn=/\$([$&'`]|\d\d?|<[^>]*>)/g,Hn=/\$([$&'`]|\d\d?)/g;In("replace",2,(function(e,t,n,r){var i=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,a=r.REPLACE_KEEPS_$0,o=i?"$":"$0";return[function(n,r){var i=h(this),a=null==n?void 0:n[e];return void 0!==a?a.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!i&&a||"string"==typeof r&&-1===r.indexOf(o)){var l=n(t,e,this,r);if(l.done)return l.value}var c=T(e),u=String(this),f="function"==typeof r;f||(r=String(r));var d=c.global;if(d){var p=c.unicode;c.lastIndex=0}for(var h=[];;){var m=jn(c,u);if(null===m)break;if(h.push(m),!d)break;""===String(m[0])&&(c.lastIndex=Rn(u,oe(c.lastIndex),p))}for(var v,g="",y=0,b=0;b=y&&(g+=u.slice(y,E)+O,y=E+S.length)}return g+u.slice(y)}];function s(e,n,r,i,a,o){var s=r+e.length,l=i.length,c=Hn;return void 0!==a&&(a=Ae(a),c=Wn),t.call(o,c,(function(t,o){var c;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(s);case"<":c=a[o.slice(1,-1)];break;default:var u=+o;if(0===u)return t;if(u>l){var f=Fn(u/10);return 0===f?t:f<=l?void 0===i[f-1]?o.charAt(1):i[f-1]+o.charAt(1):t}c=i[u-1]}return void 0===c?"":c}))}}));var Un=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};In("search",1,(function(e,t,n){return[function(t){var n=h(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=T(e),a=String(this),o=i.lastIndex;Un(o,0)||(i.lastIndex=0);var s=jn(i,a);return Un(i.lastIndex,o)||(i.lastIndex=o),null===s?-1:s.index}]}));var $n=Ne("species"),Dn=[].push,qn=Math.min,Bn=!i((function(){return!RegExp(4294967295,"y")}));In("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(h(this)),i=void 0===n?4294967295:n>>>0;if(0===i)return[];if(void 0===e)return[r];if(!vn(e))return t.call(r,e,i);for(var a,o,s,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),u=0,f=new RegExp(e.source,c+"g");(a=pn.call(f,r))&&!((o=f.lastIndex)>u&&(l.push(r.slice(u,a.index)),a.length>1&&a.index=i));)f.lastIndex===a.index&&f.lastIndex++;return u===r.length?!s&&f.test("")||l.push(""):l.push(r.slice(u)),l.length>i?l.slice(0,i):l}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=h(this),a=null==t?void 0:t[e];return void 0!==a?a.call(t,i,n):r.call(String(i),t,n)},function(e,i){var a=n(r,e,this,i,r!==t);if(a.done)return a.value;var o=T(e),s=String(this),l=function(e,t){var n,r=T(e).constructor;return void 0===r||null==(n=T(r)[$n])?t:Oe(n)}(o,RegExp),c=o.unicode,u=(o.ignoreCase?"i":"")+(o.multiline?"m":"")+(o.unicode?"u":"")+(Bn?"y":"g"),f=new l(Bn?o:"^(?:"+o.source+")",u),d=void 0===i?4294967295:i>>>0;if(0===d)return[];if(0===s.length)return null===jn(f,s)?[s]:[];for(var p=0,h=0,m=[];h1?arguments[1]:void 0,t.length)),r=String(e);return Vn?Vn.call(t,r,n):t.slice(n,n+r.length)===r}});var Xn,Yn=Kt.trim;Ce({target:"String",proto:!0,forced:(Xn="trim",i((function(){return!!Dt[Xn]()||"​…᠎"!="​…᠎"[Xn]()||Dt[Xn].name!==Xn})))},{trim:function(){return Yn(this)}});for(var Jn in{CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}){var Zn=r[Jn],Qn=Zn&&Zn.prototype;if(Qn&&Qn.forEach!==ut)try{A(Qn,"forEach",ut)}catch(e){Qn.forEach=ut}}var er=[].slice,tr=function(e){return function(t,n){var r=arguments.length>2,i=r?er.call(arguments,2):void 0;return e(r?function(){("function"==typeof t?t:Function(t)).apply(this,i)}:t,n)}};Ce({global:!0,bind:!0,forced:/MSIE .\./.test(Je)},{setTimeout:tr(r.setTimeout),setInterval:tr(r.setInterval)});return String.prototype.startsWith||(String.prototype.startsWith=function(e,t){return this.substr(t||0,e.length)===e}),String.prototype.endsWith||(String.prototype.endsWith=function(e,t){return(void 0===t||t>this.length)&&(t=this.length),this.substring(t-e.length,t)===e}),function(){var e,t,n,r,i=(e=/(msie) ([\w.]+)/.exec(window.navigator.userAgent.toLowerCase()))&&"msie"===e[1]?parseFloat(e[2]):null,a=!1;function o(e){(r=e.menu||{}).path=r.path||function(){var e;if(document.querySelector('script[src$="menu.js"]')){var t=document.querySelector('script[src$="menu.js"]');t&&(e=t.src.slice(0,-7))}else e=("undefined"==typeof document?new(require("url").URL)("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("menu.js",document.baseURI).href).slice(0,("undefined"==typeof document?new(require("url").URL)("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("menu.js",document.baseURI).href).lastIndexOf("/")+1);return e}()||"plugin/menu/",r.path.endsWith("/")||(r.path+="/"),void 0===r.side&&(r.side="left"),void 0===r.numbers&&(r.numbers=!1),"string"!=typeof r.titleSelector&&(r.titleSelector="h1, h2, h3, h4, h5"),void 0===r.hideMissingTitles&&(r.hideMissingTitles=!1),void 0===r.useTextContentForMissingTitles&&(r.useTextContentForMissingTitles=!1),void 0===r.markers&&(r.markers=!0),"string"!=typeof r.themesPath&&(r.themesPath="dist/theme/"),r.themesPath.endsWith("/")||(r.themesPath+="/"),O("link#theme")||(r.themes=!1),!0===r.themes?r.themes=[{name:"Black",theme:r.themesPath+"black.css"},{name:"White",theme:r.themesPath+"white.css"},{name:"League",theme:r.themesPath+"league.css"},{name:"Sky",theme:r.themesPath+"sky.css"},{name:"Beige",theme:r.themesPath+"beige.css"},{name:"Simple",theme:r.themesPath+"simple.css"},{name:"Serif",theme:r.themesPath+"serif.css"},{name:"Blood",theme:r.themesPath+"blood.css"},{name:"Night",theme:r.themesPath+"night.css"},{name:"Moon",theme:r.themesPath+"moon.css"},{name:"Solarized",theme:r.themesPath+"solarized.css"}]:Array.isArray(r.themes)||(r.themes=!1),void 0===r.transitions&&(r.transitions=!1),!0===r.transitions?r.transitions=["None","Fade","Slide","Convex","Concave","Zoom"]:!1===r.transitions||Array.isArray(r.transitions)&&r.transitions.every((function(e){return"string"==typeof e}))||(console.error("reveal.js-menu error: transitions config value must be 'true' or an array of strings, eg ['None', 'Fade', 'Slide')"),r.transitions=!1),i&&i<=9&&(r.transitions=!1),void 0===r.openButton&&(r.openButton=!0),void 0===r.openSlideNumber&&(r.openSlideNumber=!1),void 0===r.keyboard&&(r.keyboard=!0),void 0===r.sticky&&(r.sticky=!1),void 0===r.autoOpen&&(r.autoOpen=!0),void 0===r.delayInit&&(r.delayInit=!1),void 0===r.openOnInit&&(r.openOnInit=!1)}var s=!0;function l(){s=!1}function c(){O("nav.slide-menu").addEventListener("mousemove",(function e(t){O("nav.slide-menu").removeEventListener("mousemove",e),s=!0}))}function u(e){var t=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-e.scrollLeft,n+=e.offsetTop-e.scrollTop,e=e.offsetParent;return{top:n,left:t}}(e).top-e.offsetParent.offsetTop;if(t<0)return-t;var n=e.offsetParent.offsetHeight-(e.offsetTop-e.offsetParent.scrollTop+e.offsetHeight);return n<0?n:0}function f(e){var t=u(e);t&&(l(),e.scrollIntoView(t>0),c())}function d(e){l(),e.offsetParent.scrollTop=e.offsetTop,c()}function p(e){l(),e.offsetParent.scrollTop=e.offsetTop-e.offsetParent.offsetHeight+e.offsetHeight,c()}function h(e){e.classList.add("selected"),f(e),r.sticky&&r.autoOpen&&E(e)}function m(e){if(b())switch(e.stopImmediatePropagation(),e.keyCode){case 72:case 37:!function(){var e=parseInt(O(".active-toolbar-button").getAttribute("data-button"))-1;e<0&&(e=T-1);S(null,O('.toolbar-panel-button[data-button="'+e+'"]').getAttribute("data-panel"))}();break;case 76:case 39:l=(parseInt(O(".active-toolbar-button").getAttribute("data-button"))+1)%T,S(null,O('.toolbar-panel-button[data-button="'+l+'"]').getAttribute("data-panel"));break;case 75:case 38:if(s=O(".active-menu-panel .slide-menu-items li.selected")||O(".active-menu-panel .slide-menu-items li.active"))A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(O('.active-menu-panel .slide-menu-items li[data-item="'+(parseInt(s.getAttribute("data-item"))-1)+'"]')||s);else(o=O(".active-menu-panel .slide-menu-items li.slide-menu-item"))&&h(o);break;case 74:case 40:if(s=O(".active-menu-panel .slide-menu-items li.selected")||O(".active-menu-panel .slide-menu-items li.active"))A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(O('.active-menu-panel .slide-menu-items li[data-item="'+(parseInt(s.getAttribute("data-item"))+1)+'"]')||s);else(o=O(".active-menu-panel .slide-menu-items li.slide-menu-item"))&&h(o);break;case 33:case 85:var t=A(".active-menu-panel .slide-menu-items li").filter((function(e){return u(e)>0})),n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})),r=t.length>0&&Math.abs(u(t[t.length-1]))0&&(p(r),r=(n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})))[0]==r?t[t.length-1]:n[0]),A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(r),d(r));break;case 34:case 68:n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)}));var i=A(".active-menu-panel .slide-menu-items li").filter((function(e){return u(e)<0})),a=i.length>0&&Math.abs(u(i[0]))0&&(d(a),a=(n=A(".active-menu-panel .slide-menu-items li").filter((function(e){return 0==u(e)})))[n.length-1]==a?i[0]:n[n.length-1]),A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),h(a),p(a));break;case 36:A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),(o=O(".active-menu-panel .slide-menu-items li:first-of-type"))&&(o.classList.add("selected"),f(o));break;case 35:var o;A(".active-menu-panel .slide-menu-items li").forEach((function(e){e.classList.remove("selected")})),(o=O(".active-menu-panel .slide-menu-items:last-of-type li:last-of-type"))&&(o.classList.add("selected"),f(o));break;case 32:case 13:var s;(s=O(".active-menu-panel .slide-menu-items li.selected"))&&E(s,!0);break;case 27:g(null,!0)}var l}function v(e){(e&&e.preventDefault(),b())||(O("body").classList.add("slide-menu-active"),O(".reveal").classList.add("has-"+r.effect+"-"+r.side),O(".slide-menu").classList.add("active"),O(".slide-menu-overlay").classList.add("active"),r.themes&&(A('div[data-panel="Themes"] li').forEach((function(e){e.classList.remove("active")})),A('li[data-theme="'+O("link#theme").getAttribute("href")+'"]').forEach((function(e){e.classList.add("active")}))),r.transitions&&(A('div[data-panel="Transitions"] li').forEach((function(e){e.classList.remove("active")})),A('li[data-transition="'+n.transition+'"]').forEach((function(e){e.classList.add("active")}))),A(".slide-menu-panel li.active").forEach((function(e){e.classList.add("selected"),f(e)})))}function g(e,t){e&&e.preventDefault(),r.sticky&&!t||(O("body").classList.remove("slide-menu-active"),O(".reveal").classList.remove("has-"+r.effect+"-"+r.side),O(".slide-menu").classList.remove("active"),O(".slide-menu-overlay").classList.remove("active"),A(".slide-menu-panel li.selected").forEach((function(e){e.classList.remove("selected")})))}function y(e){b()?g(e,!0):v(e)}function b(){return O("body").classList.contains("slide-menu-active")}function S(e,t){v(e);var n=t;"string"!=typeof t&&(n=e.currentTarget.getAttribute("data-panel")),O(".slide-menu-toolbar > li.active-toolbar-button").classList.remove("active-toolbar-button"),O('li[data-panel="'+n+'"]').classList.add("active-toolbar-button"),O(".slide-menu-panel.active-menu-panel").classList.remove("active-menu-panel"),O('div[data-panel="'+n+'"]').classList.add("active-menu-panel")}function E(e,n){var i=parseInt(e.getAttribute("data-slide-h")),a=parseInt(e.getAttribute("data-slide-v")),o=e.getAttribute("data-theme"),s=e.getAttribute("data-highlight-theme"),l=e.getAttribute("data-transition");isNaN(i)||isNaN(a)||t.slide(i,a),o&&I("theme",o),s&&I("highlight-theme",s),l&&t.configure({transition:l});var c=O("a",e);c&&(n||!r.sticky||r.autoOpen&&c.href.startsWith("#")||c.href.startsWith(window.location.origin+window.location.pathname+"#"))&&c.click(),g()}function x(e){"A"!==e.target.nodeName&&e.preventDefault(),E(e.currentTarget)}function w(){var e=t.getState();A("li.slide-menu-item, li.slide-menu-item-vertical").forEach((function(t){t.classList.remove("past"),t.classList.remove("active"),t.classList.remove("future");var n=parseInt(t.getAttribute("data-slide-h")),r=parseInt(t.getAttribute("data-slide-v"));n",s.appendChild(k("br"),O("i",s)),s.appendChild(k("span",{class:"slide-menu-toolbar-label"},e),O("i",s)),s.onclick=i,d.appendChild(s),s},i=function(e,i,a,o,s){function l(e,t){if(""===e)return null;var n=t?O(e,i):O(e);return n?n.textContent:null}var c=i.getAttribute("data-menu-title")||l(".menu-title",i)||l(r.titleSelector,i);if(!c&&r.useTextContentForMissingTitles&&(c=i.textContent.trim())&&(c=c.split("\n").map((function(e){return e.trim()})).join(" ").trim().replace(/^(.{16}[^\s]*).*/,"$1").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")+"..."),!c){if(r.hideMissingTitles)return"";e+=" no-title",c="Slide "+(a+1)}var u=k("li",{class:e,"data-item":a,"data-slide-h":o,"data-slide-v":void 0===s?0:s});if(r.markers&&(u.appendChild(k("i",{class:"fas fa-check-circle fa-fw past"})),u.appendChild(k("i",{class:"fas fa-arrow-alt-circle-right fa-fw active"})),u.appendChild(k("i",{class:"far fa-circle fa-fw future"}))),r.numbers){var f=[],d="h.v";switch("string"==typeof r.numbers?d=r.numbers:"string"==typeof n.slideNumber&&(d=n.slideNumber),d){case"c":f.push(a+1);break;case"c/t":f.push(a+1,"/",t.getTotalSlides());break;case"h/v":f.push(o+1),"number"!=typeof s||isNaN(s)||f.push("/",s+1);break;default:f.push(o+1),"number"!=typeof s||isNaN(s)||f.push(".",s+1)}u.appendChild(k("span",{class:"slide-menu-item-number"},f.join("")+". "))}return u.appendChild(k("span",{class:"slide-menu-item-title"},c)),u},o=function(e){s&&(A(".active-menu-panel .slide-menu-items li.selected").forEach((function(e){e.classList.remove("selected")})),e.currentTarget.classList.add("selected"))},l=O(".reveal").parentElement,c=k("div",{class:"slide-menu-wrapper"});l.appendChild(c);var u=k("nav",{class:"slide-menu slide-menu--"+r.side});"string"==typeof r.width&&(-1!=["normal","wide","third","half","full"].indexOf(r.width)?u.classList.add("slide-menu--"+r.width):(u.classList.add("slide-menu--custom"),u.style.width=r.width)),c.appendChild(u),L();var f=k("div",{class:"slide-menu-overlay"});c.appendChild(f),f.onclick=function(){g(null,!0)};var d=k("ol",{class:"slide-menu-toolbar"});O(".slide-menu").appendChild(d),e("Slides","Slides","fa-images","fas",S,!0),r.custom&&r.custom.forEach((function(t,n,r){e(t.title,"Custom"+n,t.icon,null,S)})),r.themes&&e("Themes","Themes","fa-adjust","fas",S),r.transitions&&e("Transitions","Transitions","fa-sticky-note","fas",S);var p=k("li",{id:"close",class:"toolbar-panel-button"});if(p.appendChild(k("i",{class:"fas fa-times"})),p.appendChild(k("br")),p.appendChild(k("span",{class:"slide-menu-toolbar-label"},"Close")),p.onclick=function(){g(null,!0)},d.appendChild(p),function e(){if(document.querySelector("section[data-markdown]:not([data-markdown-parsed])"))setTimeout(e,100);else{var t=k("div",{"data-panel":"Slides",class:"slide-menu-panel active-menu-panel"});t.appendChild(k("ul",{class:"slide-menu-items"})),u.appendChild(t);var n=O('.slide-menu-panel[data-panel="Slides"] > .slide-menu-items'),r=0;A(".slides > section").forEach((function(e,t){var a=A("section",e);if(a.length>0)a.forEach((function(e,a){var o=i(0===a?"slide-menu-item":"slide-menu-item-vertical",e,r,t,a);o&&n.appendChild(o),r++}));else{var o=i("slide-menu-item",e,r,t);o&&n.appendChild(o),r++}})),A(".slide-menu-item, .slide-menu-item-vertical").forEach((function(e){e.onclick=x})),w()}}(),t.addEventListener("slidechanged",w),r.custom){var h=function(){this.status>=200&&this.status<300?(this.panel.innerHTML=this.responseText,C(this.panel)):I(this)},E=function(){I(this)},C=function(e){A("ul.slide-menu-items li.slide-menu-item",e).forEach((function(e,t){e.setAttribute("data-item",t+1),e.onclick=x,e.addEventListener("mouseenter",o)}))},I=function(e){var t="

ERROR: The attempt to fetch "+e.responseURL+" failed with HTTP status "+e.status+" ("+e.statusText+").

Remember that you need to serve the presentation HTML from a HTTP server.

";e.panel.innerHTML=t};r.custom.forEach((function(e,t,n){var r=k("div",{"data-panel":"Custom"+t,class:"slide-menu-panel slide-menu-custom-panel"});e.content?(r.innerHTML=e.content,C(r)):e.src&&function(e,t){var n=new XMLHttpRequest;n.panel=e,n.arguments=Array.prototype.slice.call(arguments,2),n.onload=h,n.onerror=E,n.open("get",t,!0),n.send(null)}(r,e.src),u.appendChild(r)}))}if(r.themes){var P=k("div",{class:"slide-menu-panel","data-panel":"Themes"});u.appendChild(P);var M=k("ul",{class:"slide-menu-items"});P.appendChild(M),r.themes.forEach((function(e,t){var n={class:"slide-menu-item","data-item":""+(t+1)};e.theme&&(n["data-theme"]=e.theme),e.highlightTheme&&(n["data-highlight-theme"]=e.highlightTheme);var r=k("li",n,e.name);M.appendChild(r),r.onclick=x}))}if(r.transitions){P=k("div",{class:"slide-menu-panel","data-panel":"Transitions"});u.appendChild(P);M=k("ul",{class:"slide-menu-items"});P.appendChild(M),r.transitions.forEach((function(e,t){var n=k("li",{class:"slide-menu-item","data-transition":e.toLowerCase(),"data-item":""+(t+1)},e);M.appendChild(n),n.onclick=x}))}if(r.openButton){var R=k("div",{class:"slide-menu-button"}),j=k("a",{href:"#"});j.appendChild(k("i",{class:"fas fa-bars"})),R.appendChild(j),O(".reveal").appendChild(R),R.onclick=v}if(r.openSlideNumber)O("div.slide-number").onclick=v;A(".slide-menu-panel .slide-menu-items li").forEach((function(e){e.addEventListener("mouseenter",o)}))}if(r.keyboard){if(document.addEventListener("keydown",m,!1),window.addEventListener("message",(function(e){var t;try{t=JSON.parse(e.data)}catch(e){}t&&"triggerKey"===t.method&&m({keyCode:t.args[0],stopImmediatePropagation:function(){}})})),n.keyboardCondition&&"function"==typeof n.keyboardCondition){var N=n.keyboardCondition;n.keyboardCondition=function(e){return N(e)&&(!b()||77==e.keyCode)}}else n.keyboardCondition=function(e){return!b()||77==e.keyCode};t.addKeyBinding({keyCode:77,key:"M",description:"Toggle menu"},y)}r.openOnInit&&v(),a=!0}function O(e,t){return t||(t=document),t.querySelector(e)}function A(e,t){return t||(t=document),Array.prototype.slice.call(t.querySelectorAll(e))}function k(e,t,n){var r=document.createElement(e);return t&&Object.getOwnPropertyNames(t).forEach((function(e){r.setAttribute(e,t[e])})),n&&(r.innerHTML=n),r}function I(e,t){var n=O("link#"+e),r=n.parentElement,i=n.nextElementSibling;n.remove();var a=n.cloneNode();a.setAttribute("href",t),a.onload=function(){L()},r.insertBefore(a,i)}function P(e,t,n){var r,i=document.querySelector("head");"script"===t?((r=document.createElement("script")).type="text/javascript",r.src=e):"stylesheet"===t&&((r=document.createElement("link")).rel="stylesheet",r.href=e);var a=function(){"function"==typeof n&&(n.call(),n=null)};r.onload=a,r.onreadystatechange=function(){"loaded"===this.readyState&&a()},i.appendChild(r)}function M(){var e,a,o,s=!i||i>=9;t.isSpeakerNotes()&&window.location.search.endsWith("controls=false")&&(s=!1),s&&(r.delayInit||C(),e="menu-ready",(o=document.createEvent("HTMLEvents",1,2)).initEvent(e,!0,!0),function(e,t){for(var n in t)e[n]=t[n]}(o,a),document.querySelector(".reveal").dispatchEvent(o),n.postMessageEvents&&window.parent!==window.self&&window.parent.postMessage(JSON.stringify({namespace:"reveal",eventName:e,state:t.getState()}),"*"))}return{id:"menu",init:function(e){o(n=(t=e).getConfig()),P(r.path+"menu.css","stylesheet",(function(){void 0===r.loadIcons||r.loadIcons?P(r.path+"font-awesome/css/all.css","stylesheet",M):M()}))},toggle:y,openMenu:v,closeMenu:g,openPanel:S,isOpen:b,initialiseMenu:C,isMenuInitialised:function(){return a}}}})); diff --git a/slides/revealjs-plugins/menu/plugin.js b/slides/revealjs-plugins/menu/plugin.js new file mode 100644 index 0000000..b7939e5 --- /dev/null +++ b/slides/revealjs-plugins/menu/plugin.js @@ -0,0 +1,1252 @@ +/* + * Reveal.js menu plugin + * MIT licensed + * (c) Greg Denehy 2020 + */ + +const Plugin = () => { + const ieVersion = (function () { + let browser = /(msie) ([\w.]+)/.exec( + window.navigator.userAgent.toLowerCase() + ); + if (browser && browser[1] === 'msie') { + return parseFloat(browser[2]); + } + return null; + })(); + + var deck; + var config; + var options; + var initialised = false; + + function scriptPath() { + // obtain plugin path from the script element + var path; + + const script = document.querySelector('script[src$="menu.js"]'); + if (script) { + var sel = document.querySelector('script[src$="menu.js"]'); + if (sel) { + path = sel.src.slice(0, -7); + } + } else { + path = import.meta.url.slice(0, import.meta.url.lastIndexOf('/') + 1); + } + + return path; + } + + function initOptions(config) { + options = config.menu || {}; + options.path = options.path || scriptPath() || 'plugin/menu/'; + if (!options.path.endsWith('/')) { + options.path += '/'; + } + + // Set defaults + if (options.side === undefined) options.side = 'left'; + + if (options.numbers === undefined) options.numbers = false; + + if (typeof options.titleSelector !== 'string') + options.titleSelector = 'h1, h2, h3, h4, h5'; + + if (options.hideMissingTitles === undefined) + options.hideMissingTitles = false; + + if (options.useTextContentForMissingTitles === undefined) + options.useTextContentForMissingTitles = false; + + if (options.markers === undefined) options.markers = true; + + if (typeof options.themesPath !== 'string') + options.themesPath = 'dist/theme/'; + if (!options.themesPath.endsWith('/')) options.themesPath += '/'; + + if (!select('link#theme')) options.themes = false; + if (options.themes === true) { + options.themes = [ + { name: 'Black', theme: options.themesPath + 'black.css' }, + { name: 'White', theme: options.themesPath + 'white.css' }, + { name: 'League', theme: options.themesPath + 'league.css' }, + { name: 'Sky', theme: options.themesPath + 'sky.css' }, + { name: 'Beige', theme: options.themesPath + 'beige.css' }, + { name: 'Simple', theme: options.themesPath + 'simple.css' }, + { name: 'Serif', theme: options.themesPath + 'serif.css' }, + { name: 'Blood', theme: options.themesPath + 'blood.css' }, + { name: 'Night', theme: options.themesPath + 'night.css' }, + { name: 'Moon', theme: options.themesPath + 'moon.css' }, + { name: 'Solarized', theme: options.themesPath + 'solarized.css' } + ]; + } else if (!Array.isArray(options.themes)) { + options.themes = false; + } + + if (options.transitions === undefined) options.transitions = false; + if (options.transitions === true) { + options.transitions = [ + 'None', + 'Fade', + 'Slide', + 'Convex', + 'Concave', + 'Zoom' + ]; + } else if ( + options.transitions !== false && + (!Array.isArray(options.transitions) || + !options.transitions.every(function (e) { + return typeof e === 'string'; + })) + ) { + console.error( + "reveal.js-menu error: transitions config value must be 'true' or an array of strings, eg ['None', 'Fade', 'Slide')" + ); + options.transitions = false; + } + if (ieVersion && ieVersion <= 9) { + // transitions aren't support in IE9 anyway, so no point in showing them + options.transitions = false; + } + + if (typeof options.openButton === 'undefined') options.openButton = true; + + if (typeof options.openSlideNumber === 'undefined') + options.openSlideNumber = false; + + if (typeof options.keyboard === 'undefined') options.keyboard = true; + + if (typeof options.sticky === 'undefined') options.sticky = false; + + if (typeof options.autoOpen === 'undefined') options.autoOpen = true; + + if (typeof options.delayInit === 'undefined') options.delayInit = false; + + if (typeof options.openOnInit === 'undefined') options.openOnInit = false; + } + + var mouseSelectionEnabled = true; + function disableMouseSelection() { + mouseSelectionEnabled = false; + } + + function reenableMouseSelection() { + // wait until the mouse has moved before re-enabling mouse selection + // to avoid selections on scroll + select('nav.slide-menu').addEventListener('mousemove', function fn(e) { + select('nav.slide-menu').removeEventListener('mousemove', fn); + //XXX this should select the item under the mouse + mouseSelectionEnabled = true; + }); + } + + // + // Keyboard handling + // + function getOffset(el) { + var _x = 0; + var _y = 0; + while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) { + _x += el.offsetLeft - el.scrollLeft; + _y += el.offsetTop - el.scrollTop; + el = el.offsetParent; + } + return { top: _y, left: _x }; + } + + function visibleOffset(el) { + var offsetFromTop = getOffset(el).top - el.offsetParent.offsetTop; + if (offsetFromTop < 0) return -offsetFromTop; + var offsetFromBottom = + el.offsetParent.offsetHeight - + (el.offsetTop - el.offsetParent.scrollTop + el.offsetHeight); + if (offsetFromBottom < 0) return offsetFromBottom; + return 0; + } + + function keepVisible(el) { + var offset = visibleOffset(el); + if (offset) { + disableMouseSelection(); + el.scrollIntoView(offset > 0); + reenableMouseSelection(); + } + } + + function scrollItemToTop(el) { + disableMouseSelection(); + el.offsetParent.scrollTop = el.offsetTop; + reenableMouseSelection(); + } + + function scrollItemToBottom(el) { + disableMouseSelection(); + el.offsetParent.scrollTop = + el.offsetTop - el.offsetParent.offsetHeight + el.offsetHeight; + reenableMouseSelection(); + } + + function selectItem(el) { + el.classList.add('selected'); + keepVisible(el); + if (options.sticky && options.autoOpen) openItem(el); + } + + function onDocumentKeyDown(event) { + // opening menu is handled by registering key binding with Reveal below + if (isOpen()) { + event.stopImmediatePropagation(); + switch (event.keyCode) { + // case 77: + // closeMenu(); + // break; + // h, left - change panel + case 72: + case 37: + prevPanel(); + break; + // l, right - change panel + case 76: + case 39: + nextPanel(); + break; + // k, up + case 75: + case 38: + var currItem = + select('.active-menu-panel .slide-menu-items li.selected') || + select('.active-menu-panel .slide-menu-items li.active'); + if (currItem) { + selectAll('.active-menu-panel .slide-menu-items li').forEach( + function (item) { + item.classList.remove('selected'); + } + ); + var nextItem = + select( + '.active-menu-panel .slide-menu-items li[data-item="' + + (parseInt(currItem.getAttribute('data-item')) - 1) + + '"]' + ) || currItem; + selectItem(nextItem); + } else { + var item = select( + '.active-menu-panel .slide-menu-items li.slide-menu-item' + ); + if (item) selectItem(item); + } + break; + // j, down + case 74: + case 40: + var currItem = + select('.active-menu-panel .slide-menu-items li.selected') || + select('.active-menu-panel .slide-menu-items li.active'); + if (currItem) { + selectAll('.active-menu-panel .slide-menu-items li').forEach( + function (item) { + item.classList.remove('selected'); + } + ); + var nextItem = + select( + '.active-menu-panel .slide-menu-items li[data-item="' + + (parseInt(currItem.getAttribute('data-item')) + 1) + + '"]' + ) || currItem; + selectItem(nextItem); + } else { + var item = select( + '.active-menu-panel .slide-menu-items li.slide-menu-item' + ); + if (item) selectItem(item); + } + break; + // pageup, u + case 33: + case 85: + var itemsAbove = selectAll( + '.active-menu-panel .slide-menu-items li' + ).filter(function (item) { + return visibleOffset(item) > 0; + }); + var visibleItems = selectAll( + '.active-menu-panel .slide-menu-items li' + ).filter(function (item) { + return visibleOffset(item) == 0; + }); + + var firstVisible = + itemsAbove.length > 0 && + Math.abs(visibleOffset(itemsAbove[itemsAbove.length - 1])) < + itemsAbove[itemsAbove.length - 1].clientHeight + ? itemsAbove[itemsAbove.length - 1] + : visibleItems[0]; + if (firstVisible) { + if ( + firstVisible.classList.contains('selected') && + itemsAbove.length > 0 + ) { + // at top of viewport already, page scroll (if not at start) + // ...move selected item to bottom, and change selection to last fully visible item at top + scrollItemToBottom(firstVisible); + visibleItems = selectAll( + '.active-menu-panel .slide-menu-items li' + ).filter(function (item) { + return visibleOffset(item) == 0; + }); + if (visibleItems[0] == firstVisible) { + // prev item is still beyond the viewport (for custom panels) + firstVisible = itemsAbove[itemsAbove.length - 1]; + } else { + firstVisible = visibleItems[0]; + } + } + selectAll('.active-menu-panel .slide-menu-items li').forEach( + function (item) { + item.classList.remove('selected'); + } + ); + selectItem(firstVisible); + // ensure selected item is positioned at the top of the viewport + scrollItemToTop(firstVisible); + } + break; + // pagedown, d + case 34: + case 68: + var visibleItems = selectAll( + '.active-menu-panel .slide-menu-items li' + ).filter(function (item) { + return visibleOffset(item) == 0; + }); + var itemsBelow = selectAll( + '.active-menu-panel .slide-menu-items li' + ).filter(function (item) { + return visibleOffset(item) < 0; + }); + + var lastVisible = + itemsBelow.length > 0 && + Math.abs(visibleOffset(itemsBelow[0])) < itemsBelow[0].clientHeight + ? itemsBelow[0] + : visibleItems[visibleItems.length - 1]; + if (lastVisible) { + if ( + lastVisible.classList.contains('selected') && + itemsBelow.length > 0 + ) { + // at bottom of viewport already, page scroll (if not at end) + // ...move selected item to top, and change selection to last fully visible item at bottom + scrollItemToTop(lastVisible); + visibleItems = selectAll( + '.active-menu-panel .slide-menu-items li' + ).filter(function (item) { + return visibleOffset(item) == 0; + }); + if (visibleItems[visibleItems.length - 1] == lastVisible) { + // next item is still beyond the viewport (for custom panels) + lastVisible = itemsBelow[0]; + } else { + lastVisible = visibleItems[visibleItems.length - 1]; + } + } + selectAll('.active-menu-panel .slide-menu-items li').forEach( + function (item) { + item.classList.remove('selected'); + } + ); + selectItem(lastVisible); + // ensure selected item is positioned at the bottom of the viewport + scrollItemToBottom(lastVisible); + } + break; + // home + case 36: + selectAll('.active-menu-panel .slide-menu-items li').forEach( + function (item) { + item.classList.remove('selected'); + } + ); + var item = select( + '.active-menu-panel .slide-menu-items li:first-of-type' + ); + if (item) { + item.classList.add('selected'); + keepVisible(item); + } + break; + // end + case 35: + selectAll('.active-menu-panel .slide-menu-items li').forEach( + function (item) { + item.classList.remove('selected'); + } + ); + var item = select( + '.active-menu-panel .slide-menu-items:last-of-type li:last-of-type' + ); + if (item) { + item.classList.add('selected'); + keepVisible(item); + } + break; + // space, return + case 32: + case 13: + var currItem = select( + '.active-menu-panel .slide-menu-items li.selected' + ); + if (currItem) { + openItem(currItem, true); + } + break; + // esc + case 27: + closeMenu(null, true); + break; + } + } + } + + // + // Utilty functions + // + + function openMenu(event) { + if (event) event.preventDefault(); + if (!isOpen()) { + select('body').classList.add('slide-menu-active'); + select('.reveal').classList.add( + 'has-' + options.effect + '-' + options.side + ); + select('.slide-menu').classList.add('active'); + select('.slide-menu-overlay').classList.add('active'); + + // identify active theme + if (options.themes) { + selectAll('div[data-panel="Themes"] li').forEach(function (i) { + i.classList.remove('active'); + }); + selectAll( + 'li[data-theme="' + select('link#theme').getAttribute('href') + '"]' + ).forEach(function (i) { + i.classList.add('active'); + }); + } + + // identify active transition + if (options.transitions) { + selectAll('div[data-panel="Transitions"] li').forEach(function (i) { + i.classList.remove('active'); + }); + selectAll('li[data-transition="' + config.transition + '"]').forEach( + function (i) { + i.classList.add('active'); + } + ); + } + + // set item selections to match active items + var items = selectAll('.slide-menu-panel li.active'); + items.forEach(function (i) { + i.classList.add('selected'); + keepVisible(i); + }); + } + } + + function closeMenu(event, force) { + if (event) event.preventDefault(); + if (!options.sticky || force) { + select('body').classList.remove('slide-menu-active'); + select('.reveal').classList.remove( + 'has-' + options.effect + '-' + options.side + ); + select('.slide-menu').classList.remove('active'); + select('.slide-menu-overlay').classList.remove('active'); + selectAll('.slide-menu-panel li.selected').forEach(function (i) { + i.classList.remove('selected'); + }); + } + } + + function toggleMenu(event) { + if (isOpen()) { + closeMenu(event, true); + } else { + openMenu(event); + } + } + + function isOpen() { + return select('body').classList.contains('slide-menu-active'); + } + + function openPanel(event, ref) { + openMenu(event); + var panel = ref; + if (typeof ref !== 'string') { + panel = event.currentTarget.getAttribute('data-panel'); + } + select('.slide-menu-toolbar > li.active-toolbar-button').classList.remove( + 'active-toolbar-button' + ); + select('li[data-panel="' + panel + '"]').classList.add( + 'active-toolbar-button' + ); + select('.slide-menu-panel.active-menu-panel').classList.remove( + 'active-menu-panel' + ); + select('div[data-panel="' + panel + '"]').classList.add( + 'active-menu-panel' + ); + } + + function nextPanel() { + var next = + (parseInt(select('.active-toolbar-button').getAttribute('data-button')) + + 1) % + buttons; + openPanel( + null, + select('.toolbar-panel-button[data-button="' + next + '"]').getAttribute( + 'data-panel' + ) + ); + } + + function prevPanel() { + var next = + parseInt(select('.active-toolbar-button').getAttribute('data-button')) - + 1; + if (next < 0) { + next = buttons - 1; + } + openPanel( + null, + select('.toolbar-panel-button[data-button="' + next + '"]').getAttribute( + 'data-panel' + ) + ); + } + + function openItem(item, force) { + var h = parseInt(item.getAttribute('data-slide-h')); + var v = parseInt(item.getAttribute('data-slide-v')); + var theme = item.getAttribute('data-theme'); + var highlightTheme = item.getAttribute('data-highlight-theme'); + var transition = item.getAttribute('data-transition'); + + if (!isNaN(h) && !isNaN(v)) { + deck.slide(h, v); + } + + if (theme) { + changeStylesheet('theme', theme); + } + + if (highlightTheme) { + changeStylesheet('highlight-theme', highlightTheme); + } + + if (transition) { + deck.configure({ transition: transition }); + } + + var link = select('a', item); + if (link) { + if ( + force || + !options.sticky || + (options.autoOpen && link.href.startsWith('#')) || + link.href.startsWith( + window.location.origin + window.location.pathname + '#' + ) + ) { + link.click(); + } + } + + closeMenu(); + } + + function clicked(event) { + if (event.target.nodeName !== 'A') { + event.preventDefault(); + } + openItem(event.currentTarget); + } + + function highlightCurrentSlide() { + var state = deck.getState(); + selectAll('li.slide-menu-item, li.slide-menu-item-vertical').forEach( + function (item) { + item.classList.remove('past'); + item.classList.remove('active'); + item.classList.remove('future'); + + var h = parseInt(item.getAttribute('data-slide-h')); + var v = parseInt(item.getAttribute('data-slide-v')); + if (h < state.indexh || (h === state.indexh && v < state.indexv)) { + item.classList.add('past'); + } else if (h === state.indexh && v === state.indexv) { + item.classList.add('active'); + } else { + item.classList.add('future'); + } + } + ); + } + + function matchRevealStyle() { + var revealStyle = window.getComputedStyle(select('.reveal')); + var element = select('.slide-menu'); + element.style.fontFamily = revealStyle.fontFamily; + //XXX could adjust the complete menu style to match the theme, ie colors, etc + } + + var buttons = 0; + function initMenu() { + if (!initialised) { + var parent = select('.reveal').parentElement; + var top = create('div', { class: 'slide-menu-wrapper' }); + parent.appendChild(top); + var panels = create('nav', { + class: 'slide-menu slide-menu--' + options.side + }); + if (typeof options.width === 'string') { + if ( + ['normal', 'wide', 'third', 'half', 'full'].indexOf(options.width) != + -1 + ) { + panels.classList.add('slide-menu--' + options.width); + } else { + panels.classList.add('slide-menu--custom'); + panels.style.width = options.width; + } + } + top.appendChild(panels); + matchRevealStyle(); + var overlay = create('div', { class: 'slide-menu-overlay' }); + top.appendChild(overlay); + overlay.onclick = function () { + closeMenu(null, true); + }; + + var toolbar = create('ol', { class: 'slide-menu-toolbar' }); + select('.slide-menu').appendChild(toolbar); + + function addToolbarButton(title, ref, icon, style, fn, active) { + var attrs = { + 'data-button': '' + buttons++, + class: + 'toolbar-panel-button' + (active ? ' active-toolbar-button' : '') + }; + if (ref) { + attrs['data-panel'] = ref; + } + var button = create('li', attrs); + + if (icon.startsWith('fa-')) { + button.appendChild(create('i', { class: style + ' ' + icon })); + } else { + button.innerHTML = icon + '
'; + } + button.appendChild(create('br'), select('i', button)); + button.appendChild( + create('span', { class: 'slide-menu-toolbar-label' }, title), + select('i', button) + ); + button.onclick = fn; + toolbar.appendChild(button); + return button; + } + + addToolbarButton('Slides', 'Slides', 'fa-images', 'fas', openPanel, true); + + if (options.custom) { + options.custom.forEach(function (element, index, array) { + addToolbarButton( + element.title, + 'Custom' + index, + element.icon, + null, + openPanel + ); + }); + } + + if (options.themes) { + addToolbarButton('Themes', 'Themes', 'fa-adjust', 'fas', openPanel); + } + if (options.transitions) { + addToolbarButton( + 'Transitions', + 'Transitions', + 'fa-sticky-note', + 'fas', + openPanel + ); + } + var button = create('li', { + id: 'close', + class: 'toolbar-panel-button' + }); + button.appendChild(create('i', { class: 'fas fa-times' })); + button.appendChild(create('br')); + button.appendChild( + create('span', { class: 'slide-menu-toolbar-label' }, 'Close') + ); + button.onclick = function () { + closeMenu(null, true); + }; + toolbar.appendChild(button); + + // + // Slide links + // + function generateItem(type, section, i, h, v) { + var link = '/#/' + h; + if (typeof v === 'number' && !isNaN(v)) link += '/' + v; + + function text(selector, parent) { + if (selector === '') return null; + var el = parent ? select(selector, section) : select(selector); + if (el) return el.textContent; + return null; + } + var title = + section.getAttribute('data-menu-title') || + text('.menu-title', section) || + text(options.titleSelector, section); + + if (!title && options.useTextContentForMissingTitles) { + // attempt to figure out a title based on the text in the slide + title = section.textContent.trim(); + if (title) { + title = + title + .split('\n') + .map(function (t) { + return t.trim(); + }) + .join(' ') + .trim() + .replace(/^(.{16}[^\s]*).*/, '$1') // limit to 16 chars plus any consecutive non-whitespace chars (to avoid breaking words) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, ''') + '...'; + } + } + + if (!title) { + if (options.hideMissingTitles) return ''; + type += ' no-title'; + title = 'Slide ' + (i + 1); + } + + var item = create('li', { + class: type, + 'data-item': i, + 'data-slide-h': h, + 'data-slide-v': v === undefined ? 0 : v + }); + + if (options.markers) { + item.appendChild( + create('i', { class: 'fas fa-check-circle fa-fw past' }) + ); + item.appendChild( + create('i', { + class: 'fas fa-arrow-alt-circle-right fa-fw active' + }) + ); + item.appendChild( + create('i', { class: 'far fa-circle fa-fw future' }) + ); + } + + if (options.numbers) { + // Number formatting taken from reveal.js + var value = []; + var format = 'h.v'; + + // Check if a custom number format is available + if (typeof options.numbers === 'string') { + format = options.numbers; + } else if (typeof config.slideNumber === 'string') { + // Take user defined number format for slides + format = config.slideNumber; + } + + switch (format) { + case 'c': + value.push(i + 1); + break; + case 'c/t': + value.push(i + 1, '/', deck.getTotalSlides()); + break; + case 'h/v': + value.push(h + 1); + if (typeof v === 'number' && !isNaN(v)) value.push('/', v + 1); + break; + default: + value.push(h + 1); + if (typeof v === 'number' && !isNaN(v)) value.push('.', v + 1); + } + + item.appendChild( + create( + 'span', + { class: 'slide-menu-item-number' }, + value.join('') + '. ' + ) + ); + } + + item.appendChild( + create('span', { class: 'slide-menu-item-title' }, title) + ); + + return item; + } + + function createSlideMenu() { + if ( + !document.querySelector( + 'section[data-markdown]:not([data-markdown-parsed])' + ) + ) { + var panel = create('div', { + 'data-panel': 'Slides', + class: 'slide-menu-panel active-menu-panel' + }); + panel.appendChild(create('ul', { class: 'slide-menu-items' })); + panels.appendChild(panel); + var items = select( + '.slide-menu-panel[data-panel="Slides"] > .slide-menu-items' + ); + var slideCount = 0; + selectAll('.slides > section').forEach(function (section, h) { + var subsections = selectAll('section', section); + if (subsections.length > 0) { + subsections.forEach(function (subsection, v) { + var type = + v === 0 ? 'slide-menu-item' : 'slide-menu-item-vertical'; + var item = generateItem(type, subsection, slideCount, h, v); + if (item) { + items.appendChild(item); + } + slideCount++; + }); + } else { + var item = generateItem( + 'slide-menu-item', + section, + slideCount, + h + ); + if (item) { + items.appendChild(item); + } + slideCount++; + } + }); + selectAll('.slide-menu-item, .slide-menu-item-vertical').forEach( + function (i) { + i.onclick = clicked; + } + ); + highlightCurrentSlide(); + } else { + // wait for markdown to be loaded and parsed + setTimeout(createSlideMenu, 100); + } + } + + createSlideMenu(); + deck.addEventListener('slidechanged', highlightCurrentSlide); + + // + // Custom menu panels + // + if (options.custom) { + function xhrSuccess() { + if (this.status >= 200 && this.status < 300) { + this.panel.innerHTML = this.responseText; + enableCustomLinks(this.panel); + } else { + showErrorMsg(this); + } + } + function xhrError() { + showErrorMsg(this); + } + function loadCustomPanelContent(panel, sURL) { + var oReq = new XMLHttpRequest(); + oReq.panel = panel; + oReq.arguments = Array.prototype.slice.call(arguments, 2); + oReq.onload = xhrSuccess; + oReq.onerror = xhrError; + oReq.open('get', sURL, true); + oReq.send(null); + } + function enableCustomLinks(panel) { + selectAll('ul.slide-menu-items li.slide-menu-item', panel).forEach( + function (item, i) { + item.setAttribute('data-item', i + 1); + item.onclick = clicked; + item.addEventListener('mouseenter', handleMouseHighlight); + } + ); + } + + function showErrorMsg(response) { + var msg = + '

ERROR: The attempt to fetch ' + + response.responseURL + + ' failed with HTTP status ' + + response.status + + ' (' + + response.statusText + + ').

' + + '

Remember that you need to serve the presentation HTML from a HTTP server.

'; + response.panel.innerHTML = msg; + } + + options.custom.forEach(function (element, index, array) { + var panel = create('div', { + 'data-panel': 'Custom' + index, + class: 'slide-menu-panel slide-menu-custom-panel' + }); + if (element.content) { + panel.innerHTML = element.content; + enableCustomLinks(panel); + } else if (element.src) { + loadCustomPanelContent(panel, element.src); + } + panels.appendChild(panel); + }); + } + + // + // Themes + // + if (options.themes) { + var panel = create('div', { + class: 'slide-menu-panel', + 'data-panel': 'Themes' + }); + panels.appendChild(panel); + var menu = create('ul', { class: 'slide-menu-items' }); + panel.appendChild(menu); + options.themes.forEach(function (t, i) { + var attrs = { + class: 'slide-menu-item', + 'data-item': '' + (i + 1) + }; + if (t.theme) { + attrs['data-theme'] = t.theme; + } + if (t.highlightTheme) { + attrs['data-highlight-theme'] = t.highlightTheme; + } + var item = create('li', attrs, t.name); + menu.appendChild(item); + item.onclick = clicked; + }); + } + + // + // Transitions + // + if (options.transitions) { + var panel = create('div', { + class: 'slide-menu-panel', + 'data-panel': 'Transitions' + }); + panels.appendChild(panel); + var menu = create('ul', { class: 'slide-menu-items' }); + panel.appendChild(menu); + options.transitions.forEach(function (name, i) { + var item = create( + 'li', + { + class: 'slide-menu-item', + 'data-transition': name.toLowerCase(), + 'data-item': '' + (i + 1) + }, + name + ); + menu.appendChild(item); + item.onclick = clicked; + }); + } + + // + // Open menu options + // + if (options.openButton) { + // add menu button + var div = create('div', { class: 'slide-menu-button' }); + var link = create('a', { href: '#' }); + link.appendChild(create('i', { class: 'fas fa-bars' })); + div.appendChild(link); + select('.reveal').appendChild(div); + div.onclick = openMenu; + } + + if (options.openSlideNumber) { + var slideNumber = select('div.slide-number'); + slideNumber.onclick = openMenu; + } + + // + // Handle mouse overs + // + selectAll('.slide-menu-panel .slide-menu-items li').forEach(function ( + item + ) { + item.addEventListener('mouseenter', handleMouseHighlight); + }); + + function handleMouseHighlight(event) { + if (mouseSelectionEnabled) { + selectAll('.active-menu-panel .slide-menu-items li.selected').forEach( + function (i) { + i.classList.remove('selected'); + } + ); + event.currentTarget.classList.add('selected'); + } + } + } + + if (options.keyboard) { + //XXX add keyboard option for custom key codes, etc. + + document.addEventListener('keydown', onDocumentKeyDown, false); + + // handle key presses within speaker notes + window.addEventListener('message', function (event) { + var data; + try { + data = JSON.parse(event.data); + } catch (e) {} + if (data && data.method === 'triggerKey') { + onDocumentKeyDown({ + keyCode: data.args[0], + stopImmediatePropagation: function () {} + }); + } + }); + + // Prevent reveal from processing keyboard events when the menu is open + if ( + config.keyboardCondition && + typeof config.keyboardCondition === 'function' + ) { + // combine user defined keyboard condition with the menu's own condition + var userCondition = config.keyboardCondition; + config.keyboardCondition = function (event) { + return userCondition(event) && (!isOpen() || event.keyCode == 77); + }; + } else { + config.keyboardCondition = function (event) { + return !isOpen() || event.keyCode == 77; + }; + } + + deck.addKeyBinding( + { keyCode: 77, key: 'M', description: 'Toggle menu' }, + toggleMenu + ); + } + + if (options.openOnInit) { + openMenu(); + } + + initialised = true; + } + + /** + * Extend object a with the properties of object b. + * If there's a conflict, object b takes precedence. + */ + function extend(a, b) { + for (var i in b) { + a[i] = b[i]; + } + } + + /** + * Dispatches an event of the specified type from the + * reveal DOM element. + */ + function dispatchEvent(type, args) { + var event = document.createEvent('HTMLEvents', 1, 2); + event.initEvent(type, true, true); + extend(event, args); + document.querySelector('.reveal').dispatchEvent(event); + + // If we're in an iframe, post each reveal.js event to the + // parent window. Used by the notes plugin + if (config.postMessageEvents && window.parent !== window.self) { + window.parent.postMessage( + JSON.stringify({ + namespace: 'reveal', + eventName: type, + state: deck.getState() + }), + '*' + ); + } + } + + function select(selector, el) { + if (!el) { + el = document; + } + return el.querySelector(selector); + } + + function selectAll(selector, el) { + if (!el) { + el = document; + } + return Array.prototype.slice.call(el.querySelectorAll(selector)); + } + + function create(tagName, attrs, content) { + var el = document.createElement(tagName); + if (attrs) { + Object.getOwnPropertyNames(attrs).forEach(function (n) { + el.setAttribute(n, attrs[n]); + }); + } + if (content) el.innerHTML = content; + return el; + } + + function changeStylesheet(id, href) { + // take note of the previous theme and remove it, then create a new stylesheet reference and insert it + // this is required to force a load event so we can change the menu style to match the new style + var stylesheet = select('link#' + id); + var parent = stylesheet.parentElement; + var sibling = stylesheet.nextElementSibling; + stylesheet.remove(); + + var newStylesheet = stylesheet.cloneNode(); + newStylesheet.setAttribute('href', href); + newStylesheet.onload = function () { + matchRevealStyle(); + }; + parent.insertBefore(newStylesheet, sibling); + } + + // modified from math plugin + function loadResource(url, type, callback) { + var head = document.querySelector('head'); + var resource; + + if (type === 'script') { + resource = document.createElement('script'); + resource.type = 'text/javascript'; + resource.src = url; + } else if (type === 'stylesheet') { + resource = document.createElement('link'); + resource.rel = 'stylesheet'; + resource.href = url; + } + + // Wrapper for callback to make sure it only fires once + var finish = function () { + if (typeof callback === 'function') { + callback.call(); + callback = null; + } + }; + + resource.onload = finish; + + // IE + resource.onreadystatechange = function () { + if (this.readyState === 'loaded') { + finish(); + } + }; + + // Normal browsers + head.appendChild(resource); + } + + function loadPlugin() { + // does not support IE8 or below + var supported = !ieVersion || ieVersion >= 9; + + // do not load the menu in the upcoming slide panel in the speaker notes + if ( + deck.isSpeakerNotes() && + window.location.search.endsWith('controls=false') + ) { + supported = false; + } + + if (supported) { + if (!options.delayInit) initMenu(); + dispatchEvent('menu-ready'); + } + } + + return { + id: 'menu', + init: reveal => { + deck = reveal; + config = deck.getConfig(); + initOptions(config); + loadResource(options.path + 'menu.css', 'stylesheet', function () { + if (options.loadIcons === undefined || options.loadIcons) { + loadResource( + options.path + 'font-awesome/css/all.css', + 'stylesheet', + loadPlugin + ); + } else { + loadPlugin(); + } + }); + }, + + toggle: toggleMenu, + openMenu: openMenu, + closeMenu: closeMenu, + openPanel: openPanel, + isOpen: isOpen, + initialiseMenu: initMenu, + isMenuInitialised: function () { + return initialised; + } + }; +}; + +// polyfill +if (!String.prototype.startsWith) { + String.prototype.startsWith = function (searchString, position) { + return this.substr(position || 0, searchString.length) === searchString; + }; +} +if (!String.prototype.endsWith) { + String.prototype.endsWith = function (search, this_len) { + if (this_len === undefined || this_len > this.length) { + this_len = this.length; + } + return this.substring(this_len - search.length, this_len) === search; + }; +} + +export default Plugin;