From 749a200f9f010427b400f93c6f28624b488a6b62 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci Date: Mon, 30 Oct 2023 16:13:26 +0100 Subject: [PATCH 01/21] Remove here from episode 9 --- episodes/09-open-and-plot-vector-layers.Rmd | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/episodes/09-open-and-plot-vector-layers.Rmd b/episodes/09-open-and-plot-vector-layers.Rmd index 1cdb1524..46fbdf25 100644 --- a/episodes/09-open-and-plot-vector-layers.Rmd +++ b/episodes/09-open-and-plot-vector-layers.Rmd @@ -35,11 +35,10 @@ If you have not installed the `sf` package yet, run `install.packages("sf")` fir ::: -First we need to load the packages we will use in this lesson. We will use the packages `tidyverse` and `here` with which you are already familiar from the previous lesson. In addition, we need to load the [`sf`](https://r-spatial.github.io/sf/) package for working with spatial vector data. +First we need to load the packages we will use in this lesson. We will use the package `tidyverse` with which you are already familiar from the previous lesson. In addition, we need to load the [`sf`](https://r-spatial.github.io/sf/) package for working with spatial vector data. ```{r lib, message=FALSE} library(tidyverse) # tools for wrangling, reshaping and visualizing data -library(here) # managing paths library(sf) # work with spatial vector data ``` From cc6b0959decb2e5d8f629bdeb2097339faca5849 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci Date: Tue, 31 Oct 2023 09:47:14 +0100 Subject: [PATCH 02/21] Remove example lesson --- config.yaml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/config.yaml b/config.yaml index 6fec2fcb..2f000c1d 100644 --- a/config.yaml +++ b/config.yaml @@ -14,7 +14,7 @@ carpentry: 'incubator' title: 'Geospatial Data Carpentry with R for Urbanists' # Date the lesson was created (YYYY-MM-DD, this is empty by default) -created: +created: # Comma-separated list of keywords for the lesson keywords: 'software, data, lesson, The Carpentries, geospatial' @@ -58,21 +58,20 @@ contact: 'c.forgaci@tudelft.nl' # - another-learner.md # Order of episodes in your lesson -episodes: -- introduction.Rmd +episodes: - 09-open-and-plot-vector-layers.Rmd - 10-explore-and-plot-by-vector-layer-attributes.Rmd - 11-plot-multiple-shape-files.Rmd - 12-handling-spatial-projection-and-crs.Rmd # Information for Learners -learners: +learners: # Information for Instructors -instructors: +instructors: # Learner Profiles -profiles: +profiles: # Customisation --------------------------------------------- # From 92b3d822996ca7001c77359e59572fb3060d5b3a Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:01:01 +0100 Subject: [PATCH 03/21] Add missing link in episodes/09-open-and-plot-vector-layers.Rmd --- episodes/09-open-and-plot-vector-layers.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/episodes/09-open-and-plot-vector-layers.Rmd b/episodes/09-open-and-plot-vector-layers.Rmd index 46fbdf25..f7d43057 100644 --- a/episodes/09-open-and-plot-vector-layers.Rmd +++ b/episodes/09-open-and-plot-vector-layers.Rmd @@ -31,7 +31,7 @@ installation issues. ::: prereq -If you have not installed the `sf` package yet, run `install.packages("sf")` first. Note that the `sf` package has some external dependencies, namely GEOS, PROJ.4, GDAL and UDUNITS, which need to be installed beforehand. Follow the workshop [setup instructions]() for the installation of `sf` and its dependencies. +If you have not installed the `sf` package yet, run `install.packages("sf")` first. Note that the `sf` package has some external dependencies, namely GEOS, PROJ.4, GDAL and UDUNITS, which need to be installed beforehand. Follow the workshop [setup instructions](../learners/setup.md) for the installation of `sf` and its dependencies. ::: From 87af22aa0c45f40e0aea85fb0df9995be0ad6ff1 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:01:20 +0100 Subject: [PATCH 04/21] Fix grammar in episodes/09-open-and-plot-vector-layers.Rmd --- episodes/09-open-and-plot-vector-layers.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/episodes/09-open-and-plot-vector-layers.Rmd b/episodes/09-open-and-plot-vector-layers.Rmd index f7d43057..ee2a9f48 100644 --- a/episodes/09-open-and-plot-vector-layers.Rmd +++ b/episodes/09-open-and-plot-vector-layers.Rmd @@ -52,7 +52,7 @@ library(sf) # work with spatial vector data ## Import shapefiles -Let's start by opening a shapefile. Shapefiles a common file format to store spatial vector data used in GIS software. We will read a shapefile with the administrative boundary of Delft with the function `st_read()` from the `sf` package. +Let's start by opening a shapefile. Shapefiles are a common file format to store spatial vector data used in GIS software. We will read a shapefile with the administrative boundary of Delft with the function `st_read()` from the `sf` package. ```{r results='hide'} boundary_Delft <- st_read("data/delft-boundary.shp") From 51c60054cd15361dc63e20939c6ec6c00d05997a Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:02:22 +0100 Subject: [PATCH 05/21] Make numbered list to improve readability Suggested by Manuel --- episodes/09-open-and-plot-vector-layers.Rmd | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/episodes/09-open-and-plot-vector-layers.Rmd b/episodes/09-open-and-plot-vector-layers.Rmd index ee2a9f48..0c385bd3 100644 --- a/episodes/09-open-and-plot-vector-layers.Rmd +++ b/episodes/09-open-and-plot-vector-layers.Rmd @@ -62,7 +62,10 @@ boundary_Delft <- st_read("data/delft-boundary.shp") # All `sf` functions start with `st_` -Note that all functions from the `sf` package start with the standard prefix `st_` which stands for Spatial Type. This is helpful in at least two ways: (1) it makes the interaction with or translation to/from software using the simple features standard like PostGIS easy, and (2) it allows for easy autocompletion of function names in RStudio. +Note that all functions from the `sf` package start with the standard prefix `st_` which stands for Spatial Type. This is helpful in at least two ways: + +1. it makes the interaction with or translation to/from software using the simple features standard like PostGIS easy, and +2. it allows for easy autocompletion of function names in RStudio. ::: From 9f4d2108e0a5b214e07d2a3f214618359e56d960 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:02:55 +0100 Subject: [PATCH 06/21] Add missing link in episodes/11-plot-multiple-shape-files.Rmd --- episodes/11-plot-multiple-shape-files.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/episodes/11-plot-multiple-shape-files.Rmd b/episodes/11-plot-multiple-shape-files.Rmd index 7707ae38..aa546f57 100644 --- a/episodes/11-plot-multiple-shape-files.Rmd +++ b/episodes/11-plot-multiple-shape-files.Rmd @@ -34,7 +34,7 @@ lines_Delft_selection <- lines_Delft %>% :::::::::::::::::::::::::::::::::::::::::::::::: -This episode builds upon the [previous episode]() to work with vector layers in R and explore how to plot multiple vector layers. +This episode builds upon the [previous episode](../episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd) to work with vector layers in R and explore how to plot multiple vector layers. From 6b6ff74b831a3899fe00188002d9881e0ba94896 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:03:13 +0100 Subject: [PATCH 07/21] Add missing link in episodes/11-plot-multiple-shape-files.Rmd --- episodes/11-plot-multiple-shape-files.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/episodes/11-plot-multiple-shape-files.Rmd b/episodes/11-plot-multiple-shape-files.Rmd index aa546f57..d52e4c57 100644 --- a/episodes/11-plot-multiple-shape-files.Rmd +++ b/episodes/11-plot-multiple-shape-files.Rmd @@ -42,7 +42,7 @@ This episode builds upon the [previous episode](../episodes/10-explore-and-plot- To work with vector data in R, we can use the `sf` library. The `terra` package also allows us to explore metadata using similar commands for both raster and vector files. Make sure that you have these packages loaded. -We will continue to work with the three ESRI shapefiles that we loaded in the [Open and Plot Vector Layers]() episode. +We will continue to work with the three ESRI shapefiles that we loaded in the [Open and Plot Vector Layers](../episodes/09-open-and-plot-vector-layers.Rmd) episode. From b32f72c09d48cecd54a6816997ed708aa99177a2 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci Date: Mon, 15 Jan 2024 22:39:12 +0100 Subject: [PATCH 08/21] Revise episode 9 --- episodes/09-open-and-plot-vector-layers.Rmd | 58 +++++++++++---------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/episodes/09-open-and-plot-vector-layers.Rmd b/episodes/09-open-and-plot-vector-layers.Rmd index 0c385bd3..86b0144f 100644 --- a/episodes/09-open-and-plot-vector-layers.Rmd +++ b/episodes/09-open-and-plot-vector-layers.Rmd @@ -6,13 +6,15 @@ exercises: 5 :::::::::::::::::::::::::::::::::::::: questions -- How can I read, examine and visualize point, line and polygon vector data in R? +- How can you read, examine and visualize point, line and polygon vector data in R? :::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::: objectives -- Know the difference between point, line, and polygon vector data. +After completing this episode, participants should be able to… + +- Differentiate between point, line, and polygon vector data. - Load vector data into R. - Access the attributes of a vector object in R. @@ -21,11 +23,11 @@ exercises: 5 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor Make sure that the `sf` package and its dependencies are installed before the -workshop. The installation can take quite some time, so allocate enough extra -time before the workshop for solving installation problems. We recommend one -or two installation 'walk-in' hours on a day before the workshop and 15-30 +workshop. The installation can be lengthy, so allocate enough extra time +before the workshop for solving installation problems. We recommend one +or two installation 'walk-in' hours on a day before the workshop. Also, 15-30 minutes at the beginning of the first workshop day should be enough to tackle -installation issues. +last-minute installation issues. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: @@ -38,7 +40,7 @@ If you have not installed the `sf` package yet, run `install.packages("sf")` fir First we need to load the packages we will use in this lesson. We will use the package `tidyverse` with which you are already familiar from the previous lesson. In addition, we need to load the [`sf`](https://r-spatial.github.io/sf/) package for working with spatial vector data. ```{r lib, message=FALSE} -library(tidyverse) # tools for wrangling, reshaping and visualizing data +library(tidyverse) # wrangle, reshape and visualize data library(sf) # work with spatial vector data ``` @@ -46,7 +48,7 @@ library(sf) # work with spatial vector data # The `sf` package -`sf` stands for Simple Features which is a standard defined by the Open Geospatial Consortium for storing and accessing geospatial vector data. PostGIS uses the same standard; so those of you who used PostGIS, might find some resemblances with the functions used by the `sf` package. +`sf` stands for Simple Features which is a standard defined by the Open Geospatial Consortium for storing and accessing geospatial vector data. PostGIS, for instance, uses the same standard, so PostGIS users might recognise the functions used by the `sf` package. ::: @@ -54,8 +56,8 @@ library(sf) # work with spatial vector data Let's start by opening a shapefile. Shapefiles are a common file format to store spatial vector data used in GIS software. We will read a shapefile with the administrative boundary of Delft with the function `st_read()` from the `sf` package. -```{r results='hide'} -boundary_Delft <- st_read("data/delft-boundary.shp") +```{r} +boundary_Delft <- st_read("data/delft-boundary.shp", quiet = TRUE) ``` ::: callout @@ -71,13 +73,15 @@ Note that all functions from the `sf` package start with the standard prefix `st ## Spatial Metadata -The `st_read()` function gave us a message with a summary of metadata about the file that was read in. To examine the metadata in more detail, we can use other, more specialised, functions from the `sf` package. The `st_geometry_type()` function, for instance, gives us information about the geometry type, which in this case is `POLYGON`. +By default (with `quiet = FALSE`), the `st_read()` function provides a message with a summary of metadata about the file that was read in. To examine the metadata in more detail, we can use other, more specialised, functions from the `sf` package. + +The `st_geometry_type()` function, for instance, gives us information about the geometry type, which in this case is `POLYGON`. ```{r} st_geometry_type(boundary_Delft) ``` -The `st_crs()` function returns the coordinate reference system (CRS) used by the shapefile, which in this case is `WGS84` and has the unique reference code `EPSG: 4326`. +The `st_crs()` function returns the coordinate reference system (CRS) used by the shapefile, which in this case is ``r st_crs(boundary_Delft)$Name`` and has the unique reference code ``r paste0("EPSG: ", st_crs(boundary_Delft)$epsg)``. ```{r} st_crs(boundary_Delft) @@ -91,7 +95,7 @@ As the output of `st_crs()` can be long, you can use `$Name` and `$epsg` after t ::: -The `st_bbox()` function shows the extent of the layer. As `WGS84` is a **geographic CRS**, the extent of the shapefile is displayed in degrees. +The `st_bbox()` function shows the extent of the layer. As `WGS 84` is a **geographic CRS**, the extent of the shapefile is displayed in degrees. ```{r} st_bbox(boundary_Delft) @@ -101,13 +105,15 @@ We need a **projected CRS**, which in the case of the Netherlands is typically t ```{r} boundary_Delft <- st_transform(boundary_Delft, 28992) -st_crs(boundary_Delft) +st_crs(boundary_Delft)$Name +st_crs(boundary_Delft)$epsg ``` Notice that the bounding box is measured in meters after the transformation. ```{r} st_bbox(boundary_Delft) +st_crs(boundary_Delft)$units_gdal ``` We confirm the transformation by examining the reprojected shapefile. @@ -118,7 +124,7 @@ boundary_Delft ::: callout -More about CRS in [Handling Spatial Projection & CRS](). +Read more about Coordinate Reference Systems [here](https://datacarpentry.org/organization-geospatial/03-crs.html). We will also practice transformation between CRS in [Handling Spatial Projection & CRS](../episodes/12-handling-spatial-projection-and-crs.Rmd). ::: @@ -126,22 +132,20 @@ More about CRS in [Handling Spatial Projection & CRS](). ## Plot a vector layer -Now, let's plot this shapefile. You are already familiar with the `ggplot2` package from [Introduction to Visualisation](). `ggplot2` has special `geom_` functions for spatial data. We will use the `geom_sf()` function for `sf` data. +Now, let's plot this shapefile. You are already familiar with the `ggplot2` package from [Introduction to Visualisation](../episodes/04-intro-to-visualisation.Rmd). `ggplot2` has special `geom_` functions for spatial data. We will use the `geom_sf()` function for `sf` data. ```{r} - ggplot(data = boundary_Delft) + geom_sf(size = 3, color = "black", fill = "cyan1") + labs(title = "Delft Administrative Boundary") + coord_sf(datum = st_crs(28992)) # this is needed to display the axes in meters - ``` ::::::::::::::::::::::::::::::::::::: challenge ### Challenge 1: Import line and point vector layers -Read in `delft-streets.shp` and `delft-leisure.shp` and assign them to `lines_Delft` and `point_Delft` respectively. Answer the following questions: +Read in `delft-streets.shp` and `delft-leisure.shp` and assign them to `lines_Delft` and `points_Delft` respectively. Answer the following questions: 1. What type of R spatial object is created when you import each layer? 2. What is the CRS and extent for each object? @@ -152,28 +156,28 @@ Read in `delft-streets.shp` and `delft-leisure.shp` and assign them to `lines_De ```{r results='hide'} lines_Delft <- st_read("data/delft-streets.shp") -point_Delft <- st_read("data/delft-leisure.shp") +points_Delft <- st_read("data/delft-leisure.shp") ``` -We can check the type of data with the `class()` function from base R. Both `lines_Delft` and `point_Delft` are objects of class `"sf"`, which extends the `"data.frame"` class. +We can check the type of data with the `class()` function from base R. Both `lines_Delft` and `points_Delft` are objects of class `"sf"`, which extends the `"data.frame"` class. ```{r} class(lines_Delft) -class(point_Delft) +class(points_Delft) ``` -`lines_Delft` and `point_Delft` are in the correct CRS. +`lines_Delft` and `points_Delft` are in the correct CRS. ```{r} st_crs(lines_Delft)$epsg -st_crs(point_Delft)$epsg +st_crs(points_Delft)$epsg ``` -When looking at the bounding boxes with the `st_bbox()` function, we see the spatial extent of the two objects in a projected CRS using meters as units. `lines_Delft()` and `point_Delft` have similar extents. +When looking at the bounding boxes with the `st_bbox()` function, we see the spatial extent of the two objects in a projected CRS using meters as units. `lines_Delft()` and `points_Delft` have similar extents. ```{r} st_bbox(lines_Delft) -st_bbox(point_Delft) +st_bbox(points_Delft) ``` ::::::::::::::::::::::::::::::::: @@ -186,6 +190,6 @@ st_bbox(point_Delft) - Metadata for vector layers include geometry type, CRS, and extent. - Load spatial objects into R with the `st_read()` function. -- Spatial objects can be plotted directly with `ggplot` using the `geom_sf()` function. No need to convert to a data frame. +- Spatial objects can be plotted directly with `ggplot2` using the `geom_sf()` function. No need to convert to a data frame. :::::::::::::::::::::::::::::::::::::::::::::::: From 825152a5eecb39dfdc5f6526aaf2c7cdc3e7db8e Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:01:07 +0100 Subject: [PATCH 09/21] Update wording of objectives in episodes/11-plot-multiple-shape-files.Rmd --- episodes/11-plot-multiple-shape-files.Rmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/episodes/11-plot-multiple-shape-files.Rmd b/episodes/11-plot-multiple-shape-files.Rmd index d52e4c57..f8e6f970 100644 --- a/episodes/11-plot-multiple-shape-files.Rmd +++ b/episodes/11-plot-multiple-shape-files.Rmd @@ -29,6 +29,8 @@ lines_Delft_selection <- lines_Delft %>% ::::::::::::::::::::::::::::::::::::: objectives +After completing this episode, participants should be able to… + - Plot multiple vector layers in the same plot. - Apply custom symbols to spatial objects in a plot. From 3ebbaa67b3ce1b1763d0b9f3555ce472a60da553 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:02:41 +0100 Subject: [PATCH 10/21] Add link to epsg.io Co-authored-by: javisanmillan <119609383+javisanmillan@users.noreply.github.com> --- episodes/09-open-and-plot-vector-layers.Rmd | 1 + 1 file changed, 1 insertion(+) diff --git a/episodes/09-open-and-plot-vector-layers.Rmd b/episodes/09-open-and-plot-vector-layers.Rmd index 86b0144f..52d77577 100644 --- a/episodes/09-open-and-plot-vector-layers.Rmd +++ b/episodes/09-open-and-plot-vector-layers.Rmd @@ -102,6 +102,7 @@ st_bbox(boundary_Delft) ``` We need a **projected CRS**, which in the case of the Netherlands is typically the Amersfort / RD New projection. To reproject our shapefile, we will use the `st_transform()` function. For the `crs` argument we can use the EPSG code of the CRS we want to use, which is `28992` for the `Amersfort / RD New` projection. +To check the EPSG code of any CRS, we can check this website: https://epsg.io/ ```{r} boundary_Delft <- st_transform(boundary_Delft, 28992) From 98fc642776f7cc52dd6e71947998dc085cf8953d Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:04:50 +0100 Subject: [PATCH 11/21] Update wording of objectives in episodes/12-handling-spatial-projection-and-crs.Rmd --- episodes/12-handling-spatial-projection-and-crs.Rmd | 3 +++ 1 file changed, 3 insertions(+) diff --git a/episodes/12-handling-spatial-projection-and-crs.Rmd b/episodes/12-handling-spatial-projection-and-crs.Rmd index 0ab1331c..cb199f2e 100644 --- a/episodes/12-handling-spatial-projection-and-crs.Rmd +++ b/episodes/12-handling-spatial-projection-and-crs.Rmd @@ -22,6 +22,9 @@ leisure_locations_selection <- st_read("data/delft-leisure.shp") %>% ::::::::::::::::::::::::::::::::::::: objectives + +After completing this episode, participants should be able to… + - Plot vector objects with different CRSs in the same plot. :::::::::::::::::::::::::::::::::::::::::::::::: From ab4b998704df93040fab290d7f96d877fb256d0c Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:09:14 +0100 Subject: [PATCH 12/21] Explain `driver` argument in `st_write()` --- episodes/12-handling-spatial-projection-and-crs.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/episodes/12-handling-spatial-projection-and-crs.Rmd b/episodes/12-handling-spatial-projection-and-crs.Rmd index cb199f2e..98dbaead 100644 --- a/episodes/12-handling-spatial-projection-and-crs.Rmd +++ b/episodes/12-handling-spatial-projection-and-crs.Rmd @@ -121,7 +121,7 @@ ggplot() + ## Export a shapefile -To save a file, use the `st_write()` function from the `sf` package. +To save a file, use the `st_write()` function from the `sf` package. Although `sf` guesses the driver needed for a specified output file name from its extension, this can be made explicitly via the `driver` argument. In our case `driver = "ESRI Shapefile"` ensures that the the output is correctly saved as a `.shp` file. ```{r, eval=FALSE} st_write(leisure_locations_selection, From b0a222db2ee962368bd883484a6bb7c1e1c5e6ca Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:45:35 +0100 Subject: [PATCH 13/21] Apply Ana's suggestions from code review Co-authored-by: ana-5r --- .../10-explore-and-plot-by-vector-layer-attributes.Rmd | 8 +++++--- episodes/12-handling-spatial-projection-and-crs.Rmd | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd b/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd index 2d4310e2..a9b2a96a 100644 --- a/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd +++ b/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd @@ -23,6 +23,8 @@ point_Delft <- st_read("data/delft-leisure.shp") ::::::::::::::::::::::::::::::::::::: objectives +After completing this episode, participants should be able to… + - Query attributes of a vector object. - Subset vector objects using specific attribute values. @@ -227,7 +229,7 @@ motorway_Delft_length <- motorway_Delft %>% nrow(motorway_Delft) ``` -4. Plot the motorways +4. Plot the motorways. ```{r} ggplot(data = motorway_Delft) + @@ -236,7 +238,7 @@ ggplot(data = motorway_Delft) + coord_sf(datum = st_crs(28992)) ``` -5. Same steps with pedestrian streets +5. Follow the same steps with pedestrian streets. ```{r} pedestrian_Delft <- lines_Delft %>% @@ -439,7 +441,7 @@ Create a map of the municipal boundaries in the Netherlands using the data locat ::: solution ```{r} -municipal_boundaries_NL <- st_read(here("data", "nl-gemeenten.shp")) +municipal_boundaries_NL <- st_read(here("episodes", "data", "nl-gemeenten.shp")) ``` ```{r} diff --git a/episodes/12-handling-spatial-projection-and-crs.Rmd b/episodes/12-handling-spatial-projection-and-crs.Rmd index 98dbaead..794c34e4 100644 --- a/episodes/12-handling-spatial-projection-and-crs.Rmd +++ b/episodes/12-handling-spatial-projection-and-crs.Rmd @@ -125,7 +125,7 @@ To save a file, use the `st_write()` function from the `sf` package. Although `s ```{r, eval=FALSE} st_write(leisure_locations_selection, - "data/leisure_locations_selection.shp"), driver = "ESRI Shapefile") + "data/leisure_locations_selection.shp", driver = "ESRI Shapefile") ``` From 7db3b32136f7078a1e4332ab28098d955a1764e9 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:48:55 +0100 Subject: [PATCH 14/21] Update phrasing of opbjectives in episodes/11-plot-multiple-shape-files.Rmd --- episodes/11-plot-multiple-shape-files.Rmd | 3 +++ 1 file changed, 3 insertions(+) diff --git a/episodes/11-plot-multiple-shape-files.Rmd b/episodes/11-plot-multiple-shape-files.Rmd index f8e6f970..36704c25 100644 --- a/episodes/11-plot-multiple-shape-files.Rmd +++ b/episodes/11-plot-multiple-shape-files.Rmd @@ -29,6 +29,9 @@ lines_Delft_selection <- lines_Delft %>% ::::::::::::::::::::::::::::::::::::: objectives +After completing this episode, participants should be able to… + + After completing this episode, participants should be able to… - Plot multiple vector layers in the same plot. From 07f818f0460b6f3f13fb18d8fb1bdc506caedbb5 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:57:05 +0100 Subject: [PATCH 15/21] Change question to first-person singular in episodes/09-open-and-plot-vector-layers.Rmd Co-authored-by: ana-5r --- episodes/09-open-and-plot-vector-layers.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/episodes/09-open-and-plot-vector-layers.Rmd b/episodes/09-open-and-plot-vector-layers.Rmd index 52d77577..40a5c15d 100644 --- a/episodes/09-open-and-plot-vector-layers.Rmd +++ b/episodes/09-open-and-plot-vector-layers.Rmd @@ -6,7 +6,7 @@ exercises: 5 :::::::::::::::::::::::::::::::::::::: questions -- How can you read, examine and visualize point, line and polygon vector data in R? +- How can I read, examine and visualize point, line and polygon vector data in R? :::::::::::::::::::::::::::::::::::::::::::::::: From 5226f7eccd42c78e62852e8bf381265cfd6be25b Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci <33600128+cforgaci@users.noreply.github.com> Date: Mon, 22 Jan 2024 22:00:47 +0100 Subject: [PATCH 16/21] Add explanation about shapefiles as suggested by Ana --- episodes/09-open-and-plot-vector-layers.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/episodes/09-open-and-plot-vector-layers.Rmd b/episodes/09-open-and-plot-vector-layers.Rmd index 40a5c15d..09912581 100644 --- a/episodes/09-open-and-plot-vector-layers.Rmd +++ b/episodes/09-open-and-plot-vector-layers.Rmd @@ -54,7 +54,7 @@ library(sf) # work with spatial vector data ## Import shapefiles -Let's start by opening a shapefile. Shapefiles are a common file format to store spatial vector data used in GIS software. We will read a shapefile with the administrative boundary of Delft with the function `st_read()` from the `sf` package. +Let's start by opening a shapefile. Shapefiles are a common file format to store spatial vector data used in GIS software. Note that a shapefile consists of multiple files and it is important to keep them all together in the same location. We will read a shapefile with the administrative boundary of Delft with the function `st_read()` from the `sf` package. ```{r} boundary_Delft <- st_read("data/delft-boundary.shp", quiet = TRUE) From e7e240c82fda3512d19f3e74c01c1b2fe2779b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ana=20Petrovi=C4=87?= Date: Tue, 23 Jan 2024 09:53:57 +0100 Subject: [PATCH 17/21] Initialise episode on geospatial concepts --- .../introduction-to-geospatial-concepts.Rmd | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 episodes/introduction-to-geospatial-concepts.Rmd diff --git a/episodes/introduction-to-geospatial-concepts.Rmd b/episodes/introduction-to-geospatial-concepts.Rmd new file mode 100644 index 00000000..686be097 --- /dev/null +++ b/episodes/introduction-to-geospatial-concepts.Rmd @@ -0,0 +1,111 @@ +--- +title: 'Introduction to Geospatial Concepts' +teaching: 10 +exercises: 2 +--- + +:::::::::::::::::::::::::::::::::::::: questions + +- How do you write a lesson using R Markdown and `{sandpaper}`? + +:::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: objectives + +- Explain how to use markdown with the new lesson template +- Demonstrate how to include pieces of code, figures, and nested challenge blocks + +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Introduction + +This is a lesson created via The Carpentries Workbench. It is written in +[Pandoc-flavored Markdown][pandoc] for static files (with extension `.md`) and +[R Markdown][r-markdown] for dynamic files that can render code into output +(with extension `.Rmd`). Please refer to the [Introduction to The Carpentries +Workbench][carpentries-workbench] for full documentation. + +What you need to know is that there are three sections required for a valid +Carpentries lesson template: + + 1. `questions` are displayed at the beginning of the episode to prime the + learner for the content. + 2. `objectives` are the learning objectives for an episode displayed with + the questions. + 3. `keypoints` are displayed at the end of the episode to reinforce the + objectives. + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor + +Inline instructor notes can help inform instructors of timing challenges +associated with the lessons. They appear in the "Instructor View" + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::: challenge + +## Challenge 1: Can you do it? + +What is the output of this command? + +```r +paste("This", "new", "lesson", "looks", "good") +``` + +:::::::::::::::::::::::: solution + +## Output + +```output +[1] "This new lesson looks good" +``` + +::::::::::::::::::::::::::::::::: + + +## Challenge 2: how do you nest solutions within challenge blocks? + +:::::::::::::::::::::::: solution + +You can add a line with at least three colons and a `solution` tag. + +::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::: + +## Figures + +You can include figures generated from R Markdown: + +```{r pyramid, fig.alt = "pie chart illusion of a pyramid", fig.cap = "Sun arise each and every morning"} +pie( + c(Sky = 78, "Sunny side of pyramid" = 17, "Shady side of pyramid" = 5), + init.angle = 315, + col = c("deepskyblue", "yellow", "yellow3"), + border = FALSE +) +``` +Or you can use pandoc markdown for static figures with the following syntax: + +`![optional caption that appears below the figure](figure url){alt='alt text for +accessibility purposes'}` + +![You belong in The Carpentries!](https://raw.githubusercontent.com/carpentries/logo/master/Badge_Carpentries.svg){alt='Blue Carpentries hex person logo with no text.'} + +## Math + +One of our episodes contains $\LaTeX$ equations when describing how to create +dynamic reports with {knitr}, so we now use mathjax to describe this: + +`$\alpha = \dfrac{1}{(1 - \beta)^2}$` becomes: $\alpha = \dfrac{1}{(1 - \beta)^2}$ + +Cool, right? + +::::::::::::::::::::::::::::::::::::: keypoints + +- Use `.md` files for episodes when you want static content +- Use `.Rmd` files for episodes when you need to generate output +- Run `sandpaper::check_lesson()` to identify any issues with your lesson +- Run `sandpaper::build_lesson()` to preview your lesson locally + +:::::::::::::::::::::::::::::::::::::::::::::::: + From 46e131e8ddb0a3600c00310d33eedaf1fa945813 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci Date: Wed, 24 Jan 2024 16:34:26 +0100 Subject: [PATCH 18/21] Update vector episodes --- episodes/09-open-and-plot-vector-layers.Rmd | 16 +++--- ...re-and-plot-by-vector-layer-attributes.Rmd | 57 +++++++------------ episodes/11-plot-multiple-shape-files.Rmd | 29 +++++----- ...12-handling-spatial-projection-and-crs.Rmd | 17 +++--- 4 files changed, 52 insertions(+), 67 deletions(-) diff --git a/episodes/09-open-and-plot-vector-layers.Rmd b/episodes/09-open-and-plot-vector-layers.Rmd index 09912581..3db01b77 100644 --- a/episodes/09-open-and-plot-vector-layers.Rmd +++ b/episodes/09-open-and-plot-vector-layers.Rmd @@ -33,11 +33,11 @@ last-minute installation issues. ::: prereq -If you have not installed the `sf` package yet, run `install.packages("sf")` first. Note that the `sf` package has some external dependencies, namely GEOS, PROJ.4, GDAL and UDUNITS, which need to be installed beforehand. Follow the workshop [setup instructions](../learners/setup.md) for the installation of `sf` and its dependencies. +In this lesson you will work with the `sf` package. Note that the `sf` package has some external dependencies, namely GEOS, PROJ.4, GDAL and UDUNITS, which need to be installed beforehand. Before starting the lesson, follow the workshop [setup instructions](../learners/setup.md) for the installation of `sf` and its dependencies. ::: -First we need to load the packages we will use in this lesson. We will use the package `tidyverse` with which you are already familiar from the previous lesson. In addition, we need to load the [`sf`](https://r-spatial.github.io/sf/) package for working with spatial vector data. +First we need to load the packages we will use in this lesson. We will use the `tidyverse` package with which you are already familiar from the previous lesson. In addition, we need to load the [`sf`](https://r-spatial.github.io/sf/) package for working with spatial vector data. ```{r lib, message=FALSE} library(tidyverse) # wrangle, reshape and visualize data @@ -66,8 +66,8 @@ boundary_Delft <- st_read("data/delft-boundary.shp", quiet = TRUE) Note that all functions from the `sf` package start with the standard prefix `st_` which stands for Spatial Type. This is helpful in at least two ways: -1. it makes the interaction with or translation to/from software using the simple features standard like PostGIS easy, and -2. it allows for easy autocompletion of function names in RStudio. +1. it allows for easy autocompletion of function names in RStudio, and +2. it makes the interaction with or translation to/from software using the simple features standard like PostGIS easy. ::: @@ -144,7 +144,7 @@ ggplot(data = boundary_Delft) + ::::::::::::::::::::::::::::::::::::: challenge -### Challenge 1: Import line and point vector layers +### Challenge: Import line and point vector layers Read in `delft-streets.shp` and `delft-leisure.shp` and assign them to `lines_Delft` and `points_Delft` respectively. Answer the following questions: @@ -160,11 +160,11 @@ lines_Delft <- st_read("data/delft-streets.shp") points_Delft <- st_read("data/delft-leisure.shp") ``` -We can check the type of data with the `class()` function from base R. Both `lines_Delft` and `points_Delft` are objects of class `"sf"`, which extends the `"data.frame"` class. +We can check the type of type of geometry with the `st_geometry_type()` function. `lines_Delft` contains `"LINESTRING"` geometry and `points_Delft` is made of `"POINT"` geometries. ```{r} -class(lines_Delft) -class(points_Delft) +st_geometry_type(lines_Delft)[1] +st_geometry_type(points_Delft)[2] ``` `lines_Delft` and `points_Delft` are in the correct CRS. diff --git a/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd b/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd index a9b2a96a..ca18aa96 100644 --- a/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd +++ b/episodes/10-explore-and-plot-by-vector-layer-attributes.Rmd @@ -1,7 +1,7 @@ --- title: 'Explore and plot by vector layer attributes' -teaching: 20 -exercises: 10 +teaching: 30 +exercises: 20 --- ```{r setup, include=FALSE} @@ -62,10 +62,10 @@ attribute table. ::: -We can also preview the content of the object by looking at the first 6 rows with the `head()` function, which is in the case of an `sf` object the same as examining the object directly. +We can also preview the content of the object by looking at the first 6 rows with the `head()` function, which in the case of an `sf` object is similar to examining the object directly. ```{r} -head(lines_Delft) +head (lines_Delft) ``` @@ -92,6 +92,7 @@ R is also able to handle categorical variables called factors. With factors, we ```{r} levels(factor(lines_Delft$highway)) ``` +Note that this way the values are shown by default in alphabetical order and `NA`s are not displayed, whereas using `unique()` returns unique values in the order of their occurrence in the data frame and it also shows `NA` values. :::::::::::::::::::::::::::::::: @@ -131,16 +132,16 @@ head(point_Delft, 10) # you might be lucky to see three distinct values # point_Delft ``` -However, this is not a good approach as the first rows might still have many `NA`s and three distinct values might still not be present in the first `n` rows of the data frame. To remove `NA`s, we can use the function `na.omit()` on the leisure column to remove `NA`s completely. Note that we use the `$` operator to examine the content of a single variable. +We have our answer (`sports_centre` is the third value), but in general this is not a good approach as the first rows might still have many `NA`s and three distinct values might still not be present in the first `n` rows of the data frame. To remove `NA`s, we can use the function `na.omit()` on the leisure column to remove `NA`s completely. Note that we use the `$` operator to examine the content of a single variable. ```{r} head(na.omit(point_Delft$leisure)) # this is better ``` -To show only unique values, we can use the `unique()` function to only see the first occurrence of each distinct value (note that `NA` will still be included once). +To show only unique values, we can use the `levels()` function on a factor to only see the first occurrence of each distinct value. Note `NA`s are dropped in this case and that we get the first three of the unique alphabetically ordered values. ```{r} -head(unique(point_Delft$leisure), n = 3) # this is even better +head(levels(factor(point_Delft$leisure)), n = 3) # this is even better ``` 3. To see a list of all attribute names, we can use the `names()` function. @@ -192,6 +193,8 @@ ggplot(data = cycleway_Delft) + ::: challenge +Challenge: Now with motorways (and pedestrian streets) + 1. Create a new object that only contains the motorways in Delft. 2. How many features does the new object have? 3. What is the total length of motorways? @@ -271,7 +274,7 @@ Let's say that we want to color different road types with different colors and t unique(lines_Delft$highway) ``` -If we look at all the unique values of the highway field of our street network we see more than 20 values. Let's focus on a subset of four values to illustrate the use of distinct colors. We use a piped expression in which we only filter the rows of our data frame that have one of the four given values `"motorway"`, `"primary"`, `"secondary"`, and `"cycleway"`. We also make sure that the highway column is a factor column. +If we look at all the unique values of the highway field of our street network we see more than 20 values. Let's focus on a subset of four values to illustrate the use of distinct colors. We use a piped expression in which we only filter the rows of our data frame that have one of the four given values `"motorway"`, `"primary"`, `"secondary"`, and `"cycleway"`. Note that we do this with the `%in` operator which is a more compact equivalent of a series of conditions joined by the `|` (or) operator. We also make sure that the highway column is a factor column. ```{r} road_types <- c("motorway", "primary", "secondary", "cycleway") @@ -281,7 +284,7 @@ lines_Delft_selection <- lines_Delft %>% mutate(highway = factor(highway, levels = road_types)) ``` -Next we define the four colors we want to use, one for each type of road in our vector object. Note that in R you can use named colors like `"blue"`, `"green"`, `"navy"`, and `"purple"`. A full list of named colors can be listed with the `colors()` function. +Next we define the four colors we want to use, one for each type of road in our vector object. Note that in R you can use named colors like `"blue"`, `"green"`, `"navy"`, and `"purple"`. If you are using RStudio, you will see the named colors previewed in line. A full list of named colors can be listed with the `colors()` function. ```{r} road_colors <- c("blue", "green", "navy", "purple") @@ -321,7 +324,7 @@ ggplot(data = lines_Delft_selection) + ::: challenge -# Plot line width by attribute +# Challenge: Plot line width by attribute In the example above, we set the line widths to be 1, 0.75, 0.5, and 0.25. In our case line thicknesses are consistent with the hierarchy of the selected road types, but in some cases we might want to show a different hierarchy. @@ -361,44 +364,26 @@ ggplot(data = lines_Delft_selection) + Let’s add a legend to our plot. We will use the `road_colors` object that we created above to color the legend. We can customize the appearance of our legend by manually setting different parameters. ```{r fig.cap="Mobility network in Delft using thicker lines than the previous example."} -ggplot(data = lines_Delft_selection) + +p1 <- ggplot(data = lines_Delft_selection) + geom_sf(aes(color = highway), linewidth = 1.5) + scale_color_manual(values = road_colors) + labs(color = 'Road Type') + labs(title = "Mobility network of Delft", subtitle = "Roads & Cycleways - Default Legend") + coord_sf(datum = st_crs(28992)) +p1 ``` ```{r fig.cap="Map of the mobility network in Delft with large-font and border around the legend."} -ggplot(data = lines_Delft_selection) + - geom_sf(aes(color = highway), linewidth = 1.5) + - scale_color_manual(values = road_colors) + - labs(color = 'Road Type') + - theme(legend.text = element_text(size = 20), - legend.box.background = element_rect(size = 1)) + - labs(title = "Mobility network of Delft", - subtitle = "Roads & Cycleways - Modified Legend") + - coord_sf(datum = st_crs(28992)) -``` - -```{r fig.cap="Map of the mobility network in Delft using a different color palette."} -new_colors <- c("springgreen", "blue", "magenta", "orange") - -ggplot(data = lines_Delft_selection) + - geom_sf(aes(color = highway), linewidth = 1.5) + - scale_color_manual(values = new_colors) + - labs(color = 'Road Type') + +p2 <- p1 + theme(legend.text = element_text(size = 20), - legend.box.background = element_rect(size = 1)) + - labs(title = "Mobility network of Delft", - subtitle = "Roads & Cycleways - Modified Legend") + - coord_sf(datum = st_crs(28992)) + legend.box.background = element_rect(size = 1)) +p2 ``` ::: challenge -# Plot lines by attributes +# Challenge: Plot lines by attributes Create a plot that emphasizes only roads where bicycles are allowed. To emphasize this, make the lines where bicycles are not allowed THINNER than the roads where bicycles are allowed. Be sure to add a title and legend to your map. You might consider a color palette that has all bike-friendly roads displayed in a bright color. All other lines can be black. @@ -433,7 +418,7 @@ ggplot(data = lines_Delft) + ::: challenge -# Plot polygon by attribute +# Challenge: Plot polygon by attribute Create a map of the municipal boundaries in the Netherlands using the data located in your data folder: `nl-gemeenten.shp`. Apply a line color to each state using its region value. Add a legend. @@ -441,7 +426,7 @@ Create a map of the municipal boundaries in the Netherlands using the data locat ::: solution ```{r} -municipal_boundaries_NL <- st_read(here("episodes", "data", "nl-gemeenten.shp")) +municipal_boundaries_NL <- st_read("data/nl-gemeenten.shp") ``` ```{r} diff --git a/episodes/11-plot-multiple-shape-files.Rmd b/episodes/11-plot-multiple-shape-files.Rmd index 36704c25..60eeba5d 100644 --- a/episodes/11-plot-multiple-shape-files.Rmd +++ b/episodes/11-plot-multiple-shape-files.Rmd @@ -1,7 +1,7 @@ --- title: 'Plot multiple shapefiles' -teaching: 40 -exercises: 20 +teaching: 30 +exercises: 5 --- ```{r setup, include=FALSE} @@ -29,9 +29,6 @@ lines_Delft_selection <- lines_Delft %>% ::::::::::::::::::::::::::::::::::::: objectives -After completing this episode, participants should be able to… - - After completing this episode, participants should be able to… - Plot multiple vector layers in the same plot. @@ -45,7 +42,7 @@ This episode builds upon the [previous episode](../episodes/10-explore-and-plot- ## Load the data -To work with vector data in R, we can use the `sf` library. The `terra` package also allows us to explore metadata using similar commands for both raster and vector files. Make sure that you have these packages loaded. +To work with vector data in R, we use the `sf` library. Make sure that it is loaded. We will continue to work with the three ESRI shapefiles that we loaded in the [Open and Plot Vector Layers](../episodes/09-open-and-plot-vector-layers.Rmd) episode. @@ -68,7 +65,7 @@ ggplot() + coord_sf(datum = st_crs(28992)) ``` -Next, let’s build a custom legend using the symbology (the colors and symbols) that we used to create the plot above. For example, it might be good if the lines were symbolized as lines. In the previous episode, you may have noticed that the default legend behavior for `geom_sf` is to draw a ‘patch’ for each legend entry. If you want the legend to draw lines or points, you need to add an instruction to the `geom_sf` call - in this case, `show.legend = 'line'`. +Next, let’s build a custom legend using the functions `scale_color_manual()` and `scale_fill_manual()`. ```{r} leisure_colors <- rainbow(15) @@ -96,12 +93,17 @@ ggplot() + We notice that there are quite some playgrounds in the residential parts of Delft, whereas on campus there is a concentration of picnic tables. So that is what our next challenge is about. -### Challenge 7 (5 minutes) + +::::::::::::::::::::::::::::::::::::: challenge + +## Challenge: Visualising multiple layers with a custom legend Create a map of leisure locations only including `playground` and `picnic_table`, with each point colored by the leisure type. Overlay this layer on top of the `lines_Delft` layer (the streets). Create a custom legend that applies line symbols to lines and point symbols to the points. Modify the plot above. Tell R to plot each point, using a different symbol of shape value. +:::::::::::::::::::::::: solution + ```{r} leisure_locations_selection <- st_read("data/delft-leisure.shp") %>% filter(leisure %in% c("playground", "picnic_table")) @@ -119,7 +121,7 @@ blue_orange <- c("cornflowerblue", "darkorange") ggplot() + geom_sf(data = lines_Delft_selection, aes(color = highway)) + geom_sf(data = leisure_locations_selection, aes(fill = leisure), - shape = 21, show.legend = 'point') + + shape = 21) + scale_color_manual(name = "Line Type", values = road_colors, guide = guide_legend(override.aes = list(linetype = "solid", shape = NA))) + scale_fill_manual(name = "Soil Type", values = blue_orange, @@ -141,19 +143,16 @@ ggplot() + coord_sf(datum = st_crs(28992)) ``` - - - - +::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::: keypoints - Use the `+` operator to add multiple layers to a ggplot. - A plot can be a combination of multiple vector layers. -- Use the `show.legend` argument to set legend symbol types. -- Use the `scale_fill_manual()` function to set legend colors. +- Use the `scale_color_manual()` and `scale_fill_manual()` functions to set legend colors. :::::::::::::::::::::::::::::::::::::::::::::::: diff --git a/episodes/12-handling-spatial-projection-and-crs.Rmd b/episodes/12-handling-spatial-projection-and-crs.Rmd index 794c34e4..24811951 100644 --- a/episodes/12-handling-spatial-projection-and-crs.Rmd +++ b/episodes/12-handling-spatial-projection-and-crs.Rmd @@ -1,7 +1,7 @@ --- title: 'Handling Spatial Projections & CRS' -teaching: 40 -exercises: 20 +teaching: 25 +exercises: 5 --- ```{r setup, include=FALSE} @@ -85,15 +85,16 @@ ggplot() + ::: challenge -# Plot multiple layers of spatial data +# Challenge: Plot multiple layers of spatial data Create a map of South Holland as follows: -1. Import and plot `nl-gemeenten.shp`. Adjust line width as necessary. -2. Layer the boundary of Delft onto the plot. -3. Add a title. -4. Add a legend that shows both the province boundaries (as a line) and the boundary of Delft (as a filled polygon). +1. Import `nl-gemeenten.shp` and filter only the municipalities in South Holland. +2. Plot it and adjust line width as necessary. +3. Layer the boundary of Delft onto the plot. +4. Add a title. +5. Add a legend that shows both the province boundaries (as a line) and the boundary of Delft (as a filled polygon). ::: solution @@ -121,7 +122,7 @@ ggplot() + ## Export a shapefile -To save a file, use the `st_write()` function from the `sf` package. Although `sf` guesses the driver needed for a specified output file name from its extension, this can be made explicitly via the `driver` argument. In our case `driver = "ESRI Shapefile"` ensures that the the output is correctly saved as a `.shp` file. +To save a file, use the `st_write()` function from the `sf` package. Although `sf` guesses the driver needed for a specified output file name from its extension, this can be made explicitly via the `driver` argument. In our case `driver = "ESRI Shapefile"` ensures that the output is correctly saved as a `.shp` file. ```{r, eval=FALSE} st_write(leisure_locations_selection, From ce9d8836a12e5d6f515c4d2ee1c5f1c451a4a953 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci Date: Mon, 29 Jan 2024 09:31:48 +0100 Subject: [PATCH 19/21] Add vector slides --- instructors/2-vector-slides.html | 918 +++++++ instructors/2-vector-slides.qmd | 375 +++ .../libs/clipboard/clipboard.min.js | 7 + .../libs/countdown-0.4.0/countdown.css | 144 ++ .../libs/countdown-0.4.0/countdown.js | 478 ++++ .../libs/countdown-0.4.0/smb_stage_clear.mp3 | Bin 0 -> 38758 bytes .../libs/quarto-html/popper.min.js | 6 + .../libs/quarto-html/quarto-html.min.css | 1 + .../quarto-syntax-highlighting.css | 171 ++ .../libs/quarto-html/tabby.min.js | 418 +++ .../libs/quarto-html/tippy.css | 1 + .../libs/quarto-html/tippy.umd.min.js | 2 + .../libs/revealjs/dist/reset.css | 30 + .../libs/revealjs/dist/reveal.css | 8 + .../libs/revealjs/dist/reveal.esm.js | 9 + .../libs/revealjs/dist/reveal.esm.js.map | 1 + .../libs/revealjs/dist/reveal.js | 9 + .../libs/revealjs/dist/reveal.js.map | 1 + .../dist/theme/fonts/league-gothic/LICENSE | 2 + .../fonts/league-gothic/league-gothic.css | 10 + .../fonts/league-gothic/league-gothic.eot | Bin 0 -> 25696 bytes .../fonts/league-gothic/league-gothic.ttf | Bin 0 -> 64256 bytes .../fonts/league-gothic/league-gothic.woff | Bin 0 -> 30764 bytes .../dist/theme/fonts/source-sans-pro/LICENSE | 45 + .../source-sans-pro-italic.eot | Bin 0 -> 75720 bytes .../source-sans-pro-italic.ttf | Bin 0 -> 238084 bytes .../source-sans-pro-italic.woff | Bin 0 -> 98556 bytes .../source-sans-pro-regular.eot | Bin 0 -> 88070 bytes .../source-sans-pro-regular.ttf | Bin 0 -> 288008 bytes .../source-sans-pro-regular.woff | Bin 0 -> 114324 bytes .../source-sans-pro-semibold.eot | Bin 0 -> 89897 bytes .../source-sans-pro-semibold.ttf | Bin 0 -> 284640 bytes .../source-sans-pro-semibold.woff | Bin 0 -> 115648 bytes .../source-sans-pro-semibolditalic.eot | Bin 0 -> 75706 bytes .../source-sans-pro-semibolditalic.ttf | Bin 0 -> 240944 bytes .../source-sans-pro-semibolditalic.woff | Bin 0 -> 98816 bytes .../fonts/source-sans-pro/source-sans-pro.css | 39 + .../libs/revealjs/dist/theme/quarto.css | 5 + .../plugin/highlight/highlight.esm.js | 5 + .../revealjs/plugin/highlight/highlight.js | 5 + .../revealjs/plugin/highlight/monokai.css | 71 + .../libs/revealjs/plugin/highlight/plugin.js | 439 ++++ .../revealjs/plugin/highlight/zenburn.css | 80 + .../revealjs/plugin/markdown/markdown.esm.js | 1 + .../libs/revealjs/plugin/markdown/markdown.js | 1 + .../libs/revealjs/plugin/markdown/plugin.js | 475 ++++ .../libs/revealjs/plugin/math/katex.js | 96 + .../libs/revealjs/plugin/math/math.esm.js | 1 + .../libs/revealjs/plugin/math/math.js | 1 + .../libs/revealjs/plugin/math/mathjax2.js | 89 + .../libs/revealjs/plugin/math/mathjax3.js | 77 + .../libs/revealjs/plugin/math/plugin.js | 15 + .../libs/revealjs/plugin/notes/notes.esm.js | 1 + .../libs/revealjs/plugin/notes/notes.js | 1 + .../libs/revealjs/plugin/notes/plugin.js | 236 ++ .../revealjs/plugin/notes/speaker-view.html | 884 +++++++ .../revealjs/plugin/pdf-export/pdfexport.js | 108 + .../revealjs/plugin/pdf-export/plugin.yml | 2 + .../quarto-line-highlight/line-highlight.css | 31 + .../quarto-line-highlight/line-highlight.js | 351 +++ .../plugin/quarto-line-highlight/plugin.yml | 4 + .../revealjs/plugin/quarto-support/footer.css | 109 + .../revealjs/plugin/quarto-support/plugin.yml | 5 + .../revealjs/plugin/quarto-support/support.js | 290 +++ .../plugin/reveal-chalkboard/README.md | 160 ++ .../font-awesome/LICENSE.txt | 34 + .../font-awesome/css/all.css | 5 + .../font-awesome/css/brands.css | 5 + .../font-awesome/css/fontawesome.css | 5 + .../font-awesome/css/regular.css | 5 + .../font-awesome/css/solid.css | 5 + .../font-awesome/css/svg-with-js.css | 5 + .../font-awesome/css/v4-shims.css | 2170 ++++++++++++++++ .../font-awesome/css/v4-shims.min.css | 5 + .../font-awesome/webfonts/fa-brands-400.eot | Bin 0 -> 115052 bytes .../font-awesome/webfonts/fa-brands-400.svg | 1127 +++++++++ .../font-awesome/webfonts/fa-brands-400.ttf | Bin 0 -> 114816 bytes .../font-awesome/webfonts/fa-brands-400.woff | Bin 0 -> 73920 bytes .../font-awesome/webfonts/fa-brands-400.woff2 | Bin 0 -> 63376 bytes .../font-awesome/webfonts/fa-regular-400.eot | Bin 0 -> 40744 bytes .../font-awesome/webfonts/fa-regular-400.svg | 467 ++++ .../font-awesome/webfonts/fa-regular-400.ttf | Bin 0 -> 40516 bytes .../font-awesome/webfonts/fa-regular-400.woff | Bin 0 -> 18212 bytes .../webfonts/fa-regular-400.woff2 | Bin 0 -> 14952 bytes .../font-awesome/webfonts/fa-solid-900.eot | Bin 0 -> 160768 bytes .../font-awesome/webfonts/fa-solid-900.svg | 2231 +++++++++++++++++ .../font-awesome/webfonts/fa-solid-900.ttf | Bin 0 -> 160548 bytes .../font-awesome/webfonts/fa-solid-900.woff | Bin 0 -> 76632 bytes .../font-awesome/webfonts/fa-solid-900.woff2 | Bin 0 -> 59572 bytes .../reveal-chalkboard/img/blackboard.png | Bin 0 -> 32733 bytes .../img/boardmarker-black.png | Bin 0 -> 2142 bytes .../img/boardmarker-blue.png | Bin 0 -> 2127 bytes .../img/boardmarker-green.png | Bin 0 -> 2106 bytes .../img/boardmarker-orange.png | Bin 0 -> 2240 bytes .../img/boardmarker-purple.png | Bin 0 -> 2044 bytes .../reveal-chalkboard/img/boardmarker-red.png | Bin 0 -> 2119 bytes .../img/boardmarker-yellow.png | Bin 0 -> 2105 bytes .../reveal-chalkboard/img/chalk-blue.png | Bin 0 -> 5150 bytes .../reveal-chalkboard/img/chalk-green.png | Bin 0 -> 4801 bytes .../reveal-chalkboard/img/chalk-orange.png | Bin 0 -> 5010 bytes .../reveal-chalkboard/img/chalk-purple.png | Bin 0 -> 5250 bytes .../reveal-chalkboard/img/chalk-red.png | Bin 0 -> 4786 bytes .../reveal-chalkboard/img/chalk-white.png | Bin 0 -> 5199 bytes .../reveal-chalkboard/img/chalk-yellow.png | Bin 0 -> 5097 bytes .../plugin/reveal-chalkboard/img/sponge.png | Bin 0 -> 3612 bytes .../reveal-chalkboard/img/whiteboard.png | Bin 0 -> 34129 bytes .../plugin/reveal-chalkboard/plugin.js | 1976 +++++++++++++++ .../plugin/reveal-chalkboard/plugin.yml | 7 + .../plugin/reveal-chalkboard/style.css | 44 + .../libs/revealjs/plugin/reveal-menu/menu.css | 346 +++ .../libs/revealjs/plugin/reveal-menu/menu.js | 1 + .../revealjs/plugin/reveal-menu/plugin.yml | 9 + .../plugin/reveal-menu/quarto-menu.css | 68 + .../plugin/reveal-menu/quarto-menu.js | 40 + .../libs/revealjs/plugin/search/plugin.js | 243 ++ .../libs/revealjs/plugin/search/search.esm.js | 7 + .../libs/revealjs/plugin/search/search.js | 7 + .../libs/revealjs/plugin/zoom/plugin.js | 264 ++ .../libs/revealjs/plugin/zoom/zoom.esm.js | 4 + .../libs/revealjs/plugin/zoom/zoom.js | 4 + instructors/custom.scss | 20 + 121 files changed, 15322 insertions(+) create mode 100644 instructors/2-vector-slides.html create mode 100644 instructors/2-vector-slides.qmd create mode 100644 instructors/2-vector-slides_files/libs/clipboard/clipboard.min.js create mode 100644 instructors/2-vector-slides_files/libs/countdown-0.4.0/countdown.css create mode 100644 instructors/2-vector-slides_files/libs/countdown-0.4.0/countdown.js create mode 100644 instructors/2-vector-slides_files/libs/countdown-0.4.0/smb_stage_clear.mp3 create mode 100644 instructors/2-vector-slides_files/libs/quarto-html/popper.min.js create mode 100644 instructors/2-vector-slides_files/libs/quarto-html/quarto-html.min.css create mode 100644 instructors/2-vector-slides_files/libs/quarto-html/quarto-syntax-highlighting.css create mode 100644 instructors/2-vector-slides_files/libs/quarto-html/tabby.min.js create mode 100644 instructors/2-vector-slides_files/libs/quarto-html/tippy.css create mode 100644 instructors/2-vector-slides_files/libs/quarto-html/tippy.umd.min.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/reset.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/reveal.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/reveal.esm.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/reveal.esm.js.map create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/reveal.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/reveal.js.map create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/league-gothic/LICENSE create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.css create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.eot create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.ttf create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.woff create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/LICENSE create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf create mode 100755 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/dist/theme/quarto.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/highlight/highlight.esm.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/highlight/highlight.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/highlight/monokai.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/highlight/plugin.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/highlight/zenburn.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/markdown/markdown.esm.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/markdown/markdown.js create mode 100755 instructors/2-vector-slides_files/libs/revealjs/plugin/markdown/plugin.js create mode 100755 instructors/2-vector-slides_files/libs/revealjs/plugin/math/katex.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/math/math.esm.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/math/math.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/math/mathjax2.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/math/mathjax3.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/math/plugin.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/notes/notes.esm.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/notes/notes.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/notes/plugin.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/notes/speaker-view.html create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/pdf-export/pdfexport.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/pdf-export/plugin.yml create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/quarto-line-highlight/line-highlight.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/quarto-line-highlight/line-highlight.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/quarto-line-highlight/plugin.yml create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/quarto-support/footer.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/quarto-support/plugin.yml create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/quarto-support/support.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/README.md create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/LICENSE.txt create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/all.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/brands.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/fontawesome.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/regular.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/solid.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/svg-with-js.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/v4-shims.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/v4-shims.min.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.eot create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.svg create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.ttf create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff2 create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.eot create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.svg create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.ttf create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff2 create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.eot create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.svg create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.ttf create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff2 create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/blackboard.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-black.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-blue.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-green.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-orange.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-purple.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-red.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-yellow.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-blue.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-green.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-orange.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-purple.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-red.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-white.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-yellow.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/sponge.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/img/whiteboard.png create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/plugin.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/plugin.yml create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-chalkboard/style.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-menu/menu.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-menu/menu.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-menu/plugin.yml create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-menu/quarto-menu.css create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/reveal-menu/quarto-menu.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/search/plugin.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/search/search.esm.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/search/search.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/zoom/plugin.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/zoom/zoom.esm.js create mode 100644 instructors/2-vector-slides_files/libs/revealjs/plugin/zoom/zoom.js create mode 100644 instructors/custom.scss diff --git a/instructors/2-vector-slides.html b/instructors/2-vector-slides.html new file mode 100644 index 00000000..fa3570cd --- /dev/null +++ b/instructors/2-vector-slides.html @@ -0,0 +1,918 @@ + + + + + + + + + + + + + + Intro to Geospatial Vector Data with R + + + + + + + + + + + + + + + + + + + +
+
+ +
+

Intro to Geospatial Vector Data with R

+ +
+
+
+Ana Petrović +
+
+
+
+Claudiu Forgaci +
+
+
+ +
+
+

sf package for spatial vector data

+ +
+
+

sf package for spatial vector data

+
    +
  • sf provides simple features access to R
  • +
  • represents simple features as records in a data.frame or tibble with a geometry column
  • +
  • function names start with a prefix st_ (“st” stands for spatial type), which is also handy for auto-completion in RStudio
  • +
+
+
+
+

Open and Plot Shapefiles

+ +
+
+

Challenge 1: 🕐 3 mins

+

Read in delft-streets.shp and delft-leisure.shp and call them lines_Delft and point_Delft respectively.

+

Answer the following questions:

+
    +
  1. What type of R spatial object is created when you import each layer?
  2. +
  3. What is the CRS and extent for each object?
  4. +
  5. Do the files contain points, lines, or polygons?
  6. +
  7. How many spatial objects are in each file?
  8. +
+
+
+
+
+03:00 +
+
+
+
+
+
+

Explore and plot by vector layer attributes

+ +
+
+

Challenge 2: 🕙 3 mins

+

Explore the attributes associated with the point_Delft and boundary_Delft spatial objects.

+
    +
  1. How many attributes does each have?
  2. +
  3. What types of leisure points do the points represent? Give three examples.
  4. +
  5. Which of the following is NOT an attribute of the point_Delft data object?
  6. +
+
+

⁣        A) location B) leisure C) osm_id

+
+
+
+
+03:00 +
+
+
+ +
+
+
+

Challenge 3: 🕓 5 mins

+
    +
  1. Create a new object that only contains the motorways in Delft.
  2. +
  3. How many features does the new object have?
  4. +
  5. What is the total length of motorways?
  6. +
  7. Plot the motorways.
  8. +
  9. Extra: follow the same steps with pedestrian streets.
  10. +
+
+
+
+
+05:00 +
+
+
+
+
+

Challenge 4: ⏰ 3 mins

+

In the previous example, we set the line widths to be 1, 0.75, 0.5, and 0.25. In our case line thicknesses are consistent with the hierarchy of the selected road types, but in some cases we might want to show a different hierarchy.

+

Let’s create another plot where we show the different line types with the following thicknesses:

+
    +
  • motorways size = 0.25
  • +
  • primary size = 0.75
  • +
  • secondary size = 0.5
  • +
  • cycleway size = 1
  • +
+
+
+
+
+03:00 +
+
+
+
+
+

Challenge 5: 🕰 5 mins

+

Create a plot that emphasizes only roads where bicycles are allowed, as follows:

+
    +
  • make the lines where bicycles are not allowed THINNER than the roads where bicycles are allowed.
  • +
  • Be sure to add a title and legend to your map.
  • +
  • You might consider a color palette that has all bike-friendly roads displayed in a bright color. All other lines can be black.
  • +
+
+
+
+
+05:00 +
+
+
+
+
+

Challenge 6: 🕗 3 mins

+

Create a map of the municipal boundaries in the Netherlands, as follows:

+
    +
  • Use the data located in your data folder: nl-gemeenten.shp.
  • +
  • Apply a line color to each state using its region value.
  • +
  • Add a legend.
  • +
+
+
+
+
+03:00 +
+
+
+
+
+
+

Plot multiple shapefiles

+ +
+
+

Challenge 7: 🕔 5 mins

+

Create a map of leisure locations only including playground and picnic_table:

+
    +
  • color each point by the leisure type.

  • +
  • Overlay this layer on top of the lines_Delft layer (the streets).

  • +
  • Create a custom legend that applies line symbols to lines and point symbols to the points.

  • +
  • Extra: Modify the previous plot. Tell R to plot each point, using a different symbol of shape value.

  • +
+
+
+
+
+05:00 +
+
+
+
+
+
+

Handle spatial projections

+ +
+
+

Challenge 8: 🕓 3 mins

+

Create a map of the South Holland, as follows:

+
    +
  1. Import nl-gemeenten.shp and filter only the municipalities in South Holland.
  2. +
  3. Plot it and adjust line width as necessary.
  4. +
  5. Layer the boundary of Delft onto the plot.
  6. +
  7. Add a title.
  8. +
  9. Add a legend that shows both the province boundaries (as a line) and the boundary of Delft (as a filled polygon).
  10. +
+
+
+
+
+03:00 +
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/instructors/2-vector-slides.qmd b/instructors/2-vector-slides.qmd new file mode 100644 index 00000000..11224511 --- /dev/null +++ b/instructors/2-vector-slides.qmd @@ -0,0 +1,375 @@ +--- +title: "Intro to Geospatial Vector Data with R" +author: + - "Ana Petrović" + - "Claudiu Forgaci" +format: + revealjs: + # logo: assets/img/TUDelft_logo_rgb.png + # css: logo.css + footer: "Geospatial Data Carpentry for Urbanism" + chalkboard: true + incremental: true + theme: [default, custom.scss] +--- + + +```{r} +#| label: setup +#| include: false + +library(tidyverse) +library(here) +library(sf) + +boundary_Delft <- st_read(here("episodes", "data", "delft-boundary.shp")) +lines_Delft <- st_read(here("episodes", "data", "delft-streets.shp")) +point_Delft <- st_read(here("episodes", "data", "delft-leisure.shp")) + +road_types <- c("motorway", "primary", "secondary", "cycleway") +road_colors <- c("blue", "green", "navy", "purple") + +municipal_boundary_NL <- st_read(here("episodes", "data","nl-gemeenten.shp")) +country_boundary_NL <- st_read(here("episodes", "data", "nl-boundary.shp")) + +lines_Delft_selection <- lines_Delft %>% + filter(highway %in% road_types) %>% + mutate(highway = factor(highway, levels = road_types)) + +knitr::opts_chunk$set( + cache = FALSE, + echo = TRUE, + message = FALSE, + warning = FALSE, + error = FALSE + ) +``` + + +## `sf` package for spatial vector data + +![](https://user-images.githubusercontent.com/520851/50280460-e35c1880-044c-11e9-9ed7-cc46754e49db.jpg){fig-align="center"} + +## `sf` package for spatial vector data + +- `sf` provides [simple features access](https://en.wikipedia.org/wiki/Simple_Features) to R +- represents simple features as records in a `data.frame` or `tibble` with a `geometry` column +- function names start with a prefix `st_` ("st" stands for spatial type), which is also handy for auto-completion in RStudio + +# Open and Plot Shapefiles + +## Challenge 1: `r emo::ji("clock")` **3 mins** + +Read in `delft-streets.shp` and `delft-leisure.shp` and call them `lines_Delft` and `point_Delft` respectively. + +Answer the following questions: + +1. What type of R spatial object is created when you import each layer? +2. What is the CRS and extent for each object? +3. Do the files contain points, lines, or polygons? +4. How many spatial objects are in each file? + +``` {r} +#| echo: false +#| cache: false +countdown::countdown(minutes = 3) +``` + +. . . + +```{r} +#| label: ch-1 +#| eval: false +#| include: false + +lines_Delft <- st_read(here("episodes", "data", "delft-streets.shp")) +point_Delft <- st_read(here("episodes", "data", "delft-leisure.shp")) + +class(lines_Delft) +class(point_Delft) + +st_crs(lines_Delft) +st_crs(point_Delft) + +st_bbox(lines_Delft) +st_bbox(point_Delft) +``` + +# Explore and plot by vector layer attributes + +## Challenge 2: `r emo::ji("clock")` **3 mins** + +Explore the attributes associated with the `point_Delft` and `boundary_Delft` spatial objects. + +1. How many attributes does each have? +2. What types of leisure points do the points represent? Give three examples. +3. Which of the following is NOT an attribute of the point_Delft data object? + +. . . + +⁣        A) location B) leisure C) osm_id + +``` {r} +#| echo: false +#| cache: false +countdown::countdown(minutes = 3) +``` + + +. . . + +```{r} +#| label: ch-2 +#| eval: false +#| include: false + +ncol(point_Delft) +ncol(boundary_Delft) + +head(point_Delft) +head(point_Delft, 10) + +point_Delft + +names(point_Delft) +``` + +## Challenge 3: `r emo::ji("clock")` **5 mins** + +1. Create a new object that only contains the motorways in Delft. +2. How many features does the new object have? +3. What is the total length of motorways? +4. Plot the motorways. +5. Extra: follow the same steps with pedestrian streets. + +``` {r} +#| echo: false +#| cache: false +countdown::countdown(minutes = 5) +``` +. . . + +```{r} +#| label: ch-3 +#| eval: false +#| include: false + +levels(factor(lines_Delft$highway)) + +motorway_Delft <- lines_Delft %>% + filter(highway == "motorway") + +motorway_Delft %>% + mutate(length = st_length(.)) %>% + select(everything(), geometry) %>% + summarise(total_length = sum(length)) + +nrow(motorway_Delft) + +ggplot(data = motorway_Delft) + + geom_sf(size = 1.5) + + ggtitle("Mobility network of Delft", subtitle = "Motorways") + + coord_sf() + +pedestrian_Delft <- lines_Delft %>% + filter(highway == "pedestrian") + +nrow(pedestrian_Delft) + +ggplot(data = pedestrian_Delft) + + geom_sf() + + ggtitle("Slow mobility network of Delft", subtitle = "Pedestrian") + + coord_sf() +``` + +## Challenge 4: `r emo::ji("clock")` **3 mins** + +In the previous example, we set the line widths to be 1, 0.75, 0.5, and 0.25. In our case line thicknesses are consistent with the hierarchy of the selected road types, but in some cases we might want to show a different hierarchy. + +Let’s create another plot where we show the different line types with the following thicknesses: + +- motorways size = 0.25 +- primary size = 0.75 +- secondary size = 0.5 +- cycleway size = 1 + +``` {r} +#| echo: false +#| cache: false +countdown::countdown(minutes = 3) +``` +. . . + +```{r} +#| label: ch-4 +#| eval: false +#| include: false + +levels(factor(lines_Delft$highway)) + +line_widths <- c(0.25, 0.75, 0.5, 1) + +ggplot(data = lines_Delft_selection) + + geom_sf(aes(size = highway)) + + scale_size_manual(values = line_widths) + + labs(size = "Road Size") + + ggtitle("Mobility network of Delft", subtitle = "Roads & Cycleways - Line width varies") + + coord_sf() +``` + +## Challenge 5: `r emo::ji("clock")` **5 mins** + +Create a plot that emphasizes only roads where bicycles are allowed, as follows: + +- make the lines where bicycles are not allowed THINNER than the roads where bicycles are allowed. +- Be sure to add a title and legend to your map. +- You might consider a color palette that has all bike-friendly roads displayed in a bright color. All other lines can be black. + +``` {r} +#| echo: false +#| cache: false +countdown::countdown(minutes = 5) +``` +. . . + +```{r} +#| label: ch-5 +#| eval: false +#| include: false + +class(lines_Delft_selection$highway) + +levels(factor(lines_Delft_selection$highway)) + +lines_Delft_bicycle <- lines_Delft %>% + filter(highway == "cycleway") + +ggplot() + + geom_sf(data = lines_Delft) + + geom_sf(data = lines_Delft_bicycle, color = "magenta", size = 2) + + ggtitle("Mobility network of Delft", subtitle = "Roads dedicated to bikes") + + coord_sf() +``` + +## Challenge 6: `r emo::ji("clock")` **3 mins** + +Create a map of the municipal boundaries in the Netherlands, as follows: + +- Use the data located in your data folder: `nl-gemeenten.shp`. +- Apply a line color to each state using its region value. +- Add a legend. + +``` {r} +#| echo: false +#| cache: false +countdown::countdown(minutes = 3) +``` +. . . + +```{r} +#| label: ch-6 +#| eval: false +#| include: false + +municipal_boundaries_NL <- st_read(here("episodes", "data", "nl-gemeenten.shp")) +str(municipal_boundaries_NL) +levels(factor(municipal_boundaries_NL$ligtInPr_1)) + +ggplot(data = municipal_boundaries_NL) + + geom_sf(aes(color = ligtInPr_1), size = 1) + + ggtitle("Contiguous NL Municipal Boundaries") + + coord_sf() +``` + +# Plot multiple shapefiles + +## Challenge 7: `r emo::ji("clock")` **5 mins** + +Create a map of leisure locations only including `playground` and `picnic_table`: + +- color each point by the leisure type. +- Overlay this layer on top of the `lines_Delft` layer (the streets). +- Create a custom legend that applies line symbols to lines and point symbols to the points. + +- Extra: Modify the previous plot. Tell R to plot each point, using a different symbol of shape value. + +``` {r} +#| echo: false +#| cache: false +countdown::countdown(minutes = 5) +``` +. . . + +```{r} +#| label: ch-7 +#| eval: false +#| include: false + +leisure_locations_selection <- st_read(here("data", "delft-leisure.shp")) %>% + filter(leisure %in% c("playground", "picnic_table")) + +levels(factor(leisure_locations_selection$leisure)) + +blue_orange <- c("cornflowerblue", "darkorange") + +ggplot() + + geom_sf(data = lines_Delft_selection, aes(color = highway)) + + geom_sf(data = leisure_locations_selection, aes(fill = leisure), + shape = 21, show.legend = 'point') + + scale_color_manual(name = "Line Type", values = road_colors, + guide = guide_legend(override.aes = list(linetype = "solid", shape = NA))) + + scale_fill_manual(name = "Soil Type", values = blue_orange, + guide = guide_legend(override.aes = list(linetype = "blank", shape = 21, colour = NA))) + + ggtitle("Traffic and leisure") + + coord_sf() + +ggplot() + + geom_sf(data = lines_Delft_selection, aes(color = highway), size = 1) + + geom_sf(data = leisure_locations_selection, aes(fill = leisure, shape = leisure), size = 3) + + scale_shape_manual(name = "Leisure Type", values = c(21, 22)) + + scale_color_manual(name = "Line Type", values = road_colors) + + scale_fill_manual(name = "Leisure Type", values = rainbow(15), + guide = guide_legend(override.aes = list(linetype = "blank", shape = c(21, 22), + color = "black"))) + + ggtitle("Road network and leisure") + + coord_sf() +``` + +# Handle spatial projections + +## Challenge 8: `r emo::ji("clock")` **3 mins** + +Create a map of the South Holland, as follows: + +1. Import `nl-gemeenten.shp` and filter only the municipalities in South Holland. +2. Plot it and adjust line width as necessary. +3. Layer the boundary of Delft onto the plot. +4. Add a title. +5. Add a legend that shows both the province boundaries (as a line) and the boundary of Delft (as a filled polygon). + +``` {r} +#| echo: false +#| cache: false +countdown::countdown(minutes = 3) +``` +. . . + +```{r} +#| label: ch-8 +#| eval: false +#| include: false + +boundary_ZH <- municipal_boundary_NL %>% + filter(ligtInPr_1 == "Zuid-Holland") + +ggplot() + + geom_sf(data = boundary_ZH, aes(color ="color"), show.legend = "line") + + scale_color_manual(name = "", labels = "Municipal Boundaries", values = c("color" = "gray18")) + + geom_sf(data = boundary_Delft, aes(shape = "shape"), color = "purple", fill = "purple") + + scale_shape_manual(name = "", labels = "Municipality of Delft", values = c("shape" = 19)) + + ggtitle("Delft location in South Holland") + + theme(legend.background = element_rect(color = NA)) + + coord_sf() +``` + + diff --git a/instructors/2-vector-slides_files/libs/clipboard/clipboard.min.js b/instructors/2-vector-slides_files/libs/clipboard/clipboard.min.js new file mode 100644 index 00000000..41c6a0f7 --- /dev/null +++ b/instructors/2-vector-slides_files/libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.10 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 button { + font-size: 1.5rem; + width: 1rem; + height: 1rem; + display: inline-block; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-family: monospace; + padding: 10px; + margin: 0; + background: inherit; + border: 2px solid; + border-radius: 100%; + transition: 50ms transform ease-in-out, 150ms opacity ease-in; + --countdown-transition-distance: 10px; +} + +.countdown .countdown-controls > button:last-child { + transform: translate(calc(-1 * var(--countdown-transition-distance)), var(--countdown-transition-distance)); + opacity: 0; + color: #002F14FF; + background-color: #43AC6A; + border-color: #2A9B59FF; +} + +.countdown .countdown-controls > button:first-child { + transform: translate(var(--countdown-transition-distance), var(--countdown-transition-distance)); + opacity: 0; + color: #4A0900FF; + background-color: #F04124; + border-color: #DE3000FF; +} + +.countdown.running:hover .countdown-controls > button, +.countdown.running:focus-within .countdown-controls > button{ + transform: translate(0, 0); + opacity: 1; +} + +.countdown.running:hover .countdown-controls > button:hover, +.countdown.running:focus-within .countdown-controls > button:hover{ + transform: translate(0, calc(var(--countdown-transition-distance) / -2)); + box-shadow: 0px 2px 5px 0px rgba(50, 50, 50, 0.4); + -webkit-box-shadow: 0px 2px 5px 0px rgba(50, 50, 50, 0.4); +} + +.countdown.running:hover .countdown-controls > button:active, +.countdown.running:focus-within .countdown-controls > button:active{ + transform: translate(0, calc(var(--coutndown-transition-distance) / -5)); +} + +/* ----- Fullscreen ----- */ +.countdown.countdown-fullscreen { + z-index: 0; +} + +.countdown-fullscreen.running .countdown-controls { + top: 1rem; + left: 0; + right: 0; + justify-content: center; +} + +.countdown-fullscreen.running .countdown-controls > button + button { + margin-left: 1rem; +} diff --git a/instructors/2-vector-slides_files/libs/countdown-0.4.0/countdown.js b/instructors/2-vector-slides_files/libs/countdown-0.4.0/countdown.js new file mode 100644 index 00000000..a058ad8f --- /dev/null +++ b/instructors/2-vector-slides_files/libs/countdown-0.4.0/countdown.js @@ -0,0 +1,478 @@ +/* globals Shiny,Audio */ +class CountdownTimer { + constructor (el, opts) { + if (typeof el === 'string' || el instanceof String) { + el = document.querySelector(el) + } + + if (el.counter) { + return el.counter + } + + const minutes = parseInt(el.querySelector('.minutes').innerText || '0') + const seconds = parseInt(el.querySelector('.seconds').innerText || '0') + const duration = minutes * 60 + seconds + + function attrIsTrue (x) { + if (x === true) return true + return !!(x === 'true' || x === '' || x === '1') + } + + this.element = el + this.duration = duration + this.end = null + this.is_running = false + this.warn_when = parseInt(el.dataset.warnWhen) || -1 + this.update_every = parseInt(el.dataset.updateEvery) || 1 + this.play_sound = attrIsTrue(el.dataset.playSound) + this.blink_colon = attrIsTrue(el.dataset.blinkColon) + this.startImmediately = attrIsTrue(el.dataset.startImmediately) + this.timeout = null + this.display = { minutes, seconds } + + if (opts.src_location) { + this.src_location = opts.src_location + } + + this.addEventListeners() + } + + addEventListeners () { + const self = this + + if (this.startImmediately) { + if (window.remark && window.slideshow) { + // Remark (xaringan) support + const isOnVisibleSlide = () => { + return document.querySelector('.remark-visible').contains(self.element) + } + if (isOnVisibleSlide()) { + self.start() + } else { + let started_once = 0 + window.slideshow.on('afterShowSlide', function () { + if (started_once > 0) return + if (isOnVisibleSlide()) { + self.start() + started_once = 1 + } + }) + } + } else if (window.Reveal) { + // Revealjs (quarto) support + const isOnVisibleSlide = () => { + const currentSlide = document.querySelector('.reveal .slide.present') + return currentSlide ? currentSlide.contains(self.element) : false + } + if (isOnVisibleSlide()) { + self.start() + } else { + const revealStartTimer = () => { + if (isOnVisibleSlide()) { + self.start() + window.Reveal.off('slidechanged', revealStartTimer) + } + } + window.Reveal.on('slidechanged', revealStartTimer) + } + } else if (window.IntersectionObserver) { + // All other situtations use IntersectionObserver + const onVisible = (element, callback) => { + new window.IntersectionObserver((entries, observer) => { + entries.forEach(entry => { + if (entry.intersectionRatio > 0) { + callback(element) + observer.disconnect() + } + }) + }).observe(element) + } + onVisible(this.element, el => el.countdown.start()) + } else { + // or just start the timer as soon as it's initialized + this.start() + } + } + + function haltEvent (ev) { + ev.preventDefault() + ev.stopPropagation() + } + function isSpaceOrEnter (ev) { + return ev.code === 'Space' || ev.code === 'Enter' + } + function isArrowUpOrDown (ev) { + return ev.code === 'ArrowUp' || ev.code === 'ArrowDown' + } + + ;['click', 'touchend'].forEach(function (eventType) { + self.element.addEventListener(eventType, function (ev) { + haltEvent(ev) + self.is_running ? self.stop() : self.start() + }) + }) + this.element.addEventListener('keydown', function (ev) { + if (ev.code === "Escape") { + self.reset() + haltEvent(ev) + } + if (!isSpaceOrEnter(ev) && !isArrowUpOrDown(ev)) return + haltEvent(ev) + if (isSpaceOrEnter(ev)) { + self.is_running ? self.stop() : self.start() + return + } + + if (!self.is_running) return + + if (ev.code === 'ArrowUp') { + self.bumpUp() + } else if (ev.code === 'ArrowDown') { + self.bumpDown() + } + }) + this.element.addEventListener('dblclick', function (ev) { + haltEvent(ev) + if (self.is_running) self.reset() + }) + this.element.addEventListener('touchmove', haltEvent) + + const btnBumpDown = this.element.querySelector('.countdown-bump-down') + ;['click', 'touchend'].forEach(function (eventType) { + btnBumpDown.addEventListener(eventType, function (ev) { + haltEvent(ev) + if (self.is_running) self.bumpDown() + }) + }) + btnBumpDown.addEventListener('keydown', function (ev) { + if (!isSpaceOrEnter(ev) || !self.is_running) return + haltEvent(ev) + self.bumpDown() + }) + + const btnBumpUp = this.element.querySelector('.countdown-bump-up') + ;['click', 'touchend'].forEach(function (eventType) { + btnBumpUp.addEventListener(eventType, function (ev) { + haltEvent(ev) + if (self.is_running) self.bumpUp() + }) + }) + btnBumpUp.addEventListener('keydown', function (ev) { + if (!isSpaceOrEnter(ev) || !self.is_running) return + haltEvent(ev) + self.bumpUp() + }) + this.element.querySelector('.countdown-controls').addEventListener('dblclick', function (ev) { + haltEvent(ev) + }) + } + + remainingTime () { + const remaining = this.is_running + ? (this.end - Date.now()) / 1000 + : this.remaining || this.duration + + let minutes = Math.floor(remaining / 60) + let seconds = Math.ceil(remaining - minutes * 60) + + if (seconds > 59) { + minutes = minutes + 1 + seconds = seconds - 60 + } + + return { remaining, minutes, seconds } + } + + start () { + if (this.is_running) return + + this.is_running = true + + if (this.remaining) { + // Having a static remaining time indicates timer was paused + this.end = Date.now() + this.remaining * 1000 + this.remaining = null + } else { + this.end = Date.now() + this.duration * 1000 + } + + this.reportStateToShiny('start') + + this.element.classList.remove('finished') + this.element.classList.add('running') + this.update(true) + this.tick() + } + + tick (run_again) { + if (typeof run_again === 'undefined') { + run_again = true + } + + if (!this.is_running) return + + const { seconds: secondsWas } = this.display + this.update() + + if (run_again) { + const delay = (this.end - Date.now() > 10000) ? 1000 : 250 + this.blinkColon(secondsWas) + this.timeout = setTimeout(this.tick.bind(this), delay) + } + } + + blinkColon (secondsWas) { + // don't blink unless option is set + if (!this.blink_colon) return + // warn_when always updates the seconds + if (this.warn_when > 0 && Date.now() + this.warn_when > this.end) { + this.element.classList.remove('blink-colon') + return + } + const { seconds: secondsIs } = this.display + if (secondsIs > 10 || secondsWas !== secondsIs) { + this.element.classList.toggle('blink-colon') + } + } + + update (force) { + if (typeof force === 'undefined') { + force = false + } + + const { remaining, minutes, seconds } = this.remainingTime() + + const setRemainingTime = (selector, time) => { + const timeContainer = this.element.querySelector(selector) + if (!timeContainer) return + time = Math.max(time, 0) + timeContainer.innerText = String(time).padStart(2, 0) + } + + if (this.is_running && remaining < 0.25) { + this.stop() + setRemainingTime('.minutes', 0) + setRemainingTime('.seconds', 0) + this.playSound() + return + } + + const should_update = force || + Math.round(remaining) < this.warn_when || + Math.round(remaining) % this.update_every === 0 + + if (should_update) { + this.element.classList.toggle('warning', remaining <= this.warn_when) + this.display = { minutes, seconds } + setRemainingTime('.minutes', minutes) + setRemainingTime('.seconds', seconds) + } + } + + stop () { + const { remaining } = this.remainingTime() + if (remaining > 1) { + this.remaining = remaining + } + this.element.classList.remove('running') + this.element.classList.remove('warning') + this.element.classList.remove('blink-colon') + this.element.classList.add('finished') + this.is_running = false + this.end = null + this.reportStateToShiny('stop') + this.timeout = clearTimeout(this.timeout) + } + + reset () { + this.stop() + this.remaining = null + this.update(true) + this.reportStateToShiny('reset') + this.element.classList.remove('finished') + this.element.classList.remove('warning') + } + + setValues (opts) { + if (typeof opts.warn_when !== 'undefined') { + this.warn_when = opts.warn_when + } + if (typeof opts.update_every !== 'undefined') { + this.update_every = opts.update_every + } + if (typeof opts.blink_colon !== 'undefined') { + this.blink_colon = opts.blink_colon + if (!opts.blink_colon) { + this.element.classList.remove('blink-colon') + } + } + if (typeof opts.play_sound !== 'undefined') { + this.play_sound = opts.play_sound + } + if (typeof opts.duration !== 'undefined') { + this.duration = opts.duration + if (this.is_running) { + this.reset() + this.start() + } + } + this.reportStateToShiny('update') + this.update(true) + } + + bumpTimer (val, round) { + round = typeof round === 'boolean' ? round : true + const { remaining } = this.remainingTime() + let newRemaining = remaining + val + if (newRemaining <= 0) { + this.setRemaining(0) + this.stop() + return + } + if (round && newRemaining > 10) { + newRemaining = Math.round(newRemaining / 5) * 5 + } + this.setRemaining(newRemaining) + this.reportStateToShiny(val > 0 ? 'bumpUp' : 'bumpDown') + this.update(true) + } + + bumpUp (val) { + if (!this.is_running) { + console.error('timer is not running') + return + } + this.bumpTimer( + val || this.bumpIncrementValue(), + typeof val === 'undefined' + ) + } + + bumpDown (val) { + if (!this.is_running) { + console.error('timer is not running') + return + } + this.bumpTimer( + val || -1 * this.bumpIncrementValue(), + typeof val === 'undefined' + ) + } + + setRemaining (val) { + if (!this.is_running) { + console.error('timer is not running') + return + } + this.end = Date.now() + val * 1000 + this.update(true) + } + + playSound () { + let url = this.play_sound + if (!url) return + if (typeof url === 'boolean') { + const src = this.src_location + ? this.src_location.replace('/countdown.js', '') + : 'libs/countdown' + url = src + '/smb_stage_clear.mp3' + } + const sound = new Audio(url) + sound.play() + } + + bumpIncrementValue (val) { + val = val || this.remainingTime().remaining + if (val <= 30) { + return 5 + } else if (val <= 300) { + return 15 + } else if (val <= 3000) { + return 30 + } else { + return 60 + } + } + + reportStateToShiny (action) { + if (!window.Shiny) return + + const inputId = this.element.id + const data = { + event: { + action, + time: new Date().toISOString() + }, + timer: { + is_running: this.is_running, + end: this.end ? new Date(this.end).toISOString() : null, + remaining: this.remainingTime() + } + } + + function shinySetInputValue () { + if (!window.Shiny.setInputValue) { + setTimeout(shinySetInputValue, 100) + return + } + window.Shiny.setInputValue(inputId, data) + } + + shinySetInputValue() + } +} + +(function () { + const CURRENT_SCRIPT = document.currentScript.getAttribute('src') + + document.addEventListener('DOMContentLoaded', function () { + const els = document.querySelectorAll('.countdown') + if (!els || !els.length) { + return + } + els.forEach(function (el) { + el.countdown = new CountdownTimer(el, { src_location: CURRENT_SCRIPT }) + }) + + if (window.Shiny) { + Shiny.addCustomMessageHandler('countdown:update', function (x) { + if (!x.id) { + console.error('No `id` provided, cannot update countdown') + return + } + const el = document.getElementById(x.id) + el.countdown.setValues(x) + }) + + Shiny.addCustomMessageHandler('countdown:start', function (id) { + const el = document.getElementById(id) + if (!el) return + el.countdown.start() + }) + + Shiny.addCustomMessageHandler('countdown:stop', function (id) { + const el = document.getElementById(id) + if (!el) return + el.countdown.stop() + }) + + Shiny.addCustomMessageHandler('countdown:reset', function (id) { + const el = document.getElementById(id) + if (!el) return + el.countdown.reset() + }) + + Shiny.addCustomMessageHandler('countdown:bumpUp', function (id) { + const el = document.getElementById(id) + if (!el) return + el.countdown.bumpUp() + }) + + Shiny.addCustomMessageHandler('countdown:bumpDown', function (id) { + const el = document.getElementById(id) + if (!el) return + el.countdown.bumpDown() + }) + } + }) +})() diff --git a/instructors/2-vector-slides_files/libs/countdown-0.4.0/smb_stage_clear.mp3 b/instructors/2-vector-slides_files/libs/countdown-0.4.0/smb_stage_clear.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..da2ddc2cd41e5c37b828798d9a67b3e55cd6657c GIT binary patch literal 38758 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 literal 0 HcmV?d00001 diff --git a/instructors/2-vector-slides_files/libs/quarto-html/popper.min.js b/instructors/2-vector-slides_files/libs/quarto-html/popper.min.js new file mode 100644 index 00000000..2269d669 --- /dev/null +++ b/instructors/2-vector-slides_files/libs/quarto-html/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.11.4 - MIT License + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(e,t){void 0===t&&(t=!1);var n=e.getBoundingClientRect(),o=1,i=1;if(r(e)&&t){var a=e.offsetHeight,f=e.offsetWidth;f>0&&(o=s(n.width)/f||1),a>0&&(i=s(n.height)/a||1)}return{width:n.width/o,height:n.height/i,top:n.top/i,right:n.right/o,bottom:n.bottom/i,left:n.left/o,x:n.left/o,y:n.top/i}}function c(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function p(e){return e?(e.nodeName||"").toLowerCase():null}function u(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function l(e){return f(u(e)).left+c(e).scrollLeft}function d(e){return t(e).getComputedStyle(e)}function h(e){var t=d(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function m(e,n,o){void 0===o&&(o=!1);var i,a,d=r(n),m=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),v=u(n),g=f(e,m),y={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(d||!d&&!o)&&(("body"!==p(n)||h(v))&&(y=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:c(i)),r(n)?((b=f(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):v&&(b.x=l(v))),{x:g.left+y.scrollLeft-b.x,y:g.top+y.scrollTop-b.y,width:g.width,height:g.height}}function v(e){var t=f(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function g(e){return"html"===p(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||u(e)}function y(e){return["html","body","#document"].indexOf(p(e))>=0?e.ownerDocument.body:r(e)&&h(e)?e:y(g(e))}function b(e,n){var r;void 0===n&&(n=[]);var o=y(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],h(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(b(g(s)))}function x(e){return["table","td","th"].indexOf(p(e))>=0}function w(e){return r(e)&&"fixed"!==d(e).position?e.offsetParent:null}function O(e){for(var n=t(e),i=w(e);i&&x(i)&&"static"===d(i).position;)i=w(i);return i&&("html"===p(i)||"body"===p(i)&&"static"===d(i).position)?n:i||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&r(e)&&"fixed"===d(e).position)return null;var n=g(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(p(n))<0;){var i=d(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var j="top",E="bottom",D="right",A="left",L="auto",P=[j,E,D,A],M="start",k="end",W="viewport",B="popper",H=P.reduce((function(e,t){return e.concat([t+"-"+M,t+"-"+k])}),[]),T=[].concat(P,[L]).reduce((function(e,t){return e.concat([t,t+"-"+M,t+"-"+k])}),[]),R=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function S(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function q(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function V(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function N(e,r){return r===W?V(function(e){var n=t(e),r=u(e),o=n.visualViewport,i=r.clientWidth,a=r.clientHeight,s=0,f=0;return o&&(i=o.width,a=o.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=o.offsetLeft,f=o.offsetTop)),{width:i,height:a,x:s+l(e),y:f}}(e)):n(r)?function(e){var t=f(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(r):V(function(e){var t,n=u(e),r=c(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+l(e),p=-r.scrollTop;return"rtl"===d(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:p}}(u(e)))}function I(e,t,o){var s="clippingParents"===t?function(e){var t=b(g(e)),o=["absolute","fixed"].indexOf(d(e).position)>=0&&r(e)?O(e):e;return n(o)?t.filter((function(e){return n(e)&&q(e,o)&&"body"!==p(e)})):[]}(e):[].concat(t),f=[].concat(s,[o]),c=f[0],u=f.reduce((function(t,n){var r=N(e,n);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),N(e,c));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function _(e){return e.split("-")[1]}function F(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function U(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?_(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case j:t={x:s,y:n.y-r.height};break;case E:t={x:s,y:n.y+n.height};break;case D:t={x:n.x+n.width,y:f};break;case A:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?F(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case M:t[c]=t[c]-(n[p]/2-r[p]/2);break;case k:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function z(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function X(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function Y(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.boundary,s=void 0===a?"clippingParents":a,c=r.rootBoundary,p=void 0===c?W:c,l=r.elementContext,d=void 0===l?B:l,h=r.altBoundary,m=void 0!==h&&h,v=r.padding,g=void 0===v?0:v,y=z("number"!=typeof g?g:X(g,P)),b=d===B?"reference":B,x=e.rects.popper,w=e.elements[m?b:d],O=I(n(w)?w:w.contextElement||u(e.elements.popper),s,p),A=f(e.elements.reference),L=U({reference:A,element:x,strategy:"absolute",placement:i}),M=V(Object.assign({},x,L)),k=d===B?M:A,H={top:O.top-k.top+y.top,bottom:k.bottom-O.bottom+y.bottom,left:O.left-k.left+y.left,right:k.right-O.right+y.right},T=e.modifiersData.offset;if(d===B&&T){var R=T[i];Object.keys(H).forEach((function(e){var t=[D,E].indexOf(e)>=0?1:-1,n=[j,E].indexOf(e)>=0?"y":"x";H[e]+=R[n]*t}))}return H}var G={placement:"bottom",modifiers:[],strategy:"absolute"};function J(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[A,D].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},ie={left:"right",right:"left",bottom:"top",top:"bottom"};function ae(e){return e.replace(/left|right|bottom|top/g,(function(e){return ie[e]}))}var se={start:"end",end:"start"};function fe(e){return e.replace(/start|end/g,(function(e){return se[e]}))}function ce(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?T:f,p=_(r),u=p?s?H:H.filter((function(e){return _(e)===p})):P,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=Y(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var pe={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,g=C(v),y=f||(g===v||!h?[ae(v)]:function(e){if(C(e)===L)return[];var t=ae(e);return[fe(e),t,fe(t)]}(v)),b=[v].concat(y).reduce((function(e,n){return e.concat(C(n)===L?ce(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,P=!0,k=b[0],W=0;W=0,S=R?"width":"height",q=Y(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),V=R?T?D:A:T?E:j;x[S]>w[S]&&(V=ae(V));var N=ae(V),I=[];if(i&&I.push(q[H]<=0),s&&I.push(q[V]<=0,q[N]<=0),I.every((function(e){return e}))){k=B,P=!1;break}O.set(B,I)}if(P)for(var F=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return k=t,"break"},U=h?3:1;U>0;U--){if("break"===F(U))break}t.placement!==k&&(t.modifiersData[r]._skip=!0,t.placement=k,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function ue(e,t,n){return i(e,a(t,n))}var le={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,g=n.tetherOffset,y=void 0===g?0:g,b=Y(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=_(t.placement),L=!w,P=F(x),k="x"===P?"y":"x",W=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,q={x:0,y:0};if(W){if(s){var V,N="y"===P?j:A,I="y"===P?E:D,U="y"===P?"height":"width",z=W[P],X=z+b[N],G=z-b[I],J=m?-H[U]/2:0,K=w===M?B[U]:H[U],Q=w===M?-H[U]:-B[U],Z=t.elements.arrow,$=m&&Z?v(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=ue(0,B[U],$[U]),oe=L?B[U]/2-J-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=L?-B[U]/2+J+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&O(t.elements.arrow),se=ae?"y"===P?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(V=null==S?void 0:S[P])?V:0,ce=z+ie-fe,pe=ue(m?a(X,z+oe-fe-se):X,z,m?i(G,ce):G);W[P]=pe,q[P]=pe-z}if(c){var le,de="x"===P?j:A,he="x"===P?E:D,me=W[k],ve="y"===k?"height":"width",ge=me+b[de],ye=me-b[he],be=-1!==[j,A].indexOf(x),xe=null!=(le=null==S?void 0:S[k])?le:0,we=be?ge:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ye,je=m&&be?function(e,t,n){var r=ue(e,t,n);return r>n?n:r}(we,me,Oe):ue(m?we:ge,me,m?Oe:ye);W[k]=je,q[k]=je-me}t.modifiersData[r]=q}},requiresIfExists:["offset"]};var de={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=F(s),c=[A,D].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return z("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:X(e,P))}(o.padding,n),u=v(i),l="y"===f?j:A,d="y"===f?E:D,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],g=O(i),y=g?"y"===f?g.clientHeight||0:g.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],L=y/2-u[c]/2+b,M=ue(x,L,w),k=f;n.modifiersData[r]=((t={})[k]=M,t.centerOffset=M-L,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&q(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function he(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function me(e){return[j,D,E,A].some((function(t){return e[t]>=0}))}var ve={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=Y(t,{elementContext:"reference"}),s=Y(t,{altBoundary:!0}),f=he(a,r),c=he(s,o,i),p=me(f),u=me(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},ge=K({defaultModifiers:[Z,$,ne,re]}),ye=[Z,$,ne,re,oe,pe,le,de,ve],be=K({defaultModifiers:ye});e.applyStyles=re,e.arrow=de,e.computeStyles=ne,e.createPopper=be,e.createPopperLite=ge,e.defaultModifiers=ye,e.detectOverflow=Y,e.eventListeners=Z,e.flip=pe,e.hide=ve,e.offset=oe,e.popperGenerator=K,e.popperOffsets=$,e.preventOverflow=le,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/instructors/2-vector-slides_files/libs/quarto-html/quarto-html.min.css b/instructors/2-vector-slides_files/libs/quarto-html/quarto-html.min.css new file mode 100644 index 00000000..c2857c39 --- /dev/null +++ b/instructors/2-vector-slides_files/libs/quarto-html/quarto-html.min.css @@ -0,0 +1 @@ +/*# sourceMappingURL=0a6b880beb84f9b6f36107a76f82c5b1.css.map */ diff --git a/instructors/2-vector-slides_files/libs/quarto-html/quarto-syntax-highlighting.css b/instructors/2-vector-slides_files/libs/quarto-html/quarto-syntax-highlighting.css new file mode 100644 index 00000000..36cb3287 --- /dev/null +++ b/instructors/2-vector-slides_files/libs/quarto-html/quarto-syntax-highlighting.css @@ -0,0 +1,171 @@ +/* quarto syntax highlight colors */ +:root { + --quarto-hl-ot-color: #003B4F; + --quarto-hl-at-color: #657422; + --quarto-hl-ss-color: #20794D; + --quarto-hl-an-color: #5E5E5E; + --quarto-hl-fu-color: #4758AB; + --quarto-hl-st-color: #20794D; + --quarto-hl-cf-color: #003B4F; + --quarto-hl-op-color: #5E5E5E; + --quarto-hl-er-color: #AD0000; + --quarto-hl-bn-color: #AD0000; + --quarto-hl-al-color: #AD0000; + --quarto-hl-va-color: #111111; + --quarto-hl-bu-color: inherit; + --quarto-hl-ex-color: inherit; + --quarto-hl-pp-color: #AD0000; + --quarto-hl-in-color: #5E5E5E; + --quarto-hl-vs-color: #20794D; + --quarto-hl-wa-color: #5E5E5E; + --quarto-hl-do-color: #5E5E5E; + --quarto-hl-im-color: #00769E; + --quarto-hl-ch-color: #20794D; + --quarto-hl-dt-color: #AD0000; + --quarto-hl-fl-color: #AD0000; + --quarto-hl-co-color: #5E5E5E; + --quarto-hl-cv-color: #5E5E5E; + --quarto-hl-cn-color: #8f5902; + --quarto-hl-sc-color: #5E5E5E; + --quarto-hl-dv-color: #AD0000; + --quarto-hl-kw-color: #003B4F; +} + +/* other quarto variables */ +:root { + --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +pre > code.sourceCode > span { + color: #003B4F; +} + +code span { + color: #003B4F; +} + +code.sourceCode > span { + color: #003B4F; +} + +div.sourceCode, +div.sourceCode pre.sourceCode { + color: #003B4F; +} + +code span.ot { + color: #003B4F; +} + +code span.at { + color: #657422; +} + +code span.ss { + color: #20794D; +} + +code span.an { + color: #5E5E5E; +} + +code span.fu { + color: #4758AB; +} + +code span.st { + color: #20794D; +} + +code span.cf { + color: #003B4F; +} + +code span.op { + color: #5E5E5E; +} + +code span.er { + color: #AD0000; +} + +code span.bn { + color: #AD0000; +} + +code span.al { + color: #AD0000; +} + +code span.va { + color: #111111; +} + +code span.pp { + color: #AD0000; +} + +code span.in { + color: #5E5E5E; +} + +code span.vs { + color: #20794D; +} + +code span.wa { + color: #5E5E5E; + font-style: italic; +} + +code span.do { + color: #5E5E5E; + font-style: italic; +} + +code span.im { + color: #00769E; +} + +code span.ch { + color: #20794D; +} + +code span.dt { + color: #AD0000; +} + +code span.fl { + color: #AD0000; +} + +code span.co { + color: #5E5E5E; +} + +code span.cv { + color: #5E5E5E; + font-style: italic; +} + +code span.cn { + color: #8f5902; +} + +code span.sc { + color: #5E5E5E; +} + +code span.dv { + color: #AD0000; +} + +code span.kw { + color: #003B4F; +} + +.prevent-inlining { + content: " !el.hasAttribute("disabled") && !el.getAttribute("aria-hidden") + ); + }; + + /** + * Remove roles and attributes from a tab and its content + * @param {Node} tab The tab + * @param {Node} content The tab content + * @param {Object} settings User settings and options + */ + var destroyTab = function (tab, content, settings) { + // Remove the generated ID + if (tab.id.slice(0, settings.idPrefix.length) === settings.idPrefix) { + tab.id = ""; + } + + // remove event listener + tab.removeEventListener("focus", focusHandler, true); + + // Remove roles + tab.removeAttribute("role"); + tab.removeAttribute("aria-controls"); + tab.removeAttribute("aria-selected"); + tab.removeAttribute("tabindex"); + tab.closest("li").removeAttribute("role"); + content.removeAttribute("role"); + content.removeAttribute("aria-labelledby"); + content.removeAttribute("hidden"); + }; + + /** + * Add the required roles and attributes to a tab and its content + * @param {Node} tab The tab + * @param {Node} content The tab content + * @param {Object} settings User settings and options + */ + var setupTab = function (tab, content, settings) { + // Give tab an ID if it doesn't already have one + if (!tab.id) { + tab.id = settings.idPrefix + content.id; + } + + // Add roles + tab.setAttribute("role", "tab"); + tab.setAttribute("aria-controls", content.id); + tab.closest("li").setAttribute("role", "presentation"); + content.setAttribute("role", "tabpanel"); + content.setAttribute("aria-labelledby", tab.id); + + // Add selected state + if (tab.matches(settings.default)) { + tab.setAttribute("aria-selected", "true"); + } else { + tab.setAttribute("aria-selected", "false"); + content.setAttribute("hidden", "hidden"); + } + + // add focus event listender + tab.addEventListener("focus", focusHandler); + }; + + /** + * Hide a tab and its content + * @param {Node} newTab The new tab that's replacing it + */ + var hide = function (newTab) { + // Variables + var tabGroup = newTab.closest('[role="tablist"]'); + if (!tabGroup) return {}; + var tab = tabGroup.querySelector('[role="tab"][aria-selected="true"]'); + if (!tab) return {}; + var content = document.querySelector(tab.hash); + + // Hide the tab + tab.setAttribute("aria-selected", "false"); + + // Hide the content + if (!content) return { previousTab: tab }; + content.setAttribute("hidden", "hidden"); + + // Return the hidden tab and content + return { + previousTab: tab, + previousContent: content, + }; + }; + + /** + * Show a tab and its content + * @param {Node} tab The tab + * @param {Node} content The tab content + */ + var show = function (tab, content) { + tab.setAttribute("aria-selected", "true"); + content.removeAttribute("hidden"); + tab.focus(); + }; + + /** + * Toggle a new tab + * @param {Node} tab The tab to show + */ + var toggle = function (tab) { + // Make sure there's a tab to toggle and it's not already active + if (!tab || tab.getAttribute("aria-selected") == "true") return; + + // Variables + var content = document.querySelector(tab.hash); + if (!content) return; + + // Hide active tab and content + var details = hide(tab); + + // Show new tab and content + show(tab, content); + + // Add event details + details.tab = tab; + details.content = content; + + // Emit a custom event + emitEvent(tab, details); + }; + + /** + * Get all of the tabs in a tablist + * @param {Node} tab A tab from the list + * @return {Object} The tabs and the index of the currently active one + */ + var getTabsMap = function (tab) { + var tabGroup = tab.closest('[role="tablist"]'); + var tabs = tabGroup ? tabGroup.querySelectorAll('[role="tab"]') : null; + if (!tabs) return; + return { + tabs: tabs, + index: Array.prototype.indexOf.call(tabs, tab), + }; + }; + + /** + * Switch the active tab based on keyboard activity + * @param {Node} tab The currently active tab + * @param {Key} key The key that was pressed + */ + var switchTabs = function (tab, key) { + // Get a map of tabs + var map = getTabsMap(tab); + if (!map) return; + var length = map.tabs.length - 1; + var index; + + // Go to previous tab + if (["ArrowUp", "ArrowLeft", "Up", "Left"].indexOf(key) > -1) { + index = map.index < 1 ? length : map.index - 1; + } + + // Go to next tab + else if (["ArrowDown", "ArrowRight", "Down", "Right"].indexOf(key) > -1) { + index = map.index === length ? 0 : map.index + 1; + } + + // Go to home + else if (key === "Home") { + index = 0; + } + + // Go to end + else if (key === "End") { + index = length; + } + + // Toggle the tab + toggle(map.tabs[index]); + }; + + /** + * Create the Constructor object + */ + var Constructor = function (selector, options) { + // + // Variables + // + + var publicAPIs = {}; + var settings, tabWrapper; + + // + // Methods + // + + publicAPIs.destroy = function () { + // Get all tabs + var tabs = tabWrapper.querySelectorAll("a"); + + // Add roles to tabs + Array.prototype.forEach.call(tabs, function (tab) { + // Get the tab content + var content = document.querySelector(tab.hash); + if (!content) return; + + // Setup the tab + destroyTab(tab, content, settings); + }); + + // Remove role from wrapper + tabWrapper.removeAttribute("role"); + + // Remove event listeners + document.documentElement.removeEventListener( + "click", + clickHandler, + true + ); + tabWrapper.removeEventListener("keydown", keyHandler, true); + + // Reset variables + settings = null; + tabWrapper = null; + }; + + /** + * Setup the DOM with the proper attributes + */ + publicAPIs.setup = function () { + // Variables + tabWrapper = document.querySelector(selector); + if (!tabWrapper) return; + var tabs = tabWrapper.querySelectorAll("a"); + + // Add role to wrapper + tabWrapper.setAttribute("role", "tablist"); + + // Add roles to tabs. provide dynanmic tab indexes if we are within reveal + var contentTabindexes = + window.document.body.classList.contains("reveal-viewport"); + var nextTabindex = 1; + Array.prototype.forEach.call(tabs, function (tab) { + if (contentTabindexes) { + tab.setAttribute("tabindex", "" + nextTabindex++); + } else { + tab.setAttribute("tabindex", "0"); + } + + // Get the tab content + var content = document.querySelector(tab.hash); + if (!content) return; + + // set tab indexes for content + if (contentTabindexes) { + getKeyboardFocusableElements(content).forEach(function (el) { + el.setAttribute("tabindex", "" + nextTabindex++); + }); + } + + // Setup the tab + setupTab(tab, content, settings); + }); + }; + + /** + * Toggle a tab based on an ID + * @param {String|Node} id The tab to toggle + */ + publicAPIs.toggle = function (id) { + // Get the tab + var tab = id; + if (typeof id === "string") { + tab = document.querySelector( + selector + ' [role="tab"][href*="' + id + '"]' + ); + } + + // Toggle the tab + toggle(tab); + }; + + /** + * Handle click events + */ + var clickHandler = function (event) { + // Only run on toggles + var tab = event.target.closest(selector + ' [role="tab"]'); + if (!tab) return; + + // Prevent link behavior + event.preventDefault(); + + // Toggle the tab + toggle(tab); + }; + + /** + * Handle keydown events + */ + var keyHandler = function (event) { + // Only run if a tab is in focus + var tab = document.activeElement; + if (!tab.matches(selector + ' [role="tab"]')) return; + + // Only run for specific keys + if (["Home", "End"].indexOf(event.key) < 0) return; + + // Switch tabs + switchTabs(tab, event.key); + }; + + /** + * Initialize the instance + */ + var init = function () { + // Merge user options with defaults + settings = extend(defaults, options || {}); + + // Setup the DOM + publicAPIs.setup(); + + // Add event listeners + document.documentElement.addEventListener("click", clickHandler, true); + tabWrapper.addEventListener("keydown", keyHandler, true); + }; + + // + // Initialize and return the Public APIs + // + + init(); + return publicAPIs; + }; + + // + // Return the Constructor + // + + return Constructor; + } +); diff --git a/instructors/2-vector-slides_files/libs/quarto-html/tippy.css b/instructors/2-vector-slides_files/libs/quarto-html/tippy.css new file mode 100644 index 00000000..e6ae635c --- /dev/null +++ b/instructors/2-vector-slides_files/libs/quarto-html/tippy.css @@ -0,0 +1 @@ +.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/instructors/2-vector-slides_files/libs/quarto-html/tippy.umd.min.js b/instructors/2-vector-slides_files/libs/quarto-html/tippy.umd.min.js new file mode 100644 index 00000000..ca292be3 --- /dev/null +++ b/instructors/2-vector-slides_files/libs/quarto-html/tippy.umd.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); + diff --git a/instructors/2-vector-slides_files/libs/revealjs/dist/reset.css b/instructors/2-vector-slides_files/libs/revealjs/dist/reset.css new file mode 100644 index 00000000..e2385390 --- /dev/null +++ b/instructors/2-vector-slides_files/libs/revealjs/dist/reset.css @@ -0,0 +1,30 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v4.0 | 20180602 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +main, menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, main, menu, nav, section { + display: block; +} \ No newline at end of file diff --git a/instructors/2-vector-slides_files/libs/revealjs/dist/reveal.css b/instructors/2-vector-slides_files/libs/revealjs/dist/reveal.css new file mode 100644 index 00000000..5f80fd09 --- /dev/null +++ b/instructors/2-vector-slides_files/libs/revealjs/dist/reveal.css @@ -0,0 +1,8 @@ +/*! +* reveal.js 4.3.1 +* https://revealjs.com +* MIT licensed +* +* Copyright (C) 2011-2022 Hakim El Hattab, https://hakim.se +*/ +.reveal .r-stretch,.reveal .stretch{max-width:none;max-height:none}.reveal pre.r-stretch code,.reveal pre.stretch code{height:100%;max-height:100%;box-sizing:border-box}.reveal .r-fit-text{display:inline-block;white-space:nowrap}.reveal .r-stack{display:grid}.reveal .r-stack>*{grid-area:1/1;margin:auto}.reveal .r-hstack,.reveal .r-vstack{display:flex}.reveal .r-hstack img,.reveal .r-hstack video,.reveal .r-vstack img,.reveal .r-vstack video{min-width:0;min-height:0;-o-object-fit:contain;object-fit:contain}.reveal .r-vstack{flex-direction:column;align-items:center;justify-content:center}.reveal .r-hstack{flex-direction:row;align-items:center;justify-content:center}.reveal .items-stretch{align-items:stretch}.reveal .items-start{align-items:flex-start}.reveal .items-center{align-items:center}.reveal .items-end{align-items:flex-end}.reveal .justify-between{justify-content:space-between}.reveal .justify-around{justify-content:space-around}.reveal .justify-start{justify-content:flex-start}.reveal .justify-center{justify-content:center}.reveal .justify-end{justify-content:flex-end}html.reveal-full-page{width:100%;height:100%;height:100vh;height:calc(var(--vh,1vh) * 100);overflow:hidden}.reveal-viewport{height:100%;overflow:hidden;position:relative;line-height:1;margin:0;background-color:#fff;color:#000}.reveal-viewport:-webkit-full-screen{top:0!important;left:0!important;width:100%!important;height:100%!important;transform:none!important}.reveal-viewport:-ms-fullscreen{top:0!important;left:0!important;width:100%!important;height:100%!important;transform:none!important}.reveal-viewport:fullscreen{top:0!important;left:0!important;width:100%!important;height:100%!important;transform:none!important}.reveal .slides section .fragment{opacity:0;visibility:hidden;transition:all .2s ease;will-change:opacity}.reveal .slides section .fragment.visible{opacity:1;visibility:inherit}.reveal .slides section .fragment.disabled{transition:none}.reveal .slides section .fragment.grow{opacity:1;visibility:inherit}.reveal .slides section .fragment.grow.visible{transform:scale(1.3)}.reveal .slides section .fragment.shrink{opacity:1;visibility:inherit}.reveal .slides section .fragment.shrink.visible{transform:scale(.7)}.reveal .slides section .fragment.zoom-in{transform:scale(.1)}.reveal .slides section .fragment.zoom-in.visible{transform:none}.reveal .slides section .fragment.fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-out.visible{opacity:0;visibility:hidden}.reveal .slides section .fragment.semi-fade-out{opacity:1;visibility:inherit}.reveal .slides section .fragment.semi-fade-out.visible{opacity:.5;visibility:inherit}.reveal .slides section .fragment.strike{opacity:1;visibility:inherit}.reveal .slides section .fragment.strike.visible{text-decoration:line-through}.reveal .slides section .fragment.fade-up{transform:translate(0,40px)}.reveal .slides section .fragment.fade-up.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-down{transform:translate(0,-40px)}.reveal .slides section .fragment.fade-down.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-right{transform:translate(-40px,0)}.reveal .slides section .fragment.fade-right.visible{transform:translate(0,0)}.reveal .slides section .fragment.fade-left{transform:translate(40px,0)}.reveal .slides section .fragment.fade-left.visible{transform:translate(0,0)}.reveal .slides section .fragment.current-visible,.reveal .slides section .fragment.fade-in-then-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.current-visible.current-fragment,.reveal .slides section .fragment.fade-in-then-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out{opacity:0;visibility:hidden}.reveal .slides section .fragment.fade-in-then-semi-out.visible{opacity:.5;visibility:inherit}.reveal .slides section .fragment.fade-in-then-semi-out.current-fragment{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-blue,.reveal .slides section .fragment.highlight-current-blue,.reveal .slides section .fragment.highlight-current-green,.reveal .slides section .fragment.highlight-current-red,.reveal .slides section .fragment.highlight-green,.reveal .slides section .fragment.highlight-red{opacity:1;visibility:inherit}.reveal .slides section .fragment.highlight-red.visible{color:#ff2c2d}.reveal .slides section .fragment.highlight-green.visible{color:#17ff2e}.reveal .slides section .fragment.highlight-blue.visible{color:#1b91ff}.reveal .slides section .fragment.highlight-current-red.current-fragment{color:#ff2c2d}.reveal .slides section .fragment.highlight-current-green.current-fragment{color:#17ff2e}.reveal .slides section .fragment.highlight-current-blue.current-fragment{color:#1b91ff}.reveal:after{content:"";font-style:italic}.reveal iframe{z-index:1}.reveal a{position:relative}@keyframes bounce-right{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(10px)}30%{transform:translateX(-5px)}}@keyframes bounce-left{0%,10%,25%,40%,50%{transform:translateX(0)}20%{transform:translateX(-10px)}30%{transform:translateX(5px)}}@keyframes bounce-down{0%,10%,25%,40%,50%{transform:translateY(0)}20%{transform:translateY(10px)}30%{transform:translateY(-5px)}}.reveal .controls{display:none;position:absolute;top:auto;bottom:12px;right:12px;left:auto;z-index:11;color:#000;pointer-events:none;font-size:10px}.reveal .controls button{position:absolute;padding:0;background-color:transparent;border:0;outline:0;cursor:pointer;color:currentColor;transform:scale(.9999);transition:color .2s ease,opacity .2s ease,transform .2s ease;z-index:2;pointer-events:auto;font-size:inherit;visibility:hidden;opacity:0;-webkit-appearance:none;-webkit-tap-highlight-color:transparent}.reveal .controls .controls-arrow:after,.reveal .controls .controls-arrow:before{content:"";position:absolute;top:0;left:0;width:2.6em;height:.5em;border-radius:.25em;background-color:currentColor;transition:all .15s ease,background-color .8s ease;transform-origin:.2em 50%;will-change:transform}.reveal .controls .controls-arrow{position:relative;width:3.6em;height:3.6em}.reveal .controls .controls-arrow:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal .controls .controls-arrow:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}.reveal .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(40deg)}.reveal .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-40deg)}.reveal .controls .controls-arrow:active:before{transform:translateX(.5em) translateY(1.55em) rotate(36deg)}.reveal .controls .controls-arrow:active:after{transform:translateX(.5em) translateY(1.55em) rotate(-36deg)}.reveal .controls .navigate-left{right:6.4em;bottom:3.2em;transform:translateX(-10px)}.reveal .controls .navigate-left.highlight{animation:bounce-left 2s 50 both ease-out}.reveal .controls .navigate-right{right:0;bottom:3.2em;transform:translateX(10px)}.reveal .controls .navigate-right .controls-arrow{transform:rotate(180deg)}.reveal .controls .navigate-right.highlight{animation:bounce-right 2s 50 both ease-out}.reveal .controls .navigate-up{right:3.2em;bottom:6.4em;transform:translateY(-10px)}.reveal .controls .navigate-up .controls-arrow{transform:rotate(90deg)}.reveal .controls .navigate-down{right:3.2em;bottom:-1.4em;padding-bottom:1.4em;transform:translateY(10px)}.reveal .controls .navigate-down .controls-arrow{transform:rotate(-90deg)}.reveal .controls .navigate-down.highlight{animation:bounce-down 2s 50 both ease-out}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled{opacity:.3}.reveal .controls[data-controls-back-arrows=faded] .navigate-up.enabled:hover{opacity:1}.reveal .controls[data-controls-back-arrows=hidden] .navigate-up.enabled{opacity:0;visibility:hidden}.reveal .controls .enabled{visibility:visible;opacity:.9;cursor:pointer;transform:none}.reveal .controls .enabled.fragmented{opacity:.5}.reveal .controls .enabled.fragmented:hover,.reveal .controls .enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled{opacity:.3}.reveal:not(.rtl) .controls[data-controls-back-arrows=faded] .navigate-left.enabled:hover{opacity:1}.reveal:not(.rtl) .controls[data-controls-back-arrows=hidden] .navigate-left.enabled{opacity:0;visibility:hidden}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled{opacity:.3}.reveal.rtl .controls[data-controls-back-arrows=faded] .navigate-right.enabled:hover{opacity:1}.reveal.rtl .controls[data-controls-back-arrows=hidden] .navigate-right.enabled{opacity:0;visibility:hidden}.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-down,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-up{display:none}.reveal:not(.has-vertical-slides) .controls .navigate-left,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-left{bottom:1.4em;right:5.5em}.reveal:not(.has-vertical-slides) .controls .navigate-right,.reveal[data-navigation-mode=linear].has-horizontal-slides .navigate-right{bottom:1.4em;right:.5em}.reveal:not(.has-horizontal-slides) .controls .navigate-up{right:1.4em;bottom:5em}.reveal:not(.has-horizontal-slides) .controls .navigate-down{right:1.4em;bottom:.5em}.reveal.has-dark-background .controls{color:#fff}.reveal.has-light-background .controls{color:#000}.reveal.no-hover .controls .controls-arrow:active:before,.reveal.no-hover .controls .controls-arrow:hover:before{transform:translateX(.5em) translateY(1.55em) rotate(45deg)}.reveal.no-hover .controls .controls-arrow:active:after,.reveal.no-hover .controls .controls-arrow:hover:after{transform:translateX(.5em) translateY(1.55em) rotate(-45deg)}@media screen and (min-width:500px){.reveal .controls[data-controls-layout=edges]{top:0;right:0;bottom:0;left:0}.reveal .controls[data-controls-layout=edges] .navigate-down,.reveal .controls[data-controls-layout=edges] .navigate-left,.reveal .controls[data-controls-layout=edges] .navigate-right,.reveal .controls[data-controls-layout=edges] .navigate-up{bottom:auto;right:auto}.reveal .controls[data-controls-layout=edges] .navigate-left{top:50%;left:.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-right{top:50%;right:.8em;margin-top:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-up{top:.8em;left:50%;margin-left:-1.8em}.reveal .controls[data-controls-layout=edges] .navigate-down{bottom:-.3em;left:50%;margin-left:-1.8em}}.reveal .progress{position:absolute;display:none;height:3px;width:100%;bottom:0;left:0;z-index:10;background-color:rgba(0,0,0,.2);color:#fff}.reveal .progress:after{content:"";display:block;position:absolute;height:10px;width:100%;top:-10px}.reveal .progress span{display:block;height:100%;width:100%;background-color:currentColor;transition:transform .8s cubic-bezier(.26,.86,.44,.985);transform-origin:0 0;transform:scaleX(0)}.reveal .slide-number{position:absolute;display:block;right:8px;bottom:8px;z-index:31;font-family:Helvetica,sans-serif;font-size:12px;line-height:1;color:#fff;background-color:rgba(0,0,0,.4);padding:5px}.reveal .slide-number a{color:currentColor}.reveal .slide-number-delimiter{margin:0 3px}.reveal{position:relative;width:100%;height:100%;overflow:hidden;touch-action:pinch-zoom}.reveal.embedded{touch-action:pan-y}.reveal .slides{position:absolute;width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin:auto;pointer-events:none;overflow:visible;z-index:1;text-align:center;perspective:600px;perspective-origin:50% 40%}.reveal .slides>section{perspective:600px}.reveal .slides>section,.reveal .slides>section>section{display:none;position:absolute;width:100%;pointer-events:auto;z-index:10;transform-style:flat;transition:transform-origin .8s cubic-bezier(.26,.86,.44,.985),transform .8s cubic-bezier(.26,.86,.44,.985),visibility .8s cubic-bezier(.26,.86,.44,.985),opacity .8s cubic-bezier(.26,.86,.44,.985)}.reveal[data-transition-speed=fast] .slides section{transition-duration:.4s}.reveal[data-transition-speed=slow] .slides section{transition-duration:1.2s}.reveal .slides section[data-transition-speed=fast]{transition-duration:.4s}.reveal .slides section[data-transition-speed=slow]{transition-duration:1.2s}.reveal .slides>section.stack{padding-top:0;padding-bottom:0;pointer-events:none;height:100%}.reveal .slides>section.present,.reveal .slides>section>section.present{display:block;z-index:11;opacity:1}.reveal .slides>section:empty,.reveal .slides>section>section:empty,.reveal .slides>section>section[data-background-interactive],.reveal .slides>section[data-background-interactive]{pointer-events:none}.reveal.center,.reveal.center .slides,.reveal.center .slides section{min-height:0!important}.reveal .slides>section:not(.present),.reveal .slides>section>section:not(.present){pointer-events:none}.reveal.overview .slides>section,.reveal.overview .slides>section>section{pointer-events:auto}.reveal .slides>section.future,.reveal .slides>section.past,.reveal .slides>section>section.future,.reveal .slides>section>section.past{opacity:0}.reveal .slides>section[data-transition=slide].past,.reveal .slides>section[data-transition~=slide-out].past,.reveal.slide .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=slide].future,.reveal .slides>section[data-transition~=slide-in].future,.reveal.slide .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=slide].past,.reveal .slides>section>section[data-transition~=slide-out].past,.reveal.slide .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=slide].future,.reveal .slides>section>section[data-transition~=slide-in].future,.reveal.slide .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides>section[data-transition=linear].past,.reveal .slides>section[data-transition~=linear-out].past,.reveal.linear .slides>section:not([data-transition]).past{transform:translate(-150%,0)}.reveal .slides>section[data-transition=linear].future,.reveal .slides>section[data-transition~=linear-in].future,.reveal.linear .slides>section:not([data-transition]).future{transform:translate(150%,0)}.reveal .slides>section>section[data-transition=linear].past,.reveal .slides>section>section[data-transition~=linear-out].past,.reveal.linear .slides>section>section:not([data-transition]).past{transform:translate(0,-150%)}.reveal .slides>section>section[data-transition=linear].future,.reveal .slides>section>section[data-transition~=linear-in].future,.reveal.linear .slides>section>section:not([data-transition]).future{transform:translate(0,150%)}.reveal .slides section[data-transition=default].stack,.reveal.default .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=default].past,.reveal .slides>section[data-transition~=default-out].past,.reveal.default .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=default].future,.reveal .slides>section[data-transition~=default-in].future,.reveal.default .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=default].past,.reveal .slides>section>section[data-transition~=default-out].past,.reveal.default .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=default].future,.reveal .slides>section>section[data-transition~=default-in].future,.reveal.default .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=convex].stack,.reveal.convex .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=convex].past,.reveal .slides>section[data-transition~=convex-out].past,.reveal.convex .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=convex].future,.reveal .slides>section[data-transition~=convex-in].future,.reveal.convex .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=convex].past,.reveal .slides>section>section[data-transition~=convex-out].past,.reveal.convex .slides>section>section:not([data-transition]).past{transform:translate3d(0,-300px,0) rotateX(70deg) translate3d(0,-300px,0)}.reveal .slides>section>section[data-transition=convex].future,.reveal .slides>section>section[data-transition~=convex-in].future,.reveal.convex .slides>section>section:not([data-transition]).future{transform:translate3d(0,300px,0) rotateX(-70deg) translate3d(0,300px,0)}.reveal .slides section[data-transition=concave].stack,.reveal.concave .slides section.stack{transform-style:preserve-3d}.reveal .slides>section[data-transition=concave].past,.reveal .slides>section[data-transition~=concave-out].past,.reveal.concave .slides>section:not([data-transition]).past{transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal .slides>section[data-transition=concave].future,.reveal .slides>section[data-transition~=concave-in].future,.reveal.concave .slides>section:not([data-transition]).future{transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal .slides>section>section[data-transition=concave].past,.reveal .slides>section>section[data-transition~=concave-out].past,.reveal.concave .slides>section>section:not([data-transition]).past{transform:translate3d(0,-80%,0) rotateX(-70deg) translate3d(0,-80%,0)}.reveal .slides>section>section[data-transition=concave].future,.reveal .slides>section>section[data-transition~=concave-in].future,.reveal.concave .slides>section>section:not([data-transition]).future{transform:translate3d(0,80%,0) rotateX(70deg) translate3d(0,80%,0)}.reveal .slides section[data-transition=zoom],.reveal.zoom .slides section:not([data-transition]){transition-timing-function:ease}.reveal .slides>section[data-transition=zoom].past,.reveal .slides>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section:not([data-transition]).past{visibility:hidden;transform:scale(16)}.reveal .slides>section[data-transition=zoom].future,.reveal .slides>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section:not([data-transition]).future{visibility:hidden;transform:scale(.2)}.reveal .slides>section>section[data-transition=zoom].past,.reveal .slides>section>section[data-transition~=zoom-out].past,.reveal.zoom .slides>section>section:not([data-transition]).past{transform:scale(16)}.reveal .slides>section>section[data-transition=zoom].future,.reveal .slides>section>section[data-transition~=zoom-in].future,.reveal.zoom .slides>section>section:not([data-transition]).future{transform:scale(.2)}.reveal.cube .slides{perspective:1300px}.reveal.cube .slides section{padding:30px;min-height:700px;-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box;transform-style:preserve-3d}.reveal.center.cube .slides section{min-height:0}.reveal.cube .slides section:not(.stack):before{content:"";position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);border-radius:4px;transform:translateZ(-20px)}.reveal.cube .slides section:not(.stack):after{content:"";position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);transform:translateZ(-90px) rotateX(65deg)}.reveal.cube .slides>section.stack{padding:0;background:0 0}.reveal.cube .slides>section.past{transform-origin:100% 0;transform:translate3d(-100%,0,0) rotateY(-90deg)}.reveal.cube .slides>section.future{transform-origin:0 0;transform:translate3d(100%,0,0) rotateY(90deg)}.reveal.cube .slides>section>section.past{transform-origin:0 100%;transform:translate3d(0,-100%,0) rotateX(90deg)}.reveal.cube .slides>section>section.future{transform-origin:0 0;transform:translate3d(0,100%,0) rotateX(-90deg)}.reveal.page .slides{perspective-origin:0 50%;perspective:3000px}.reveal.page .slides section{padding:30px;min-height:700px;box-sizing:border-box;transform-style:preserve-3d}.reveal.page .slides section.past{z-index:12}.reveal.page .slides section:not(.stack):before{content:"";position:absolute;display:block;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,.1);transform:translateZ(-20px)}.reveal.page .slides section:not(.stack):after{content:"";position:absolute;display:block;width:90%;height:30px;left:5%;bottom:0;background:0 0;z-index:1;border-radius:4px;box-shadow:0 95px 25px rgba(0,0,0,.2);-webkit-transform:translateZ(-90px) rotateX(65deg)}.reveal.page .slides>section.stack{padding:0;background:0 0}.reveal.page .slides>section.past{transform-origin:0 0;transform:translate3d(-40%,0,0) rotateY(-80deg)}.reveal.page .slides>section.future{transform-origin:100% 0;transform:translate3d(0,0,0)}.reveal.page .slides>section>section.past{transform-origin:0 0;transform:translate3d(0,-40%,0) rotateX(80deg)}.reveal.page .slides>section>section.future{transform-origin:0 100%;transform:translate3d(0,0,0)}.reveal .slides section[data-transition=fade],.reveal.fade .slides section:not([data-transition]),.reveal.fade .slides>section>section:not([data-transition]){transform:none;transition:opacity .5s}.reveal.fade.overview .slides section,.reveal.fade.overview .slides>section>section{transition:none}.reveal .slides section[data-transition=none],.reveal.none .slides section:not([data-transition]){transform:none;transition:none}.reveal .pause-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:#000;visibility:hidden;opacity:0;z-index:100;transition:all 1s ease}.reveal .pause-overlay .resume-button{position:absolute;bottom:20px;right:20px;color:#ccc;border-radius:2px;padding:6px 14px;border:2px solid #ccc;font-size:16px;background:0 0;cursor:pointer}.reveal .pause-overlay .resume-button:hover{color:#fff;border-color:#fff}.reveal.paused .pause-overlay{visibility:visible;opacity:1}.reveal .no-transition,.reveal .no-transition *,.reveal .slides.disable-slide-transitions section{transition:none!important}.reveal .slides.disable-slide-transitions section{transform:none!important}.reveal .backgrounds{position:absolute;width:100%;height:100%;top:0;left:0;perspective:600px}.reveal .slide-background{display:none;position:absolute;width:100%;height:100%;opacity:0;visibility:hidden;overflow:hidden;background-color:rgba(0,0,0,0);transition:all .8s cubic-bezier(.26,.86,.44,.985)}.reveal .slide-background-content{position:absolute;width:100%;height:100%;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.reveal .slide-background.stack{display:block}.reveal .slide-background.present{opacity:1;visibility:visible;z-index:2}.print-pdf .reveal .slide-background{opacity:1!important;visibility:visible!important}.reveal .slide-background video{position:absolute;width:100%;height:100%;max-width:none;max-height:none;top:0;left:0;-o-object-fit:cover;object-fit:cover}.reveal .slide-background[data-background-size=contain] video{-o-object-fit:contain;object-fit:contain}.reveal>.backgrounds .slide-background[data-background-transition=none],.reveal[data-background-transition=none]>.backgrounds .slide-background:not([data-background-transition]){transition:none}.reveal>.backgrounds .slide-background[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background:not([data-background-transition]){opacity:1}.reveal>.backgrounds .slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.past:not([data-background-transition]){transform:translate(-100%,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background.future:not([data-background-transition]){transform:translate(100%,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){transform:translate(0,-100%)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide],.reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){transform:translate(0,100%)}.reveal>.backgrounds .slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(-100%,0,0) rotateY(-90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(100%,0,0) rotateY(90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(0,-100%,0) rotateX(90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex],.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(0,100%,0) rotateX(-90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(-100%,0,0) rotateY(90deg) translate3d(-100%,0,0)}.reveal>.backgrounds .slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(100%,0,0) rotateY(-90deg) translate3d(100%,0,0)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;transform:translate3d(0,-100%,0) rotateX(-90deg) translate3d(0,-100%,0)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave],.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;transform:translate3d(0,100%,0) rotateX(90deg) translate3d(0,100%,0)}.reveal>.backgrounds .slide-background[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background:not([data-background-transition]){transition-timing-function:ease}.reveal>.backgrounds .slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(16)}.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom],.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future:not([data-background-transition]){opacity:0;visibility:hidden;transform:scale(.2)}.reveal[data-transition-speed=fast]>.backgrounds .slide-background{transition-duration:.4s}.reveal[data-transition-speed=slow]>.backgrounds .slide-background{transition-duration:1.2s}.reveal [data-auto-animate-target^=unmatched]{will-change:opacity}.reveal section[data-auto-animate]:not(.stack):not([data-auto-animate=running]) [data-auto-animate-target^=unmatched]{opacity:0}.reveal.overview{perspective-origin:50% 50%;perspective:700px}.reveal.overview .slides{-moz-transform-style:preserve-3d}.reveal.overview .slides section{height:100%;top:0!important;opacity:1!important;overflow:hidden;visibility:visible!important;cursor:pointer;box-sizing:border-box}.reveal.overview .slides section.present,.reveal.overview .slides section:hover{outline:10px solid rgba(150,150,150,.4);outline-offset:10px}.reveal.overview .slides section .fragment{opacity:1;transition:none}.reveal.overview .slides section:after,.reveal.overview .slides section:before{display:none!important}.reveal.overview .slides>section.stack{padding:0;top:0!important;background:0 0;outline:0;overflow:visible}.reveal.overview .backgrounds{perspective:inherit;-moz-transform-style:preserve-3d}.reveal.overview .backgrounds .slide-background{opacity:1;visibility:visible;outline:10px solid rgba(150,150,150,.1);outline-offset:10px}.reveal.overview .backgrounds .slide-background.stack{overflow:visible}.reveal.overview .slides section,.reveal.overview-deactivating .slides section{transition:none}.reveal.overview .backgrounds .slide-background,.reveal.overview-deactivating .backgrounds .slide-background{transition:none}.reveal.rtl .slides,.reveal.rtl .slides h1,.reveal.rtl .slides h2,.reveal.rtl .slides h3,.reveal.rtl .slides h4,.reveal.rtl .slides h5,.reveal.rtl .slides h6{direction:rtl;font-family:sans-serif}.reveal.rtl code,.reveal.rtl pre{direction:ltr}.reveal.rtl ol,.reveal.rtl ul{text-align:right}.reveal.rtl .progress span{transform-origin:100% 0}.reveal.has-parallax-background .backgrounds{transition:all .8s ease}.reveal.has-parallax-background[data-transition-speed=fast] .backgrounds{transition-duration:.4s}.reveal.has-parallax-background[data-transition-speed=slow] .backgrounds{transition-duration:1.2s}.reveal>.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:1000;background:rgba(0,0,0,.9);transition:all .3s ease}.reveal>.overlay .spinner{position:absolute;display:block;top:50%;left:50%;width:32px;height:32px;margin:-16px 0 0 -16px;z-index:10;background-image:url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D);visibility:visible;opacity:.6;transition:all .3s ease}.reveal>.overlay header{position:absolute;left:0;top:0;width:100%;padding:5px;z-index:2;box-sizing:border-box}.reveal>.overlay header a{display:inline-block;width:40px;height:40px;line-height:36px;padding:0 10px;float:right;opacity:.6;box-sizing:border-box}.reveal>.overlay header a:hover{opacity:1}.reveal>.overlay header a .icon{display:inline-block;width:20px;height:20px;background-position:50% 50%;background-size:100%;background-repeat:no-repeat}.reveal>.overlay header a.close .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC)}.reveal>.overlay header a.external .icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==)}.reveal>.overlay .viewport{position:absolute;display:flex;top:50px;right:0;bottom:0;left:0}.reveal>.overlay.overlay-preview .viewport iframe{width:100%;height:100%;max-width:100%;max-height:100%;border:0;opacity:0;visibility:hidden;transition:all .3s ease}.reveal>.overlay.overlay-preview.loaded .viewport iframe{opacity:1;visibility:visible}.reveal>.overlay.overlay-preview.loaded .viewport-inner{position:absolute;z-index:-1;left:0;top:45%;width:100%;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-preview .x-frame-error{opacity:0;transition:opacity .3s ease .3s}.reveal>.overlay.overlay-preview.loaded .x-frame-error{opacity:1}.reveal>.overlay.overlay-preview.loaded .spinner{opacity:0;visibility:hidden;transform:scale(.2)}.reveal>.overlay.overlay-help .viewport{overflow:auto;color:#fff}.reveal>.overlay.overlay-help .viewport .viewport-inner{width:600px;margin:auto;padding:20px 20px 80px 20px;text-align:center;letter-spacing:normal}.reveal>.overlay.overlay-help .viewport .viewport-inner .title{font-size:20px}.reveal>.overlay.overlay-help .viewport .viewport-inner table{border:1px solid #fff;border-collapse:collapse;font-size:16px}.reveal>.overlay.overlay-help .viewport .viewport-inner table td,.reveal>.overlay.overlay-help .viewport .viewport-inner table th{width:200px;padding:14px;border:1px solid #fff;vertical-align:middle}.reveal>.overlay.overlay-help .viewport .viewport-inner table th{padding-top:20px;padding-bottom:20px}.reveal .playback{position:absolute;left:15px;bottom:20px;z-index:30;cursor:pointer;transition:all .4s ease;-webkit-tap-highlight-color:transparent}.reveal.overview .playback{opacity:0;visibility:hidden}.reveal .hljs{min-height:100%}.reveal .hljs table{margin:initial}.reveal .hljs-ln-code,.reveal .hljs-ln-numbers{padding:0;border:0}.reveal .hljs-ln-numbers{opacity:.6;padding-right:.75em;text-align:right;vertical-align:top}.reveal .hljs.has-highlights tr:not(.highlight-line){opacity:.4}.reveal .hljs:not(:first-child).fragment{position:absolute;top:0;left:0;width:100%;box-sizing:border-box}.reveal pre[data-auto-animate-target]{overflow:hidden}.reveal pre[data-auto-animate-target] code{height:100%}.reveal .roll{display:inline-block;line-height:1.2;overflow:hidden;vertical-align:top;perspective:400px;perspective-origin:50% 50%}.reveal .roll:hover{background:0 0;text-shadow:none}.reveal .roll span{display:block;position:relative;padding:0 2px;pointer-events:none;transition:all .4s ease;transform-origin:50% 0;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}.reveal .roll:hover span{background:rgba(0,0,0,.5);transform:translate3d(0,0,-45px) rotateX(90deg)}.reveal .roll span:after{content:attr(data-title);display:block;position:absolute;left:0;top:0;padding:0 2px;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform-origin:50% 0;transform:translate3d(0,110%,0) rotateX(-90deg)}.reveal aside.notes{display:none}.reveal .speaker-notes{display:none;position:absolute;width:33.3333333333%;height:100%;top:0;left:100%;padding:14px 18px 14px 18px;z-index:1;font-size:18px;line-height:1.4;border:1px solid rgba(0,0,0,.05);color:#222;background-color:#f5f5f5;overflow:auto;box-sizing:border-box;text-align:left;font-family:Helvetica,sans-serif;-webkit-overflow-scrolling:touch}.reveal .speaker-notes .notes-placeholder{color:#ccc;font-style:italic}.reveal .speaker-notes:focus{outline:0}.reveal .speaker-notes:before{content:"Speaker notes";display:block;margin-bottom:10px;opacity:.5}.reveal.show-notes{max-width:75%;overflow:visible}.reveal.show-notes .speaker-notes{display:block}@media screen and (min-width:1600px){.reveal .speaker-notes{font-size:20px}}@media screen and (max-width:1024px){.reveal.show-notes{border-left:0;max-width:none;max-height:70%;max-height:70vh;overflow:visible}.reveal.show-notes .speaker-notes{top:100%;left:0;width:100%;height:30vh;border:0}}@media screen and (max-width:600px){.reveal.show-notes{max-height:60%;max-height:60vh}.reveal.show-notes .speaker-notes{top:100%;height:40vh}.reveal .speaker-notes{font-size:14px}}.zoomed .reveal *,.zoomed .reveal :after,.zoomed .reveal :before{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.zoomed .reveal .controls,.zoomed .reveal .progress{opacity:0}.zoomed .reveal .roll span{background:0 0}.zoomed .reveal .roll span:after{visibility:hidden}html.print-pdf *{-webkit-print-color-adjust:exact}html.print-pdf{width:100%;height:100%;overflow:visible}html.print-pdf body{margin:0 auto!important;border:0;padding:0;float:none!important;overflow:visible}html.print-pdf .nestedarrow,html.print-pdf .reveal .controls,html.print-pdf .reveal .playback,html.print-pdf .reveal .progress,html.print-pdf .reveal.overview,html.print-pdf .state-background{display:none!important}html.print-pdf .reveal pre code{overflow:hidden!important;font-family:Courier,"Courier New",monospace!important}html.print-pdf .reveal{width:auto!important;height:auto!important;overflow:hidden!important}html.print-pdf .reveal .slides{position:static;width:100%!important;height:auto!important;zoom:1!important;pointer-events:initial;left:auto;top:auto;margin:0!important;padding:0!important;overflow:visible;display:block;perspective:none;perspective-origin:50% 50%}html.print-pdf .reveal .slides .pdf-page{position:relative;overflow:hidden;z-index:1;page-break-after:always}html.print-pdf .reveal .slides section{visibility:visible!important;display:block!important;position:absolute!important;margin:0!important;padding:0!important;box-sizing:border-box!important;min-height:1px;opacity:1!important;transform-style:flat!important;transform:none!important}html.print-pdf .reveal section.stack{position:relative!important;margin:0!important;padding:0!important;page-break-after:avoid!important;height:auto!important;min-height:auto!important}html.print-pdf .reveal img{box-shadow:none}html.print-pdf .reveal .backgrounds{display:none}html.print-pdf .reveal .slide-background{display:block!important;position:absolute;top:0;left:0;width:100%;height:100%;z-index:auto!important}html.print-pdf .reveal.show-notes{max-width:none;max-height:none}html.print-pdf .reveal .speaker-notes-pdf{display:block;width:100%;height:auto;max-height:none;top:auto;right:auto;bottom:auto;left:auto;z-index:100}html.print-pdf .reveal .speaker-notes-pdf[data-layout=separate-page]{position:relative;color:inherit;background-color:transparent;padding:20px;page-break-after:always;border:0}html.print-pdf .reveal .slide-number-pdf{display:block;position:absolute;font-size:14px}html.print-pdf .aria-status{display:none}@media print{html:not(.print-pdf){background:#fff;width:auto;height:auto;overflow:visible}html:not(.print-pdf) body{background:#fff;font-size:20pt;width:auto;height:auto;border:0;margin:0 5%;padding:0;overflow:visible;float:none!important}html:not(.print-pdf) .controls,html:not(.print-pdf) .fork-reveal,html:not(.print-pdf) .nestedarrow,html:not(.print-pdf) .reveal .backgrounds,html:not(.print-pdf) .reveal .progress,html:not(.print-pdf) .reveal .slide-number,html:not(.print-pdf) .share-reveal,html:not(.print-pdf) .state-background{display:none!important}html:not(.print-pdf) body,html:not(.print-pdf) li,html:not(.print-pdf) p,html:not(.print-pdf) td{font-size:20pt!important;color:#000}html:not(.print-pdf) h1,html:not(.print-pdf) h2,html:not(.print-pdf) h3,html:not(.print-pdf) h4,html:not(.print-pdf) h5,html:not(.print-pdf) h6{color:#000!important;height:auto;line-height:normal;text-align:left;letter-spacing:normal}html:not(.print-pdf) h1{font-size:28pt!important}html:not(.print-pdf) h2{font-size:24pt!important}html:not(.print-pdf) h3{font-size:22pt!important}html:not(.print-pdf) h4{font-size:22pt!important;font-variant:small-caps}html:not(.print-pdf) h5{font-size:21pt!important}html:not(.print-pdf) h6{font-size:20pt!important;font-style:italic}html:not(.print-pdf) a:link,html:not(.print-pdf) a:visited{color:#000!important;font-weight:700;text-decoration:underline}html:not(.print-pdf) div,html:not(.print-pdf) ol,html:not(.print-pdf) p,html:not(.print-pdf) ul{visibility:visible;position:static;width:auto;height:auto;display:block;overflow:visible;margin:0;text-align:left!important}html:not(.print-pdf) .reveal pre,html:not(.print-pdf) .reveal table{margin-left:0;margin-right:0}html:not(.print-pdf) .reveal pre code{padding:20px}html:not(.print-pdf) .reveal blockquote{margin:20px 0}html:not(.print-pdf) .reveal .slides{position:static!important;width:auto!important;height:auto!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:0!important;zoom:1!important;transform:none!important;overflow:visible!important;display:block!important;text-align:left!important;perspective:none;perspective-origin:50% 50%}html:not(.print-pdf) .reveal .slides section{visibility:visible!important;position:static!important;width:auto!important;height:auto!important;display:block!important;overflow:visible!important;left:0!important;top:0!important;margin-left:0!important;margin-top:0!important;padding:60px 20px!important;z-index:auto!important;opacity:1!important;page-break-after:always!important;transform-style:flat!important;transform:none!important;transition:none!important}html:not(.print-pdf) .reveal .slides section.stack{padding:0!important}html:not(.print-pdf) .reveal section:last-of-type{page-break-after:avoid!important}html:not(.print-pdf) .reveal section .fragment{opacity:1!important;visibility:visible!important;transform:none!important}html:not(.print-pdf) .reveal section img{display:block;margin:15px 0;background:#fff;border:1px solid #666;box-shadow:none}html:not(.print-pdf) .reveal section small{font-size:.8em}html:not(.print-pdf) .reveal .hljs{max-height:100%;white-space:pre-wrap;word-wrap:break-word;word-break:break-word;font-size:15pt}html:not(.print-pdf) .reveal .hljs .hljs-ln-numbers{white-space:nowrap}html:not(.print-pdf) .reveal .hljs td{font-size:inherit!important;color:inherit!important}} \ No newline at end of file diff --git a/instructors/2-vector-slides_files/libs/revealjs/dist/reveal.esm.js b/instructors/2-vector-slides_files/libs/revealjs/dist/reveal.esm.js new file mode 100644 index 00000000..f18da895 --- /dev/null +++ b/instructors/2-vector-slides_files/libs/revealjs/dist/reveal.esm.js @@ -0,0 +1,9 @@ +/*! +* reveal.js 4.3.1 +* https://revealjs.com +* MIT licensed +* +* Copyright (C) 2011-2022 Hakim El Hattab, https://hakim.se +*/ +const e=(e,t)=>{for(let i in t)e[i]=t[i];return e},t=(e,t)=>Array.from(e.querySelectorAll(t)),i=(e,t,i)=>{i?e.classList.add(t):e.classList.remove(t)},s=e=>{if("string"==typeof e){if("null"===e)return null;if("true"===e)return!0;if("false"===e)return!1;if(e.match(/^-?[\d\.]+$/))return parseFloat(e)}return e},a=(e,t)=>{e.style.transform=t},n=(e,t)=>{let i=e.matches||e.matchesSelector||e.msMatchesSelector;return!(!i||!i.call(e,t))},r=(e,t)=>{if("function"==typeof e.closest)return e.closest(t);for(;e;){if(n(e,t))return e;e=e.parentNode}return null},o=(e,t,i,s="")=>{let a=e.querySelectorAll("."+i);for(let t=0;t{let t=document.createElement("style");return t.type="text/css",e&&e.length>0&&(t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e))),document.head.appendChild(t),t},d=()=>{let e={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,(t=>{e[t.split("=").shift()]=t.split("=").pop()}));for(let t in e){let i=e[t];e[t]=s(unescape(i))}return void 0!==e.dependencies&&delete e.dependencies,e},c=(e,t=0)=>{if(e){let i,s=e.style.height;return e.style.height="0px",e.parentNode.style.height="auto",i=t-e.parentNode.offsetHeight,e.style.height=s+"px",e.parentNode.style.removeProperty("height"),i}return t},h={mp4:"video/mp4",m4a:"video/mp4",ogv:"video/ogg",mpeg:"video/mpeg",webm:"video/webm"},u=navigator.userAgent,g=/(iphone|ipod|ipad|android)/gi.test(u)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1;/chrome/i.test(u)&&/edge/i.test(u);const v=/android/gi.test(u);var p={};Object.defineProperty(p,"__esModule",{value:!0});var m=Object.assign||function(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:{};return"string"==typeof e?x(t(document.querySelectorAll(e)),i):x([e],i)[0]}}("undefined"==typeof window?null:window);class b{constructor(e){this.Reveal=e,this.startEmbeddedIframe=this.startEmbeddedIframe.bind(this)}shouldPreload(e){let t=this.Reveal.getConfig().preloadIframes;return"boolean"!=typeof t&&(t=e.hasAttribute("data-preload")),t}load(e,i={}){e.style.display=this.Reveal.getConfig().display,t(e,"img[data-src], video[data-src], audio[data-src], iframe[data-src]").forEach((e=>{("IFRAME"!==e.tagName||this.shouldPreload(e))&&(e.setAttribute("src",e.getAttribute("data-src")),e.setAttribute("data-lazy-loaded",""),e.removeAttribute("data-src"))})),t(e,"video, audio").forEach((e=>{let i=0;t(e,"source[data-src]").forEach((e=>{e.setAttribute("src",e.getAttribute("data-src")),e.removeAttribute("data-src"),e.setAttribute("data-lazy-loaded",""),i+=1})),g&&"VIDEO"===e.tagName&&e.setAttribute("playsinline",""),i>0&&e.load()}));let s=e.slideBackgroundElement;if(s){s.style.display="block";let t=e.slideBackgroundContentElement,a=e.getAttribute("data-background-iframe");if(!1===s.hasAttribute("data-loaded")){s.setAttribute("data-loaded","true");let n=e.getAttribute("data-background-image"),r=e.getAttribute("data-background-video"),o=e.hasAttribute("data-background-video-loop"),l=e.hasAttribute("data-background-video-muted");if(n)/^data:/.test(n.trim())?t.style.backgroundImage=`url(${n.trim()})`:t.style.backgroundImage=n.split(",").map((e=>`url(${encodeURI(e.trim())})`)).join(",");else if(r&&!this.Reveal.isSpeakerNotes()){let e=document.createElement("video");o&&e.setAttribute("loop",""),l&&(e.muted=!0),g&&(e.muted=!0,e.setAttribute("playsinline","")),r.split(",").forEach((t=>{let i=((e="")=>h[e.split(".").pop()])(t);e.innerHTML+=i?``:``})),t.appendChild(e)}else if(a&&!0!==i.excludeIframes){let e=document.createElement("iframe");e.setAttribute("allowfullscreen",""),e.setAttribute("mozallowfullscreen",""),e.setAttribute("webkitallowfullscreen",""),e.setAttribute("allow","autoplay"),e.setAttribute("data-src",a),e.style.width="100%",e.style.height="100%",e.style.maxHeight="100%",e.style.maxWidth="100%",t.appendChild(e)}}let n=t.querySelector("iframe[data-src]");n&&this.shouldPreload(s)&&!/autoplay=(1|true|yes)/gi.test(a)&&n.getAttribute("src")!==a&&n.setAttribute("src",a)}this.layout(e)}layout(e){Array.from(e.querySelectorAll(".r-fit-text")).forEach((e=>{f(e,{minSize:24,maxSize:.8*this.Reveal.getConfig().height,observeMutations:!1,observeWindow:!1})}))}unload(e){e.style.display="none";let i=this.Reveal.getSlideBackground(e);i&&(i.style.display="none",t(i,"iframe[src]").forEach((e=>{e.removeAttribute("src")}))),t(e,"video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]").forEach((e=>{e.setAttribute("data-src",e.getAttribute("src")),e.removeAttribute("src")})),t(e,"video[data-lazy-loaded] source[src], audio source[src]").forEach((e=>{e.setAttribute("data-src",e.getAttribute("src")),e.removeAttribute("src")}))}formatEmbeddedContent(){let e=(e,i,s)=>{t(this.Reveal.getSlidesElement(),"iframe["+e+'*="'+i+'"]').forEach((t=>{let i=t.getAttribute(e);i&&-1===i.indexOf(s)&&t.setAttribute(e,i+(/\?/.test(i)?"&":"?")+s)}))};e("src","youtube.com/embed/","enablejsapi=1"),e("data-src","youtube.com/embed/","enablejsapi=1"),e("src","player.vimeo.com/","api=1"),e("data-src","player.vimeo.com/","api=1")}startEmbeddedContent(e){e&&!this.Reveal.isSpeakerNotes()&&(t(e,'img[src$=".gif"]').forEach((e=>{e.setAttribute("src",e.getAttribute("src"))})),t(e,"video, audio").forEach((e=>{if(r(e,".fragment")&&!r(e,".fragment.visible"))return;let t=this.Reveal.getConfig().autoPlayMedia;if("boolean"!=typeof t&&(t=e.hasAttribute("data-autoplay")||!!r(e,".slide-background")),t&&"function"==typeof e.play)if(e.readyState>1)this.startEmbeddedMedia({target:e});else if(g){let t=e.play();t&&"function"==typeof t.catch&&!1===e.controls&&t.catch((()=>{e.controls=!0,e.addEventListener("play",(()=>{e.controls=!1}))}))}else e.removeEventListener("loadeddata",this.startEmbeddedMedia),e.addEventListener("loadeddata",this.startEmbeddedMedia)})),t(e,"iframe[src]").forEach((e=>{r(e,".fragment")&&!r(e,".fragment.visible")||this.startEmbeddedIframe({target:e})})),t(e,"iframe[data-src]").forEach((e=>{r(e,".fragment")&&!r(e,".fragment.visible")||e.getAttribute("src")!==e.getAttribute("data-src")&&(e.removeEventListener("load",this.startEmbeddedIframe),e.addEventListener("load",this.startEmbeddedIframe),e.setAttribute("src",e.getAttribute("data-src")))})))}startEmbeddedMedia(e){let t=!!r(e.target,"html"),i=!!r(e.target,".present");t&&i&&(e.target.currentTime=0,e.target.play()),e.target.removeEventListener("loadeddata",this.startEmbeddedMedia)}startEmbeddedIframe(e){let t=e.target;if(t&&t.contentWindow){let i=!!r(e.target,"html"),s=!!r(e.target,".present");if(i&&s){let e=this.Reveal.getConfig().autoPlayMedia;"boolean"!=typeof e&&(e=t.hasAttribute("data-autoplay")||!!r(t,".slide-background")),/youtube\.com\/embed\//.test(t.getAttribute("src"))&&e?t.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*"):/player\.vimeo\.com\//.test(t.getAttribute("src"))&&e?t.contentWindow.postMessage('{"method":"play"}',"*"):t.contentWindow.postMessage("slide:start","*")}}}stopEmbeddedContent(i,s={}){s=e({unloadIframes:!0},s),i&&i.parentNode&&(t(i,"video, audio").forEach((e=>{e.hasAttribute("data-ignore")||"function"!=typeof e.pause||(e.setAttribute("data-paused-by-reveal",""),e.pause())})),t(i,"iframe").forEach((e=>{e.contentWindow&&e.contentWindow.postMessage("slide:stop","*"),e.removeEventListener("load",this.startEmbeddedIframe)})),t(i,'iframe[src*="youtube.com/embed/"]').forEach((e=>{!e.hasAttribute("data-ignore")&&e.contentWindow&&"function"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")})),t(i,'iframe[src*="player.vimeo.com/"]').forEach((e=>{!e.hasAttribute("data-ignore")&&e.contentWindow&&"function"==typeof e.contentWindow.postMessage&&e.contentWindow.postMessage('{"method":"pause"}',"*")})),!0===s.unloadIframes&&t(i,"iframe[data-src]").forEach((e=>{e.setAttribute("src","about:blank"),e.removeAttribute("src")})))}}class y{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="slide-number",this.Reveal.getRevealElement().appendChild(this.element)}configure(e,t){let i="none";e.slideNumber&&!this.Reveal.isPrintingPDF()&&("all"===e.showSlideNumber||"speaker"===e.showSlideNumber&&this.Reveal.isSpeakerNotes())&&(i="block"),this.element.style.display=i}update(){this.Reveal.getConfig().slideNumber&&this.element&&(this.element.innerHTML=this.getSlideNumber())}getSlideNumber(e=this.Reveal.getCurrentSlide()){let t,i=this.Reveal.getConfig(),s="h.v";if("function"==typeof i.slideNumber)t=i.slideNumber(e);else{"string"==typeof i.slideNumber&&(s=i.slideNumber),/c/.test(s)||1!==this.Reveal.getHorizontalSlides().length||(s="c");let a=e&&"uncounted"===e.dataset.visibility?0:1;switch(t=[],s){case"c":t.push(this.Reveal.getSlidePastCount(e)+a);break;case"c/t":t.push(this.Reveal.getSlidePastCount(e)+a,"/",this.Reveal.getTotalSlides());break;default:let i=this.Reveal.getIndices(e);t.push(i.h+a);let n="h/v"===s?"/":".";this.Reveal.isVerticalSlide(e)&&t.push(n,i.v+1)}}let a="#"+this.Reveal.location.getHash(e);return this.formatNumber(t[0],t[1],t[2],a)}formatNumber(e,t,i,s="#"+this.Reveal.location.getHash()){return"number"!=typeof i||isNaN(i)?`\n\t\t\t\t\t${e}\n\t\t\t\t\t`:`\n\t\t\t\t\t${e}\n\t\t\t\t\t${t}\n\t\t\t\t\t${i}\n\t\t\t\t\t`}destroy(){this.element.remove()}}const w=e=>{let t=e.match(/^#([0-9a-f]{3})$/i);if(t&&t[1])return t=t[1],{r:17*parseInt(t.charAt(0),16),g:17*parseInt(t.charAt(1),16),b:17*parseInt(t.charAt(2),16)};let i=e.match(/^#([0-9a-f]{6})$/i);if(i&&i[1])return i=i[1],{r:parseInt(i.slice(0,2),16),g:parseInt(i.slice(2,4),16),b:parseInt(i.slice(4,6),16)};let s=e.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);if(s)return{r:parseInt(s[1],10),g:parseInt(s[2],10),b:parseInt(s[3],10)};let a=e.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i);return a?{r:parseInt(a[1],10),g:parseInt(a[2],10),b:parseInt(a[3],10),a:parseFloat(a[4])}:null};class E{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="backgrounds",this.Reveal.getRevealElement().appendChild(this.element)}create(){this.element.innerHTML="",this.element.classList.add("no-transition"),this.Reveal.getHorizontalSlides().forEach((e=>{let i=this.createBackground(e,this.element);t(e,"section").forEach((e=>{this.createBackground(e,i),i.classList.add("stack")}))})),this.Reveal.getConfig().parallaxBackgroundImage?(this.element.style.backgroundImage='url("'+this.Reveal.getConfig().parallaxBackgroundImage+'")',this.element.style.backgroundSize=this.Reveal.getConfig().parallaxBackgroundSize,this.element.style.backgroundRepeat=this.Reveal.getConfig().parallaxBackgroundRepeat,this.element.style.backgroundPosition=this.Reveal.getConfig().parallaxBackgroundPosition,setTimeout((()=>{this.Reveal.getRevealElement().classList.add("has-parallax-background")}),1)):(this.element.style.backgroundImage="",this.Reveal.getRevealElement().classList.remove("has-parallax-background"))}createBackground(e,t){let i=document.createElement("div");i.className="slide-background "+e.className.replace(/present|past|future/,"");let s=document.createElement("div");return s.className="slide-background-content",i.appendChild(s),t.appendChild(i),e.slideBackgroundElement=i,e.slideBackgroundContentElement=s,this.sync(e),i}sync(e){const t=e.slideBackgroundElement,i=e.slideBackgroundContentElement,s={background:e.getAttribute("data-background"),backgroundSize:e.getAttribute("data-background-size"),backgroundImage:e.getAttribute("data-background-image"),backgroundVideo:e.getAttribute("data-background-video"),backgroundIframe:e.getAttribute("data-background-iframe"),backgroundColor:e.getAttribute("data-background-color"),backgroundRepeat:e.getAttribute("data-background-repeat"),backgroundPosition:e.getAttribute("data-background-position"),backgroundTransition:e.getAttribute("data-background-transition"),backgroundOpacity:e.getAttribute("data-background-opacity")},a=e.hasAttribute("data-preload");e.classList.remove("has-dark-background"),e.classList.remove("has-light-background"),t.removeAttribute("data-loaded"),t.removeAttribute("data-background-hash"),t.removeAttribute("data-background-size"),t.removeAttribute("data-background-transition"),t.style.backgroundColor="",i.style.backgroundSize="",i.style.backgroundRepeat="",i.style.backgroundPosition="",i.style.backgroundImage="",i.style.opacity="",i.innerHTML="",s.background&&(/^(http|file|\/\/)/gi.test(s.background)||/\.(svg|png|jpg|jpeg|gif|bmp)([?#\s]|$)/gi.test(s.background)?e.setAttribute("data-background-image",s.background):t.style.background=s.background),(s.background||s.backgroundColor||s.backgroundImage||s.backgroundVideo||s.backgroundIframe)&&t.setAttribute("data-background-hash",s.background+s.backgroundSize+s.backgroundImage+s.backgroundVideo+s.backgroundIframe+s.backgroundColor+s.backgroundRepeat+s.backgroundPosition+s.backgroundTransition+s.backgroundOpacity),s.backgroundSize&&t.setAttribute("data-background-size",s.backgroundSize),s.backgroundColor&&(t.style.backgroundColor=s.backgroundColor),s.backgroundTransition&&t.setAttribute("data-background-transition",s.backgroundTransition),a&&t.setAttribute("data-preload",""),s.backgroundSize&&(i.style.backgroundSize=s.backgroundSize),s.backgroundRepeat&&(i.style.backgroundRepeat=s.backgroundRepeat),s.backgroundPosition&&(i.style.backgroundPosition=s.backgroundPosition),s.backgroundOpacity&&(i.style.opacity=s.backgroundOpacity);let n=s.backgroundColor;if(!n||!w(n)){let e=window.getComputedStyle(t);e&&e.backgroundColor&&(n=e.backgroundColor)}if(n){const t=w(n);t&&0!==t.a&&("string"==typeof(r=n)&&(r=w(r)),(r?(299*r.r+587*r.g+114*r.b)/1e3:null)<128?e.classList.add("has-dark-background"):e.classList.add("has-light-background"))}var r}update(e=!1){let i=this.Reveal.getCurrentSlide(),s=this.Reveal.getIndices(),a=null,n=this.Reveal.getConfig().rtl?"future":"past",r=this.Reveal.getConfig().rtl?"past":"future";if(Array.from(this.element.childNodes).forEach(((i,o)=>{i.classList.remove("past","present","future"),os.h?i.classList.add(r):(i.classList.add("present"),a=i),(e||o===s.h)&&t(i,".slide-background").forEach(((e,t)=>{e.classList.remove("past","present","future"),ts.v?e.classList.add("future"):(e.classList.add("present"),o===s.h&&(a=e))}))})),this.previousBackground&&this.Reveal.slideContent.stopEmbeddedContent(this.previousBackground,{unloadIframes:!this.Reveal.slideContent.shouldPreload(this.previousBackground)}),a){this.Reveal.slideContent.startEmbeddedContent(a);let e=a.querySelector(".slide-background-content");if(e){let t=e.style.backgroundImage||"";/\.gif/i.test(t)&&(e.style.backgroundImage="",window.getComputedStyle(e).opacity,e.style.backgroundImage=t)}let t=this.previousBackground?this.previousBackground.getAttribute("data-background-hash"):null,i=a.getAttribute("data-background-hash");i&&i===t&&a!==this.previousBackground&&this.element.classList.add("no-transition"),this.previousBackground=a}i&&["has-light-background","has-dark-background"].forEach((e=>{i.classList.contains(e)?this.Reveal.getRevealElement().classList.add(e):this.Reveal.getRevealElement().classList.remove(e)}),this),setTimeout((()=>{this.element.classList.remove("no-transition")}),1)}updateParallax(){let e=this.Reveal.getIndices();if(this.Reveal.getConfig().parallaxBackgroundImage){let t,i,s=this.Reveal.getHorizontalSlides(),a=this.Reveal.getVerticalSlides(),n=this.element.style.backgroundSize.split(" ");1===n.length?t=i=parseInt(n[0],10):(t=parseInt(n[0],10),i=parseInt(n[1],10));let r,o,l=this.element.offsetWidth,d=s.length;r="number"==typeof this.Reveal.getConfig().parallaxBackgroundHorizontal?this.Reveal.getConfig().parallaxBackgroundHorizontal:d>1?(t-l)/(d-1):0,o=r*e.h*-1;let c,h,u=this.element.offsetHeight,g=a.length;c="number"==typeof this.Reveal.getConfig().parallaxBackgroundVertical?this.Reveal.getConfig().parallaxBackgroundVertical:(i-u)/(g-1),h=g>0?c*e.v:0,this.element.style.backgroundPosition=o+"px "+-h+"px"}}destroy(){this.element.remove()}}const R=/registerPlugin|registerKeyboardShortcut|addKeyBinding|addEventListener/,S=/fade-(down|up|right|left|out|in-then-out|in-then-semi-out)|semi-fade-out|current-visible|shrink|grow/;let A=0;class k{constructor(e){this.Reveal=e}run(e,t){this.reset();let i=this.Reveal.getSlides(),s=i.indexOf(t),a=i.indexOf(e);if(e.hasAttribute("data-auto-animate")&&t.hasAttribute("data-auto-animate")&&e.getAttribute("data-auto-animate-id")===t.getAttribute("data-auto-animate-id")&&!(s>a?t:e).hasAttribute("data-auto-animate-restart")){this.autoAnimateStyleSheet=this.autoAnimateStyleSheet||l();let i=this.getAutoAnimateOptions(t);e.dataset.autoAnimate="pending",t.dataset.autoAnimate="pending",i.slideDirection=s>a?"forward":"backward";let n=this.getAutoAnimatableElements(e,t).map((e=>this.autoAnimateElements(e.from,e.to,e.options||{},i,A++)));if("false"!==t.dataset.autoAnimateUnmatched&&!0===this.Reveal.getConfig().autoAnimateUnmatched){let e=.8*i.duration,s=.2*i.duration;this.getUnmatchedAutoAnimateElements(t).forEach((e=>{let t=this.getAutoAnimateOptions(e,i),s="unmatched";t.duration===i.duration&&t.delay===i.delay||(s="unmatched-"+A++,n.push(`[data-auto-animate="running"] [data-auto-animate-target="${s}"] { transition: opacity ${t.duration}s ease ${t.delay}s; }`)),e.dataset.autoAnimateTarget=s}),this),n.push(`[data-auto-animate="running"] [data-auto-animate-target="unmatched"] { transition: opacity ${e}s ease ${s}s; }`)}this.autoAnimateStyleSheet.innerHTML=n.join(""),requestAnimationFrame((()=>{this.autoAnimateStyleSheet&&(getComputedStyle(this.autoAnimateStyleSheet).fontWeight,t.dataset.autoAnimate="running")})),this.Reveal.dispatchEvent({type:"autoanimate",data:{fromSlide:e,toSlide:t,sheet:this.autoAnimateStyleSheet}})}}reset(){t(this.Reveal.getRevealElement(),'[data-auto-animate]:not([data-auto-animate=""])').forEach((e=>{e.dataset.autoAnimate=""})),t(this.Reveal.getRevealElement(),"[data-auto-animate-target]").forEach((e=>{delete e.dataset.autoAnimateTarget})),this.autoAnimateStyleSheet&&this.autoAnimateStyleSheet.parentNode&&(this.autoAnimateStyleSheet.parentNode.removeChild(this.autoAnimateStyleSheet),this.autoAnimateStyleSheet=null)}autoAnimateElements(e,t,i,s,a){e.dataset.autoAnimateTarget="",t.dataset.autoAnimateTarget=a;let n=this.getAutoAnimateOptions(t,s);void 0!==i.delay&&(n.delay=i.delay),void 0!==i.duration&&(n.duration=i.duration),void 0!==i.easing&&(n.easing=i.easing);let r=this.getAutoAnimatableProperties("from",e,i),o=this.getAutoAnimatableProperties("to",t,i);if(t.classList.contains("fragment")&&(delete o.styles.opacity,e.classList.contains("fragment"))){(e.className.match(S)||[""])[0]===(t.className.match(S)||[""])[0]&&"forward"===s.slideDirection&&t.classList.add("visible","disabled")}if(!1!==i.translate||!1!==i.scale){let e=this.Reveal.getScale(),t={x:(r.x-o.x)/e,y:(r.y-o.y)/e,scaleX:r.width/o.width,scaleY:r.height/o.height};t.x=Math.round(1e3*t.x)/1e3,t.y=Math.round(1e3*t.y)/1e3,t.scaleX=Math.round(1e3*t.scaleX)/1e3,t.scaleX=Math.round(1e3*t.scaleX)/1e3;let s=!1!==i.translate&&(0!==t.x||0!==t.y),a=!1!==i.scale&&(0!==t.scaleX||0!==t.scaleY);if(s||a){let e=[];s&&e.push(`translate(${t.x}px, ${t.y}px)`),a&&e.push(`scale(${t.scaleX}, ${t.scaleY})`),r.styles.transform=e.join(" "),r.styles["transform-origin"]="top left",o.styles.transform="none"}}for(let e in o.styles){const t=o.styles[e],i=r.styles[e];t===i?delete o.styles[e]:(!0===t.explicitValue&&(o.styles[e]=t.value),!0===i.explicitValue&&(r.styles[e]=i.value))}let l="",d=Object.keys(o.styles);if(d.length>0){r.styles.transition="none",o.styles.transition=`all ${n.duration}s ${n.easing} ${n.delay}s`,o.styles["transition-property"]=d.join(", "),o.styles["will-change"]=d.join(", "),l='[data-auto-animate-target="'+a+'"] {'+Object.keys(r.styles).map((e=>e+": "+r.styles[e]+" !important;")).join("")+'}[data-auto-animate="running"] [data-auto-animate-target="'+a+'"] {'+Object.keys(o.styles).map((e=>e+": "+o.styles[e]+" !important;")).join("")+"}"}return l}getAutoAnimateOptions(t,i){let s={easing:this.Reveal.getConfig().autoAnimateEasing,duration:this.Reveal.getConfig().autoAnimateDuration,delay:0};if(s=e(s,i),t.parentNode){let e=r(t.parentNode,"[data-auto-animate-target]");e&&(s=this.getAutoAnimateOptions(e,s))}return t.dataset.autoAnimateEasing&&(s.easing=t.dataset.autoAnimateEasing),t.dataset.autoAnimateDuration&&(s.duration=parseFloat(t.dataset.autoAnimateDuration)),t.dataset.autoAnimateDelay&&(s.delay=parseFloat(t.dataset.autoAnimateDelay)),s}getAutoAnimatableProperties(e,t,i){let s=this.Reveal.getConfig(),a={styles:[]};if(!1!==i.translate||!1!==i.scale){let e;if("function"==typeof i.measure)e=i.measure(t);else if(s.center)e=t.getBoundingClientRect();else{let i=this.Reveal.getScale();e={x:t.offsetLeft*i,y:t.offsetTop*i,width:t.offsetWidth*i,height:t.offsetHeight*i}}a.x=e.x,a.y=e.y,a.width=e.width,a.height=e.height}const n=getComputedStyle(t);return(i.styles||s.autoAnimateStyles).forEach((t=>{let i;"string"==typeof t&&(t={property:t}),i=void 0!==t.from&&"from"===e?{value:t.from,explicitValue:!0}:void 0!==t.to&&"to"===e?{value:t.to,explicitValue:!0}:n[t.property],""!==i&&(a.styles[t.property]=i)})),a}getAutoAnimatableElements(e,t){let i=("function"==typeof this.Reveal.getConfig().autoAnimateMatcher?this.Reveal.getConfig().autoAnimateMatcher:this.getAutoAnimatePairs).call(this,e,t),s=[];return i.filter(((e,t)=>{if(-1===s.indexOf(e.to))return s.push(e.to),!0}))}getAutoAnimatePairs(e,t){let i=[];const s="h1, h2, h3, h4, h5, h6, p, li";return this.findAutoAnimateMatches(i,e,t,"[data-id]",(e=>e.nodeName+":::"+e.getAttribute("data-id"))),this.findAutoAnimateMatches(i,e,t,s,(e=>e.nodeName+":::"+e.innerText)),this.findAutoAnimateMatches(i,e,t,"img, video, iframe",(e=>e.nodeName+":::"+(e.getAttribute("src")||e.getAttribute("data-src")))),this.findAutoAnimateMatches(i,e,t,"pre",(e=>e.nodeName+":::"+e.innerText)),i.forEach((e=>{n(e.from,s)?e.options={scale:!1}:n(e.from,"pre")&&(e.options={scale:!1,styles:["width","height"]},this.findAutoAnimateMatches(i,e.from,e.to,".hljs .hljs-ln-code",(e=>e.textContent),{scale:!1,styles:[],measure:this.getLocalBoundingBox.bind(this)}),this.findAutoAnimateMatches(i,e.from,e.to,".hljs .hljs-ln-line[data-line-number]",(e=>e.getAttribute("data-line-number")),{scale:!1,styles:["width"],measure:this.getLocalBoundingBox.bind(this)}))}),this),i}getLocalBoundingBox(e){const t=this.Reveal.getScale();return{x:Math.round(e.offsetLeft*t*100)/100,y:Math.round(e.offsetTop*t*100)/100,width:Math.round(e.offsetWidth*t*100)/100,height:Math.round(e.offsetHeight*t*100)/100}}findAutoAnimateMatches(e,t,i,s,a,n){let r={},o={};[].slice.call(t.querySelectorAll(s)).forEach(((e,t)=>{const i=a(e);"string"==typeof i&&i.length&&(r[i]=r[i]||[],r[i].push(e))})),[].slice.call(i.querySelectorAll(s)).forEach(((t,i)=>{const s=a(t);let l;if(o[s]=o[s]||[],o[s].push(t),r[s]){const e=o[s].length-1,t=r[s].length-1;r[s][e]?(l=r[s][e],r[s][e]=null):r[s][t]&&(l=r[s][t],r[s][t]=null)}l&&e.push({from:l,to:t,options:n})}))}getUnmatchedAutoAnimateElements(e){return[].slice.call(e.children).reduce(((e,t)=>{const i=t.querySelector("[data-auto-animate-target]");return t.hasAttribute("data-auto-animate-target")||i||e.push(t),t.querySelector("[data-auto-animate-target]")&&(e=e.concat(this.getUnmatchedAutoAnimateElements(t))),e}),[])}}class L{constructor(e){this.Reveal=e}configure(e,t){!1===e.fragments?this.disable():!1===t.fragments&&this.enable()}disable(){t(this.Reveal.getSlidesElement(),".fragment").forEach((e=>{e.classList.add("visible"),e.classList.remove("current-fragment")}))}enable(){t(this.Reveal.getSlidesElement(),".fragment").forEach((e=>{e.classList.remove("visible"),e.classList.remove("current-fragment")}))}availableRoutes(){let e=this.Reveal.getCurrentSlide();if(e&&this.Reveal.getConfig().fragments){let t=e.querySelectorAll(".fragment:not(.disabled)"),i=e.querySelectorAll(".fragment:not(.disabled):not(.visible)");return{prev:t.length-i.length>0,next:!!i.length}}return{prev:!1,next:!1}}sort(e,t=!1){e=Array.from(e);let i=[],s=[],a=[];e.forEach((e=>{if(e.hasAttribute("data-fragment-index")){let t=parseInt(e.getAttribute("data-fragment-index"),10);i[t]||(i[t]=[]),i[t].push(e)}else s.push([e])})),i=i.concat(s);let n=0;return i.forEach((e=>{e.forEach((e=>{a.push(e),e.setAttribute("data-fragment-index",n)})),n++})),!0===t?i:a}sortAll(){this.Reveal.getHorizontalSlides().forEach((e=>{let i=t(e,"section");i.forEach(((e,t)=>{this.sort(e.querySelectorAll(".fragment"))}),this),0===i.length&&this.sort(e.querySelectorAll(".fragment"))}))}update(e,t){let i={shown:[],hidden:[]},s=this.Reveal.getCurrentSlide();if(s&&this.Reveal.getConfig().fragments&&(t=t||this.sort(s.querySelectorAll(".fragment"))).length){let a=0;if("number"!=typeof e){let t=this.sort(s.querySelectorAll(".fragment.visible")).pop();t&&(e=parseInt(t.getAttribute("data-fragment-index")||0,10))}Array.from(t).forEach(((t,s)=>{if(t.hasAttribute("data-fragment-index")&&(s=parseInt(t.getAttribute("data-fragment-index"),10)),a=Math.max(a,s),s<=e){let a=t.classList.contains("visible");t.classList.add("visible"),t.classList.remove("current-fragment"),s===e&&(this.Reveal.announceStatus(this.Reveal.getStatusText(t)),t.classList.add("current-fragment"),this.Reveal.slideContent.startEmbeddedContent(t)),a||(i.shown.push(t),this.Reveal.dispatchEvent({target:t,type:"visible",bubbles:!1}))}else{let e=t.classList.contains("visible");t.classList.remove("visible"),t.classList.remove("current-fragment"),e&&(this.Reveal.slideContent.stopEmbeddedContent(t),i.hidden.push(t),this.Reveal.dispatchEvent({target:t,type:"hidden",bubbles:!1}))}})),e="number"==typeof e?e:-1,e=Math.max(Math.min(e,a),-1),s.setAttribute("data-fragment",e)}return i}sync(e=this.Reveal.getCurrentSlide()){return this.sort(e.querySelectorAll(".fragment"))}goto(e,t=0){let i=this.Reveal.getCurrentSlide();if(i&&this.Reveal.getConfig().fragments){let s=this.sort(i.querySelectorAll(".fragment:not(.disabled)"));if(s.length){if("number"!=typeof e){let t=this.sort(i.querySelectorAll(".fragment:not(.disabled).visible")).pop();e=t?parseInt(t.getAttribute("data-fragment-index")||0,10):-1}e+=t;let a=this.update(e,s);return a.hidden.length&&this.Reveal.dispatchEvent({type:"fragmenthidden",data:{fragment:a.hidden[0],fragments:a.hidden}}),a.shown.length&&this.Reveal.dispatchEvent({type:"fragmentshown",data:{fragment:a.shown[0],fragments:a.shown}}),this.Reveal.controls.update(),this.Reveal.progress.update(),this.Reveal.getConfig().fragmentInURL&&this.Reveal.location.writeURL(),!(!a.shown.length&&!a.hidden.length)}}return!1}next(){return this.goto(null,1)}prev(){return this.goto(null,-1)}}class C{constructor(e){this.Reveal=e,this.active=!1,this.onSlideClicked=this.onSlideClicked.bind(this)}activate(){if(this.Reveal.getConfig().overview&&!this.isActive()){this.active=!0,this.Reveal.getRevealElement().classList.add("overview"),this.Reveal.cancelAutoSlide(),this.Reveal.getSlidesElement().appendChild(this.Reveal.getBackgroundsElement()),t(this.Reveal.getRevealElement(),".slides section").forEach((e=>{e.classList.contains("stack")||e.addEventListener("click",this.onSlideClicked,!0)}));const e=70,i=this.Reveal.getComputedSlideSize();this.overviewSlideWidth=i.width+e,this.overviewSlideHeight=i.height+e,this.Reveal.getConfig().rtl&&(this.overviewSlideWidth=-this.overviewSlideWidth),this.Reveal.updateSlidesVisibility(),this.layout(),this.update(),this.Reveal.layout();const s=this.Reveal.getIndices();this.Reveal.dispatchEvent({type:"overviewshown",data:{indexh:s.h,indexv:s.v,currentSlide:this.Reveal.getCurrentSlide()}})}}layout(){this.Reveal.getHorizontalSlides().forEach(((e,i)=>{e.setAttribute("data-index-h",i),a(e,"translate3d("+i*this.overviewSlideWidth+"px, 0, 0)"),e.classList.contains("stack")&&t(e,"section").forEach(((e,t)=>{e.setAttribute("data-index-h",i),e.setAttribute("data-index-v",t),a(e,"translate3d(0, "+t*this.overviewSlideHeight+"px, 0)")}))})),Array.from(this.Reveal.getBackgroundsElement().childNodes).forEach(((e,i)=>{a(e,"translate3d("+i*this.overviewSlideWidth+"px, 0, 0)"),t(e,".slide-background").forEach(((e,t)=>{a(e,"translate3d(0, "+t*this.overviewSlideHeight+"px, 0)")}))}))}update(){const e=Math.min(window.innerWidth,window.innerHeight),t=Math.max(e/5,150)/e,i=this.Reveal.getIndices();this.Reveal.transformSlides({overview:["scale("+t+")","translateX("+-i.h*this.overviewSlideWidth+"px)","translateY("+-i.v*this.overviewSlideHeight+"px)"].join(" ")})}deactivate(){if(this.Reveal.getConfig().overview){this.active=!1,this.Reveal.getRevealElement().classList.remove("overview"),this.Reveal.getRevealElement().classList.add("overview-deactivating"),setTimeout((()=>{this.Reveal.getRevealElement().classList.remove("overview-deactivating")}),1),this.Reveal.getRevealElement().appendChild(this.Reveal.getBackgroundsElement()),t(this.Reveal.getRevealElement(),".slides section").forEach((e=>{a(e,""),e.removeEventListener("click",this.onSlideClicked,!0)})),t(this.Reveal.getBackgroundsElement(),".slide-background").forEach((e=>{a(e,"")})),this.Reveal.transformSlides({overview:""});const e=this.Reveal.getIndices();this.Reveal.slide(e.h,e.v),this.Reveal.layout(),this.Reveal.cueAutoSlide(),this.Reveal.dispatchEvent({type:"overviewhidden",data:{indexh:e.h,indexv:e.v,currentSlide:this.Reveal.getCurrentSlide()}})}}toggle(e){"boolean"==typeof e?e?this.activate():this.deactivate():this.isActive()?this.deactivate():this.activate()}isActive(){return this.active}onSlideClicked(e){if(this.isActive()){e.preventDefault();let t=e.target;for(;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(this.deactivate(),t.nodeName.match(/section/gi))){let e=parseInt(t.getAttribute("data-index-h"),10),i=parseInt(t.getAttribute("data-index-v"),10);this.Reveal.slide(e,i)}}}}class x{constructor(e){this.Reveal=e,this.shortcuts={},this.bindings={},this.onDocumentKeyDown=this.onDocumentKeyDown.bind(this),this.onDocumentKeyPress=this.onDocumentKeyPress.bind(this)}configure(e,t){"linear"===e.navigationMode?(this.shortcuts["→ , ↓ , SPACE , N , L , J"]="Next slide",this.shortcuts["← , ↑ , P , H , K"]="Previous slide"):(this.shortcuts["N , SPACE"]="Next slide",this.shortcuts["P , Shift SPACE"]="Previous slide",this.shortcuts["← , H"]="Navigate left",this.shortcuts["→ , L"]="Navigate right",this.shortcuts["↑ , K"]="Navigate up",this.shortcuts["↓ , J"]="Navigate down"),this.shortcuts["Alt + ←/↑/→/↓"]="Navigate without fragments",this.shortcuts["Shift + ←/↑/→/↓"]="Jump to first/last slide",this.shortcuts["B , ."]="Pause",this.shortcuts.F="Fullscreen",this.shortcuts["ESC, O"]="Slide overview"}bind(){document.addEventListener("keydown",this.onDocumentKeyDown,!1),document.addEventListener("keypress",this.onDocumentKeyPress,!1)}unbind(){document.removeEventListener("keydown",this.onDocumentKeyDown,!1),document.removeEventListener("keypress",this.onDocumentKeyPress,!1)}addKeyBinding(e,t){"object"==typeof e&&e.keyCode?this.bindings[e.keyCode]={callback:t,key:e.key,description:e.description}:this.bindings[e]={callback:t,key:null,description:null}}removeKeyBinding(e){delete this.bindings[e]}triggerKey(e){this.onDocumentKeyDown({keyCode:e})}registerKeyboardShortcut(e,t){this.shortcuts[e]=t}getShortcuts(){return this.shortcuts}getBindings(){return this.bindings}onDocumentKeyPress(e){e.shiftKey&&63===e.charCode&&this.Reveal.toggleHelp()}onDocumentKeyDown(e){let t=this.Reveal.getConfig();if("function"==typeof t.keyboardCondition&&!1===t.keyboardCondition(e))return!0;if("focused"===t.keyboardCondition&&!this.Reveal.isFocused())return!0;let i=e.keyCode,s=!this.Reveal.isAutoSliding();this.Reveal.onUserInput(e);let a=document.activeElement&&!0===document.activeElement.isContentEditable,n=document.activeElement&&document.activeElement.tagName&&/input|textarea/i.test(document.activeElement.tagName),r=document.activeElement&&document.activeElement.className&&/speaker-notes/i.test(document.activeElement.className),o=!(-1!==[32,37,38,39,40,78,80].indexOf(e.keyCode)&&e.shiftKey||e.altKey)&&(e.shiftKey||e.altKey||e.ctrlKey||e.metaKey);if(a||n||r||o)return;let l,d=[66,86,190,191];if("object"==typeof t.keyboard)for(l in t.keyboard)"togglePause"===t.keyboard[l]&&d.push(parseInt(l,10));if(this.Reveal.isPaused()&&-1===d.indexOf(i))return!1;let c="linear"===t.navigationMode||!this.Reveal.hasHorizontalSlides()||!this.Reveal.hasVerticalSlides(),h=!1;if("object"==typeof t.keyboard)for(l in t.keyboard)if(parseInt(l,10)===i){let i=t.keyboard[l];"function"==typeof i?i.apply(null,[e]):"string"==typeof i&&"function"==typeof this.Reveal[i]&&this.Reveal[i].call(),h=!0}if(!1===h)for(l in this.bindings)if(parseInt(l,10)===i){let t=this.bindings[l].callback;"function"==typeof t?t.apply(null,[e]):"string"==typeof t&&"function"==typeof this.Reveal[t]&&this.Reveal[t].call(),h=!0}!1===h&&(h=!0,80===i||33===i?this.Reveal.prev({skipFragments:e.altKey}):78===i||34===i?this.Reveal.next({skipFragments:e.altKey}):72===i||37===i?e.shiftKey?this.Reveal.slide(0):!this.Reveal.overview.isActive()&&c?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.left({skipFragments:e.altKey}):76===i||39===i?e.shiftKey?this.Reveal.slide(this.Reveal.getHorizontalSlides().length-1):!this.Reveal.overview.isActive()&&c?this.Reveal.next({skipFragments:e.altKey}):this.Reveal.right({skipFragments:e.altKey}):75===i||38===i?e.shiftKey?this.Reveal.slide(void 0,0):!this.Reveal.overview.isActive()&&c?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.up({skipFragments:e.altKey}):74===i||40===i?e.shiftKey?this.Reveal.slide(void 0,Number.MAX_VALUE):!this.Reveal.overview.isActive()&&c?this.Reveal.next({skipFragments:e.altKey}):this.Reveal.down({skipFragments:e.altKey}):36===i?this.Reveal.slide(0):35===i?this.Reveal.slide(this.Reveal.getHorizontalSlides().length-1):32===i?(this.Reveal.overview.isActive()&&this.Reveal.overview.deactivate(),e.shiftKey?this.Reveal.prev({skipFragments:e.altKey}):this.Reveal.next({skipFragments:e.altKey})):58===i||59===i||66===i||86===i||190===i||191===i?this.Reveal.togglePause():70===i?(e=>{let t=(e=e||document.documentElement).requestFullscreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullscreen;t&&t.apply(e)})(t.embedded?this.Reveal.getViewportElement():document.documentElement):65===i?t.autoSlideStoppable&&this.Reveal.toggleAutoSlide(s):h=!1),h?e.preventDefault&&e.preventDefault():27!==i&&79!==i||(!1===this.Reveal.closeOverlay()&&this.Reveal.overview.toggle(),e.preventDefault&&e.preventDefault()),this.Reveal.cueAutoSlide()}}class P{constructor(e){var t,i,s;s=1e3,(i="MAX_REPLACE_STATE_FREQUENCY")in(t=this)?Object.defineProperty(t,i,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[i]=s,this.Reveal=e,this.writeURLTimeout=0,this.replaceStateTimestamp=0,this.onWindowHashChange=this.onWindowHashChange.bind(this)}bind(){window.addEventListener("hashchange",this.onWindowHashChange,!1)}unbind(){window.removeEventListener("hashchange",this.onWindowHashChange,!1)}getIndicesFromHash(e=window.location.hash){let t=e.replace(/^#\/?/,""),i=t.split("/");if(/^[0-9]*$/.test(i[0])||!t.length){const e=this.Reveal.getConfig();let t,s=e.hashOneBasedIndex?1:0,a=parseInt(i[0],10)-s||0,n=parseInt(i[1],10)-s||0;return e.fragmentInURL&&(t=parseInt(i[2],10),isNaN(t)&&(t=void 0)),{h:a,v:n,f:t}}{let e,i;/\/[-\d]+$/g.test(t)&&(i=parseInt(t.split("/").pop(),10),i=isNaN(i)?void 0:i,t=t.split("/").shift());try{e=document.getElementById(decodeURIComponent(t))}catch(e){}if(e)return{...this.Reveal.getIndices(e),f:i}}return null}readURL(){const e=this.Reveal.getIndices(),t=this.getIndicesFromHash();t?t.h===e.h&&t.v===e.v&&void 0===t.f||this.Reveal.slide(t.h,t.v,t.f):this.Reveal.slide(e.h||0,e.v||0)}writeURL(e){let t=this.Reveal.getConfig(),i=this.Reveal.getCurrentSlide();if(clearTimeout(this.writeURLTimeout),"number"==typeof e)this.writeURLTimeout=setTimeout(this.writeURL,e);else if(i){let e=this.getHash();t.history?window.location.hash=e:t.hash&&("/"===e?this.debouncedReplaceState(window.location.pathname+window.location.search):this.debouncedReplaceState("#"+e))}}replaceState(e){window.history.replaceState(null,null,e),this.replaceStateTimestamp=Date.now()}debouncedReplaceState(e){clearTimeout(this.replaceStateTimeout),Date.now()-this.replaceStateTimestamp>this.MAX_REPLACE_STATE_FREQUENCY?this.replaceState(e):this.replaceStateTimeout=setTimeout((()=>this.replaceState(e)),this.MAX_REPLACE_STATE_FREQUENCY)}getHash(e){let t="/",i=e||this.Reveal.getCurrentSlide(),s=i?i.getAttribute("id"):null;s&&(s=encodeURIComponent(s));let a=this.Reveal.getIndices(e);if(this.Reveal.getConfig().fragmentInURL||(a.f=void 0),"string"==typeof s&&s.length)t="/"+s,a.f>=0&&(t+="/"+a.f);else{let e=this.Reveal.getConfig().hashOneBasedIndex?1:0;(a.h>0||a.v>0||a.f>=0)&&(t+=a.h+e),(a.v>0||a.f>=0)&&(t+="/"+(a.v+e)),a.f>=0&&(t+="/"+a.f)}return t}onWindowHashChange(e){this.readURL()}}class N{constructor(e){this.Reveal=e,this.onNavigateLeftClicked=this.onNavigateLeftClicked.bind(this),this.onNavigateRightClicked=this.onNavigateRightClicked.bind(this),this.onNavigateUpClicked=this.onNavigateUpClicked.bind(this),this.onNavigateDownClicked=this.onNavigateDownClicked.bind(this),this.onNavigatePrevClicked=this.onNavigatePrevClicked.bind(this),this.onNavigateNextClicked=this.onNavigateNextClicked.bind(this)}render(){const e=this.Reveal.getConfig().rtl,i=this.Reveal.getRevealElement();this.element=document.createElement("aside"),this.element.className="controls",this.element.innerHTML=`\n\t\t\t\n\t\t\t\n\t\t\t`,this.Reveal.getRevealElement().appendChild(this.element),this.controlsLeft=t(i,".navigate-left"),this.controlsRight=t(i,".navigate-right"),this.controlsUp=t(i,".navigate-up"),this.controlsDown=t(i,".navigate-down"),this.controlsPrev=t(i,".navigate-prev"),this.controlsNext=t(i,".navigate-next"),this.controlsRightArrow=this.element.querySelector(".navigate-right"),this.controlsLeftArrow=this.element.querySelector(".navigate-left"),this.controlsDownArrow=this.element.querySelector(".navigate-down")}configure(e,t){this.element.style.display=e.controls?"block":"none",this.element.setAttribute("data-controls-layout",e.controlsLayout),this.element.setAttribute("data-controls-back-arrows",e.controlsBackArrows)}bind(){let e=["touchstart","click"];v&&(e=["touchstart"]),e.forEach((e=>{this.controlsLeft.forEach((t=>t.addEventListener(e,this.onNavigateLeftClicked,!1))),this.controlsRight.forEach((t=>t.addEventListener(e,this.onNavigateRightClicked,!1))),this.controlsUp.forEach((t=>t.addEventListener(e,this.onNavigateUpClicked,!1))),this.controlsDown.forEach((t=>t.addEventListener(e,this.onNavigateDownClicked,!1))),this.controlsPrev.forEach((t=>t.addEventListener(e,this.onNavigatePrevClicked,!1))),this.controlsNext.forEach((t=>t.addEventListener(e,this.onNavigateNextClicked,!1)))}))}unbind(){["touchstart","click"].forEach((e=>{this.controlsLeft.forEach((t=>t.removeEventListener(e,this.onNavigateLeftClicked,!1))),this.controlsRight.forEach((t=>t.removeEventListener(e,this.onNavigateRightClicked,!1))),this.controlsUp.forEach((t=>t.removeEventListener(e,this.onNavigateUpClicked,!1))),this.controlsDown.forEach((t=>t.removeEventListener(e,this.onNavigateDownClicked,!1))),this.controlsPrev.forEach((t=>t.removeEventListener(e,this.onNavigatePrevClicked,!1))),this.controlsNext.forEach((t=>t.removeEventListener(e,this.onNavigateNextClicked,!1)))}))}update(){let e=this.Reveal.availableRoutes();[...this.controlsLeft,...this.controlsRight,...this.controlsUp,...this.controlsDown,...this.controlsPrev,...this.controlsNext].forEach((e=>{e.classList.remove("enabled","fragmented"),e.setAttribute("disabled","disabled")})),e.left&&this.controlsLeft.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.right&&this.controlsRight.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.up&&this.controlsUp.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),e.down&&this.controlsDown.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),(e.left||e.up)&&this.controlsPrev.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")})),(e.right||e.down)&&this.controlsNext.forEach((e=>{e.classList.add("enabled"),e.removeAttribute("disabled")}));let t=this.Reveal.getCurrentSlide();if(t){let e=this.Reveal.fragments.availableRoutes();e.prev&&this.controlsPrev.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsNext.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),this.Reveal.isVerticalSlide(t)?(e.prev&&this.controlsUp.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsDown.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")}))):(e.prev&&this.controlsLeft.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})),e.next&&this.controlsRight.forEach((e=>{e.classList.add("fragmented","enabled"),e.removeAttribute("disabled")})))}if(this.Reveal.getConfig().controlsTutorial){let t=this.Reveal.getIndices();!this.Reveal.hasNavigatedVertically()&&e.down?this.controlsDownArrow.classList.add("highlight"):(this.controlsDownArrow.classList.remove("highlight"),this.Reveal.getConfig().rtl?!this.Reveal.hasNavigatedHorizontally()&&e.left&&0===t.v?this.controlsLeftArrow.classList.add("highlight"):this.controlsLeftArrow.classList.remove("highlight"):!this.Reveal.hasNavigatedHorizontally()&&e.right&&0===t.v?this.controlsRightArrow.classList.add("highlight"):this.controlsRightArrow.classList.remove("highlight"))}}destroy(){this.unbind(),this.element.remove()}onNavigateLeftClicked(e){e.preventDefault(),this.Reveal.onUserInput(),"linear"===this.Reveal.getConfig().navigationMode?this.Reveal.prev():this.Reveal.left()}onNavigateRightClicked(e){e.preventDefault(),this.Reveal.onUserInput(),"linear"===this.Reveal.getConfig().navigationMode?this.Reveal.next():this.Reveal.right()}onNavigateUpClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.up()}onNavigateDownClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.down()}onNavigatePrevClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.prev()}onNavigateNextClicked(e){e.preventDefault(),this.Reveal.onUserInput(),this.Reveal.next()}}class M{constructor(e){this.Reveal=e,this.onProgressClicked=this.onProgressClicked.bind(this)}render(){this.element=document.createElement("div"),this.element.className="progress",this.Reveal.getRevealElement().appendChild(this.element),this.bar=document.createElement("span"),this.element.appendChild(this.bar)}configure(e,t){this.element.style.display=e.progress?"block":"none"}bind(){this.Reveal.getConfig().progress&&this.element&&this.element.addEventListener("click",this.onProgressClicked,!1)}unbind(){this.Reveal.getConfig().progress&&this.element&&this.element.removeEventListener("click",this.onProgressClicked,!1)}update(){if(this.Reveal.getConfig().progress&&this.bar){let e=this.Reveal.getProgress();this.Reveal.getTotalSlides()<2&&(e=0),this.bar.style.transform="scaleX("+e+")"}}getMaxWidth(){return this.Reveal.getRevealElement().offsetWidth}onProgressClicked(e){this.Reveal.onUserInput(e),e.preventDefault();let t=this.Reveal.getSlides(),i=t.length,s=Math.floor(e.clientX/this.getMaxWidth()*i);this.Reveal.getConfig().rtl&&(s=i-s);let a=this.Reveal.getIndices(t[s]);this.Reveal.slide(a.h,a.v)}destroy(){this.element.remove()}}class D{constructor(e){this.Reveal=e,this.lastMouseWheelStep=0,this.cursorHidden=!1,this.cursorInactiveTimeout=0,this.onDocumentCursorActive=this.onDocumentCursorActive.bind(this),this.onDocumentMouseScroll=this.onDocumentMouseScroll.bind(this)}configure(e,t){e.mouseWheel?(document.addEventListener("DOMMouseScroll",this.onDocumentMouseScroll,!1),document.addEventListener("mousewheel",this.onDocumentMouseScroll,!1)):(document.removeEventListener("DOMMouseScroll",this.onDocumentMouseScroll,!1),document.removeEventListener("mousewheel",this.onDocumentMouseScroll,!1)),e.hideInactiveCursor?(document.addEventListener("mousemove",this.onDocumentCursorActive,!1),document.addEventListener("mousedown",this.onDocumentCursorActive,!1)):(this.showCursor(),document.removeEventListener("mousemove",this.onDocumentCursorActive,!1),document.removeEventListener("mousedown",this.onDocumentCursorActive,!1))}showCursor(){this.cursorHidden&&(this.cursorHidden=!1,this.Reveal.getRevealElement().style.cursor="")}hideCursor(){!1===this.cursorHidden&&(this.cursorHidden=!0,this.Reveal.getRevealElement().style.cursor="none")}destroy(){this.showCursor(),document.removeEventListener("DOMMouseScroll",this.onDocumentMouseScroll,!1),document.removeEventListener("mousewheel",this.onDocumentMouseScroll,!1),document.removeEventListener("mousemove",this.onDocumentCursorActive,!1),document.removeEventListener("mousedown",this.onDocumentCursorActive,!1)}onDocumentCursorActive(e){this.showCursor(),clearTimeout(this.cursorInactiveTimeout),this.cursorInactiveTimeout=setTimeout(this.hideCursor.bind(this),this.Reveal.getConfig().hideCursorTime)}onDocumentMouseScroll(e){if(Date.now()-this.lastMouseWheelStep>1e3){this.lastMouseWheelStep=Date.now();let t=e.detail||-e.wheelDelta;t>0?this.Reveal.next():t<0&&this.Reveal.prev()}}}const I=(e,t)=>{const i=document.createElement("script");i.type="text/javascript",i.async=!1,i.defer=!1,i.src=e,"function"==typeof t&&(i.onload=i.onreadystatechange=e=>{("load"===e.type||/loaded|complete/.test(i.readyState))&&(i.onload=i.onreadystatechange=i.onerror=null,t())},i.onerror=e=>{i.onload=i.onreadystatechange=i.onerror=null,t(new Error("Failed loading script: "+i.src+"\n"+e))});const s=document.querySelector("head");s.insertBefore(i,s.lastChild)};class T{constructor(e){this.Reveal=e,this.state="idle",this.registeredPlugins={},this.asyncDependencies=[]}load(e,t){return this.state="loading",e.forEach(this.registerPlugin.bind(this)),new Promise((e=>{let i=[],s=0;if(t.forEach((e=>{e.condition&&!e.condition()||(e.async?this.asyncDependencies.push(e):i.push(e))})),i.length){s=i.length;const t=t=>{t&&"function"==typeof t.callback&&t.callback(),0==--s&&this.initPlugins().then(e)};i.forEach((e=>{"string"==typeof e.id?(this.registerPlugin(e),t(e)):"string"==typeof e.src?I(e.src,(()=>t(e))):(console.warn("Unrecognized plugin format",e),t())}))}else this.initPlugins().then(e)}))}initPlugins(){return new Promise((e=>{let t=Object.values(this.registeredPlugins),i=t.length;if(0===i)this.loadAsync().then(e);else{let s,a=()=>{0==--i?this.loadAsync().then(e):s()},n=0;s=()=>{let e=t[n++];if("function"==typeof e.init){let t=e.init(this.Reveal);t&&"function"==typeof t.then?t.then(a):a()}else a()},s()}}))}loadAsync(){return this.state="loaded",this.asyncDependencies.length&&this.asyncDependencies.forEach((e=>{I(e.src,e.callback)})),Promise.resolve()}registerPlugin(e){2===arguments.length&&"string"==typeof arguments[0]?(e=arguments[1]).id=arguments[0]:"function"==typeof e&&(e=e());let t=e.id;"string"!=typeof t?console.warn("Unrecognized plugin format; can't find plugin.id",e):void 0===this.registeredPlugins[t]?(this.registeredPlugins[t]=e,"loaded"===this.state&&"function"==typeof e.init&&e.init(this.Reveal)):console.warn('reveal.js: "'+t+'" plugin has already been registered')}hasPlugin(e){return!!this.registeredPlugins[e]}getPlugin(e){return this.registeredPlugins[e]}getRegisteredPlugins(){return this.registeredPlugins}destroy(){Object.values(this.registeredPlugins).forEach((e=>{"function"==typeof e.destroy&&e.destroy()})),this.registeredPlugins={},this.asyncDependencies=[]}}class F{constructor(e){this.Reveal=e}async setupPDF(){const e=this.Reveal.getConfig(),i=t(this.Reveal.getRevealElement(),".slides section"),s=e.slideNumber&&/all|print/i.test(e.showSlideNumber),a=this.Reveal.getComputedSlideSize(window.innerWidth,window.innerHeight),n=Math.floor(a.width*(1+e.margin)),r=Math.floor(a.height*(1+e.margin)),o=a.width,d=a.height;await new Promise(requestAnimationFrame),l("@page{size:"+n+"px "+r+"px; margin: 0px;}"),l(".reveal section>img, .reveal section>video, .reveal section>iframe{max-width: "+o+"px; max-height:"+d+"px}"),document.documentElement.classList.add("print-pdf"),document.body.style.width=n+"px",document.body.style.height=r+"px";const c=document.querySelector(".reveal-viewport");let h;if(c){const e=window.getComputedStyle(c);e&&e.background&&(h=e.background)}await new Promise(requestAnimationFrame),this.Reveal.layoutSlideContents(o,d),await new Promise(requestAnimationFrame);const u=i.map((e=>e.scrollHeight)),g=[],v=i[0].parentNode;i.forEach((function(i,a){if(!1===i.classList.contains("stack")){let l=(n-o)/2,c=(r-d)/2;const v=u[a];let p=Math.max(Math.ceil(v/r),1);p=Math.min(p,e.pdfMaxPagesPerSlide),(1===p&&e.center||i.classList.contains("center"))&&(c=Math.max((r-v)/2,0));const m=document.createElement("div");if(g.push(m),m.className="pdf-page",m.style.height=(r+e.pdfPageHeightOffset)*p+"px",h&&(m.style.background=h),m.appendChild(i),i.style.left=l+"px",i.style.top=c+"px",i.style.width=o+"px",this.Reveal.slideContent.layout(i),i.slideBackgroundElement&&m.insertBefore(i.slideBackgroundElement,i),e.showNotes){const t=this.Reveal.getSlideNotes(i);if(t){const i=8,s="string"==typeof e.showNotes?e.showNotes:"inline",a=document.createElement("div");a.classList.add("speaker-notes"),a.classList.add("speaker-notes-pdf"),a.setAttribute("data-layout",s),a.innerHTML=t,"separate-page"===s?g.push(a):(a.style.left=i+"px",a.style.bottom=i+"px",a.style.width=n-2*i+"px",m.appendChild(a))}}if(s){const e=a+1,t=document.createElement("div");t.classList.add("slide-number"),t.classList.add("slide-number-pdf"),t.innerHTML=e,m.appendChild(t)}if(e.pdfSeparateFragments){const e=this.Reveal.fragments.sort(m.querySelectorAll(".fragment"),!0);let t;e.forEach((function(e){t&&t.forEach((function(e){e.classList.remove("current-fragment")})),e.forEach((function(e){e.classList.add("visible","current-fragment")}),this);const i=m.cloneNode(!0);g.push(i),t=e}),this),e.forEach((function(e){e.forEach((function(e){e.classList.remove("visible","current-fragment")}))}))}else t(m,".fragment:not(.fade-out)").forEach((function(e){e.classList.add("visible")}))}}),this),await new Promise(requestAnimationFrame),g.forEach((e=>v.appendChild(e))),this.Reveal.dispatchEvent({type:"pdf-ready"})}isPrintingPDF(){return/print-pdf/gi.test(window.location.search)}}class z{constructor(e){this.Reveal=e,this.touchStartX=0,this.touchStartY=0,this.touchStartCount=0,this.touchCaptured=!1,this.onPointerDown=this.onPointerDown.bind(this),this.onPointerMove=this.onPointerMove.bind(this),this.onPointerUp=this.onPointerUp.bind(this),this.onTouchStart=this.onTouchStart.bind(this),this.onTouchMove=this.onTouchMove.bind(this),this.onTouchEnd=this.onTouchEnd.bind(this)}bind(){let e=this.Reveal.getRevealElement();"onpointerdown"in window?(e.addEventListener("pointerdown",this.onPointerDown,!1),e.addEventListener("pointermove",this.onPointerMove,!1),e.addEventListener("pointerup",this.onPointerUp,!1)):window.navigator.msPointerEnabled?(e.addEventListener("MSPointerDown",this.onPointerDown,!1),e.addEventListener("MSPointerMove",this.onPointerMove,!1),e.addEventListener("MSPointerUp",this.onPointerUp,!1)):(e.addEventListener("touchstart",this.onTouchStart,!1),e.addEventListener("touchmove",this.onTouchMove,!1),e.addEventListener("touchend",this.onTouchEnd,!1))}unbind(){let e=this.Reveal.getRevealElement();e.removeEventListener("pointerdown",this.onPointerDown,!1),e.removeEventListener("pointermove",this.onPointerMove,!1),e.removeEventListener("pointerup",this.onPointerUp,!1),e.removeEventListener("MSPointerDown",this.onPointerDown,!1),e.removeEventListener("MSPointerMove",this.onPointerMove,!1),e.removeEventListener("MSPointerUp",this.onPointerUp,!1),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1)}isSwipePrevented(e){if(n(e,"video, audio"))return!0;for(;e&&"function"==typeof e.hasAttribute;){if(e.hasAttribute("data-prevent-swipe"))return!0;e=e.parentNode}return!1}onTouchStart(e){if(this.isSwipePrevented(e.target))return!0;this.touchStartX=e.touches[0].clientX,this.touchStartY=e.touches[0].clientY,this.touchStartCount=e.touches.length}onTouchMove(e){if(this.isSwipePrevented(e.target))return!0;let t=this.Reveal.getConfig();if(this.touchCaptured)v&&e.preventDefault();else{this.Reveal.onUserInput(e);let i=e.touches[0].clientX,s=e.touches[0].clientY;if(1===e.touches.length&&2!==this.touchStartCount){let a=this.Reveal.availableRoutes({includeFragments:!0}),n=i-this.touchStartX,r=s-this.touchStartY;n>40&&Math.abs(n)>Math.abs(r)?(this.touchCaptured=!0,"linear"===t.navigationMode?t.rtl?this.Reveal.next():this.Reveal.prev():this.Reveal.left()):n<-40&&Math.abs(n)>Math.abs(r)?(this.touchCaptured=!0,"linear"===t.navigationMode?t.rtl?this.Reveal.prev():this.Reveal.next():this.Reveal.right()):r>40&&a.up?(this.touchCaptured=!0,"linear"===t.navigationMode?this.Reveal.prev():this.Reveal.up()):r<-40&&a.down&&(this.touchCaptured=!0,"linear"===t.navigationMode?this.Reveal.next():this.Reveal.down()),t.embedded?(this.touchCaptured||this.Reveal.isVerticalSlide())&&e.preventDefault():e.preventDefault()}}}onTouchEnd(e){this.touchCaptured=!1}onPointerDown(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchStart(e))}onPointerMove(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchMove(e))}onPointerUp(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],this.onTouchEnd(e))}}class H{constructor(e){this.Reveal=e,this.onRevealPointerDown=this.onRevealPointerDown.bind(this),this.onDocumentPointerDown=this.onDocumentPointerDown.bind(this)}configure(e,t){e.embedded?this.blur():(this.focus(),this.unbind())}bind(){this.Reveal.getConfig().embedded&&this.Reveal.getRevealElement().addEventListener("pointerdown",this.onRevealPointerDown,!1)}unbind(){this.Reveal.getRevealElement().removeEventListener("pointerdown",this.onRevealPointerDown,!1),document.removeEventListener("pointerdown",this.onDocumentPointerDown,!1)}focus(){"focus"!==this.state&&(this.Reveal.getRevealElement().classList.add("focused"),document.addEventListener("pointerdown",this.onDocumentPointerDown,!1)),this.state="focus"}blur(){"blur"!==this.state&&(this.Reveal.getRevealElement().classList.remove("focused"),document.removeEventListener("pointerdown",this.onDocumentPointerDown,!1)),this.state="blur"}isFocused(){return"focus"===this.state}destroy(){this.Reveal.getRevealElement().classList.remove("focused")}onRevealPointerDown(e){this.focus()}onDocumentPointerDown(e){let t=r(e.target,".reveal");t&&t===this.Reveal.getRevealElement()||this.blur()}}class q{constructor(e){this.Reveal=e}render(){this.element=document.createElement("div"),this.element.className="speaker-notes",this.element.setAttribute("data-prevent-swipe",""),this.element.setAttribute("tabindex","0"),this.Reveal.getRevealElement().appendChild(this.element)}configure(e,t){e.showNotes&&this.element.setAttribute("data-layout","string"==typeof e.showNotes?e.showNotes:"inline")}update(){this.Reveal.getConfig().showNotes&&this.element&&this.Reveal.getCurrentSlide()&&!this.Reveal.print.isPrintingPDF()&&(this.element.innerHTML=this.getSlideNotes()||'No notes on this slide.')}updateVisibility(){this.Reveal.getConfig().showNotes&&this.hasNotes()&&!this.Reveal.print.isPrintingPDF()?this.Reveal.getRevealElement().classList.add("show-notes"):this.Reveal.getRevealElement().classList.remove("show-notes")}hasNotes(){return this.Reveal.getSlidesElement().querySelectorAll("[data-notes], aside.notes").length>0}isSpeakerNotesWindow(){return!!window.location.search.match(/receiver/gi)}getSlideNotes(e=this.Reveal.getCurrentSlide()){if(e.hasAttribute("data-notes"))return e.getAttribute("data-notes");let t=e.querySelector("aside.notes");return t?t.innerHTML:null}destroy(){this.element.remove()}}class B{constructor(e,t){this.diameter=100,this.diameter2=this.diameter/2,this.thickness=6,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=e,this.progressCheck=t,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.canvas.style.width=this.diameter2+"px",this.canvas.style.height=this.diameter2+"px",this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}setPlaying(e){const t=this.playing;this.playing=e,!t&&this.playing?this.animate():this.render()}animate(){const e=this.progress;this.progress=this.progressCheck(),e>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&requestAnimationFrame(this.animate.bind(this))}render(){let e=this.playing?this.progress:0,t=this.diameter2-this.thickness,i=this.diameter2,s=this.diameter2,a=28;this.progressOffset+=.1*(1-this.progressOffset);const n=-Math.PI/2+e*(2*Math.PI),r=-Math.PI/2+this.progressOffset*(2*Math.PI);this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(i,s,t+4,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(i,s,t,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="rgba( 255, 255, 255, 0.2 )",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(i,s,t,r,n,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(i-14,s-14),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,10,a),this.context.fillRect(18,0,10,a)):(this.context.beginPath(),this.context.translate(4,0),this.context.moveTo(0,0),this.context.lineTo(24,14),this.context.lineTo(0,a),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()}on(e,t){this.canvas.addEventListener(e,t,!1)}off(e,t){this.canvas.removeEventListener(e,t,!1)}destroy(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)}}var O={width:960,height:700,margin:.04,minScale:.2,maxScale:2,controls:!0,controlsTutorial:!0,controlsLayout:"bottom-right",controlsBackArrows:"faded",progress:!0,slideNumber:!1,showSlideNumber:"all",hashOneBasedIndex:!1,hash:!1,respondToHashChanges:!0,history:!1,keyboard:!0,keyboardCondition:null,disableLayout:!1,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,navigationMode:"default",shuffle:!1,fragments:!0,fragmentInURL:!0,embedded:!1,help:!0,pause:!0,showNotes:!1,showHiddenSlides:!1,autoPlayMedia:null,preloadIframes:null,autoAnimate:!0,autoAnimateMatcher:null,autoAnimateEasing:"ease",autoAnimateDuration:1,autoAnimateUnmatched:!0,autoAnimateStyles:["opacity","color","background-color","padding","font-size","line-height","letter-spacing","border-width","border-color","border-radius","outline","outline-offset"],autoSlide:0,autoSlideStoppable:!0,autoSlideMethod:null,defaultTiming:null,mouseWheel:!1,previewLinks:!1,postMessage:!0,postMessageEvents:!1,focusBodyOnPageVisibilityChange:!0,transition:"slide",transitionSpeed:"default",backgroundTransition:"fade",parallaxBackgroundImage:"",parallaxBackgroundSize:"",parallaxBackgroundRepeat:"",parallaxBackgroundPosition:"",parallaxBackgroundHorizontal:null,parallaxBackgroundVertical:null,pdfMaxPagesPerSlide:Number.POSITIVE_INFINITY,pdfSeparateFragments:!0,pdfPageHeightOffset:-1,viewDistance:3,mobileViewDistance:2,display:"block",hideInactiveCursor:!0,hideCursorTime:5e3,dependencies:[],plugins:[]};function U(n,l){arguments.length<2&&(l=arguments[0],n=document.querySelector(".reveal"));const h={};let u,v,p,m,f,w={},S=!1,A={hasNavigatedHorizontally:!1,hasNavigatedVertically:!1},I=[],U=1,W={layout:"",overview:""},K={},V="idle",$=0,j=0,X=-1,Y=!1,_=new b(h),J=new y(h),Q=new k(h),Z=new E(h),G=new L(h),ee=new C(h),te=new x(h),ie=new P(h),se=new N(h),ae=new M(h),ne=new D(h),re=new T(h),oe=new F(h),le=new H(h),de=new z(h),ce=new q(h);function he(e){if(!n)throw'Unable to find presentation root (
).';if(K.wrapper=n,K.slides=n.querySelector(".slides"),!K.slides)throw'Unable to find slides container (
).';return w={...O,...w,...l,...e,...d()},ue(),window.addEventListener("load",He,!1),re.load(w.plugins,w.dependencies).then(ge),new Promise((e=>h.on("ready",e)))}function ue(){!0===w.embedded?K.viewport=r(n,".reveal-viewport")||n:(K.viewport=document.body,document.documentElement.classList.add("reveal-full-page")),K.viewport.classList.add("reveal-viewport")}function ge(){S=!0,ve(),pe(),Ee(),ye(),we(),tt(),Re(),ie.readURL(),Z.update(!0),setTimeout((()=>{K.slides.classList.remove("no-transition"),K.wrapper.classList.add("ready"),Pe({type:"ready",data:{indexh:u,indexv:v,currentSlide:m}})}),1),oe.isPrintingPDF()&&(Ae(),"complete"===document.readyState?oe.setupPDF():window.addEventListener("load",(()=>{oe.setupPDF()})))}function ve(){w.showHiddenSlides||t(K.wrapper,'section[data-visibility="hidden"]').forEach((e=>{e.parentNode.removeChild(e)}))}function pe(){K.slides.classList.add("no-transition"),g?K.wrapper.classList.add("no-hover"):K.wrapper.classList.remove("no-hover"),Z.render(),J.render(),se.render(),ae.render(),ce.render(),K.pauseOverlay=o(K.wrapper,"div","pause-overlay",w.controls?'':null),K.statusElement=me(),K.wrapper.setAttribute("role","application")}function me(){let e=K.wrapper.querySelector(".aria-status");return e||(e=document.createElement("div"),e.style.position="absolute",e.style.height="1px",e.style.width="1px",e.style.overflow="hidden",e.style.clip="rect( 1px, 1px, 1px, 1px )",e.classList.add("aria-status"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),K.wrapper.appendChild(e)),e}function fe(e){K.statusElement.textContent=e}function be(e){let t="";if(3===e.nodeType)t+=e.textContent;else if(1===e.nodeType){let i=e.getAttribute("aria-hidden"),s="none"===window.getComputedStyle(e).display;"true"===i||s||Array.from(e.childNodes).forEach((e=>{t+=be(e)}))}return t=t.trim(),""===t?"":t+" "}function ye(){setInterval((()=>{0===K.wrapper.scrollTop&&0===K.wrapper.scrollLeft||(K.wrapper.scrollTop=0,K.wrapper.scrollLeft=0)}),1e3)}function we(){document.addEventListener("fullscreenchange",Ht),document.addEventListener("webkitfullscreenchange",Ht)}function Ee(){w.postMessage&&window.addEventListener("message",Dt,!1)}function Re(t){const s={...w};if("object"==typeof t&&e(w,t),!1===h.isReady())return;const a=K.wrapper.querySelectorAll(".slides section").length;K.wrapper.classList.remove(s.transition),K.wrapper.classList.add(w.transition),K.wrapper.setAttribute("data-transition-speed",w.transitionSpeed),K.wrapper.setAttribute("data-background-transition",w.backgroundTransition),K.viewport.style.setProperty("--slide-width",w.width+"px"),K.viewport.style.setProperty("--slide-height",w.height+"px"),w.shuffle&&it(),i(K.wrapper,"embedded",w.embedded),i(K.wrapper,"rtl",w.rtl),i(K.wrapper,"center",w.center),!1===w.pause&&Xe(),w.previewLinks?(Me(),De("[data-preview-link=false]")):(De(),Me("[data-preview-link]:not([data-preview-link=false])")),Q.reset(),f&&(f.destroy(),f=null),a>1&&w.autoSlide&&w.autoSlideStoppable&&(f=new B(K.wrapper,(()=>Math.min(Math.max((Date.now()-X)/$,0),1))),f.on("click",Bt),Y=!1),"default"!==w.navigationMode?K.wrapper.setAttribute("data-navigation-mode",w.navigationMode):K.wrapper.removeAttribute("data-navigation-mode"),ce.configure(w,s),le.configure(w,s),ne.configure(w,s),se.configure(w,s),ae.configure(w,s),te.configure(w,s),G.configure(w,s),J.configure(w,s),Ge()}function Se(){window.addEventListener("resize",Ft,!1),w.touch&&de.bind(),w.keyboard&&te.bind(),w.progress&&ae.bind(),w.respondToHashChanges&&ie.bind(),se.bind(),le.bind(),K.slides.addEventListener("click",Tt,!1),K.slides.addEventListener("transitionend",It,!1),K.pauseOverlay.addEventListener("click",Xe,!1),w.focusBodyOnPageVisibilityChange&&document.addEventListener("visibilitychange",zt,!1)}function Ae(){de.unbind(),le.unbind(),te.unbind(),se.unbind(),ae.unbind(),ie.unbind(),window.removeEventListener("resize",Ft,!1),K.slides.removeEventListener("click",Tt,!1),K.slides.removeEventListener("transitionend",It,!1),K.pauseOverlay.removeEventListener("click",Xe,!1)}function ke(){Ae(),Rt(),De(),ce.destroy(),le.destroy(),re.destroy(),ne.destroy(),se.destroy(),ae.destroy(),Z.destroy(),J.destroy(),document.removeEventListener("fullscreenchange",Ht),document.removeEventListener("webkitfullscreenchange",Ht),document.removeEventListener("visibilitychange",zt,!1),window.removeEventListener("message",Dt,!1),window.removeEventListener("load",He,!1),K.pauseOverlay&&K.pauseOverlay.remove(),K.statusElement&&K.statusElement.remove(),document.documentElement.classList.remove("reveal-full-page"),K.wrapper.classList.remove("ready","center","has-horizontal-slides","has-vertical-slides"),K.wrapper.removeAttribute("data-transition-speed"),K.wrapper.removeAttribute("data-background-transition"),K.viewport.classList.remove("reveal-viewport"),K.viewport.style.removeProperty("--slide-width"),K.viewport.style.removeProperty("--slide-height"),K.slides.style.removeProperty("width"),K.slides.style.removeProperty("height"),K.slides.style.removeProperty("zoom"),K.slides.style.removeProperty("left"),K.slides.style.removeProperty("top"),K.slides.style.removeProperty("bottom"),K.slides.style.removeProperty("right"),K.slides.style.removeProperty("transform"),Array.from(K.wrapper.querySelectorAll(".slides section")).forEach((e=>{e.style.removeProperty("display"),e.style.removeProperty("top"),e.removeAttribute("hidden"),e.removeAttribute("aria-hidden")}))}function Le(e,t,i){n.addEventListener(e,t,i)}function Ce(e,t,i){n.removeEventListener(e,t,i)}function xe(e){"string"==typeof e.layout&&(W.layout=e.layout),"string"==typeof e.overview&&(W.overview=e.overview),W.layout?a(K.slides,W.layout+" "+W.overview):a(K.slides,W.overview)}function Pe({target:t=K.wrapper,type:i,data:s,bubbles:a=!0}){let n=document.createEvent("HTMLEvents",1,2);return n.initEvent(i,a,!0),e(n,s),t.dispatchEvent(n),t===K.wrapper&&Ne(i),n}function Ne(t,i){if(w.postMessageEvents&&window.parent!==window.self){let s={namespace:"reveal",eventName:t,state:yt()};e(s,i),window.parent.postMessage(JSON.stringify(s),"*")}}function Me(e="a"){Array.from(K.wrapper.querySelectorAll(e)).forEach((e=>{/^(http|www)/gi.test(e.getAttribute("href"))&&e.addEventListener("click",qt,!1)}))}function De(e="a"){Array.from(K.wrapper.querySelectorAll(e)).forEach((e=>{/^(http|www)/gi.test(e.getAttribute("href"))&&e.removeEventListener("click",qt,!1)}))}function Ie(e){ze(),K.overlay=document.createElement("div"),K.overlay.classList.add("overlay"),K.overlay.classList.add("overlay-preview"),K.wrapper.appendChild(K.overlay),K.overlay.innerHTML=`
\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tUnable to load iframe. This is likely due to the site's policy (x-frame-options).\n\t\t\t\t\n\t\t\t
`,K.overlay.querySelector("iframe").addEventListener("load",(e=>{K.overlay.classList.add("loaded")}),!1),K.overlay.querySelector(".close").addEventListener("click",(e=>{ze(),e.preventDefault()}),!1),K.overlay.querySelector(".external").addEventListener("click",(e=>{ze()}),!1)}function Te(e){"boolean"==typeof e?e?Fe():ze():K.overlay?ze():Fe()}function Fe(){if(w.help){ze(),K.overlay=document.createElement("div"),K.overlay.classList.add("overlay"),K.overlay.classList.add("overlay-help"),K.wrapper.appendChild(K.overlay);let e='

Keyboard Shortcuts


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

sf package for spatial vector data

+
+

Intro to Geospatial Concepts

+ +
+ +
+
+

Geospatial Vector Data in R

+ +
+
+

The sf package

-
-

sf package for spatial vector data

+
+

The sf package

  • sf provides simple features access to R
  • -
  • represents simple features as records in a data.frame or tibble with a geometry column
  • +
  • represents simple features as records in a data frame with a geometry column
  • function names start with a prefix st_ (“st” stands for spatial type), which is also handy for auto-completion in RStudio
-
+

Open and Plot Shapefiles

-
-

Challenge 1: 🕐 3 mins

+
+

Challenge 1: 🕟 5 mins

Read in delft-streets.shp and delft-leisure.shp and call them lines_Delft and point_Delft respectively.

Answer the following questions:

    @@ -374,12 +448,27 @@

    Challenge 1: 🕐 3 mins

-
+
03:00
+
+
+
lines_Delft <- st_read(here("episodes", "data", "delft-streets.shp"))
+point_Delft <- st_read(here("episodes", "data", "delft-leisure.shp"))
+
+st_geometry_type(lines_Delft)
+st_geometry_type(point_Delft)
+
+st_crs(lines_Delft)
+st_crs(point_Delft)
+
+st_bbox(lines_Delft)
+st_bbox(point_Delft)
+
+
@@ -387,7 +476,7 @@

Explore and plot by vector layer attributes

-

Challenge 2: 🕙 3 mins

+

Challenge 2: 🕐 3 mins

Explore the attributes associated with the point_Delft and boundary_Delft spatial objects.

  1. How many attributes does each have?
  2. @@ -398,7 +487,7 @@

    Challenge 2: 🕙 3 mins

    ⁣        A) location B) leisure C) osm_id

    -
    +
    03:00
    @@ -406,9 +495,22 @@

    Challenge 2: 🕙 3 mins

    +
    +
    +
    ncol(point_Delft)
    +ncol(boundary_Delft)
    +
    +head(point_Delft)
    +head(point_Delft, 10)
    +
    +point_Delft
    +
    +names(point_Delft)
    +
    +
-

Challenge 3: 🕓 5 mins

+

Challenge 3: 🕢 5 mins

  1. Create a new object that only contains the motorways in Delft.
  2. How many features does the new object have?
  3. @@ -418,15 +520,35 @@

    Challenge 3: 🕓 5 mins

-
+
05:00
+
+
+
levels(factor(lines_Delft$highway))
+
+motorway_Delft <- lines_Delft %>% 
+  filter(highway == "motorway")
+
+motorway_Delft %>% 
+  mutate(length = st_length(.)) %>% 
+  select(everything(), geometry) %>%
+  summarise(total_length = sum(length))
+
+nrow(motorway_Delft)
+
+ggplot(data = motorway_Delft) +
+  geom_sf(size = 1.5) +
+  ggtitle("Mobility network of Delft", subtitle = "Motorways") +
+  coord_sf()
+
+
-

Challenge 4: ⏰ 3 mins

+

Challenge 4: 🕚 3 mins

In the previous example, we set the line widths to be 1, 0.75, 0.5, and 0.25. In our case line thicknesses are consistent with the hierarchy of the selected road types, but in some cases we might want to show a different hierarchy.

Let’s create another plot where we show the different line types with the following thicknesses:

    @@ -437,32 +559,60 @@

    Challenge 4: ⏰ 3 mins

-
+
03:00
+
+
+
levels(factor(lines_Delft$highway))
+
+line_widths <- c(0.25, 0.75, 0.5, 1)
+
+ggplot(data = lines_Delft_selection) +
+  geom_sf(aes(size = highway)) +
+  scale_size_manual(values = line_widths) +
+  labs(size = "Road Size") +
+  ggtitle("Mobility network of Delft", subtitle = "Roads & Cycleways - Line width varies") +
+  coord_sf()
+
+
-

Challenge 5: 🕰 5 mins

+

Challenge 5: 🕡 5 mins

Create a plot that emphasizes only roads where bicycles are allowed, as follows:

    -
  • make the lines where bicycles are not allowed THINNER than the roads where bicycles are allowed.
  • +
  • Make the lines where bicycles are not allowed THINNER than the roads where bicycles are allowed.
  • Be sure to add a title and legend to your map.
  • You might consider a color palette that has all bike-friendly roads displayed in a bright color. All other lines can be black.
-
+
05:00
+
+
+
levels(factor(lines_Delft_selection$highway))
+
+lines_Delft_bicycle <- lines_Delft %>% 
+  filter(highway == "cycleway")
+
+ggplot() +
+  geom_sf(data = lines_Delft) +
+  geom_sf(data = lines_Delft_bicycle, color = "magenta", size = 2) +
+  ggtitle("Mobility network of Delft", subtitle = "Roads dedicated to bikes") +
+  coord_sf()
+
+
-

Challenge 6: 🕗 3 mins

+

Challenge 6: 🕜 3 mins

Create a map of the municipal boundaries in the Netherlands, as follows:

  • Use the data located in your data folder: nl-gemeenten.shp.
  • @@ -471,12 +621,24 @@

    Challenge 6: 🕗 3 mins

-
+
03:00
+
+
+
municipal_boundaries_NL <- st_read(here("episodes", "data", "nl-gemeenten.shp"))
+str(municipal_boundaries_NL)
+levels(factor(municipal_boundaries_NL$ligtInPr_1))
+
+ggplot(data = municipal_boundaries_NL) +
+  geom_sf(aes(color = ligtInPr_1), size = 1) +
+  ggtitle("Contiguous NL Municipal Boundaries") +
+  coord_sf()
+
+
@@ -484,30 +646,52 @@

Plot multiple shapefiles

-

Challenge 7: 🕔 5 mins

+

Challenge 7: 🕘 5 mins

Create a map of leisure locations only including playground and picnic_table:

    -
  • color each point by the leisure type.

  • +
  • Color each point by the leisure type.

  • Overlay this layer on top of the lines_Delft layer (the streets).

  • Create a custom legend that applies line symbols to lines and point symbols to the points.

  • Extra: Modify the previous plot. Tell R to plot each point, using a different symbol of shape value.

-
+
05:00
+
+
+
leisure_locations_selection <- st_read(here("episodes", "data", "delft-leisure.shp")) %>% 
+  filter(leisure %in% c("playground", "picnic_table"))
+
+blue_orange <- c("cornflowerblue", "darkorange")
+
+p <- ggplot() + 
+  geom_sf(data = lines_Delft_selection, aes(color = highway)) + 
+  scale_color_manual(name = "Line Type", values = road_colors) +
+  ggtitle("Road network and leisure")
+
+p +
+  geom_sf(data = leisure_locations_selection, aes(fill = leisure), shape = 21) +
+  scale_fill_manual(name = "Leisure Type", values = blue_orange)
+
+p + 
+  geom_sf(data = leisure_locations_selection, aes(fill = leisure, shape = leisure), size = 3) +
+  scale_fill_manual(name = "Leisure Type", values = blue_orange) +
+  scale_shape_manual(name = "Leisure Type", values = c(21, 22))
+
+
-
-

Handle spatial projections

+
+

Handling spatial projections

-

Challenge 8: 🕓 3 mins

+

Challenge 8: 🕰 3 mins

Create a map of the South Holland, as follows:

  1. Import nl-gemeenten.shp and filter only the municipalities in South Holland.
  2. @@ -518,13 +702,26 @@

    Challenge 8: 🕓 3 mins

-
+
03:00
+
+
boundary_ZH <- municipal_boundary_NL %>% 
+  filter(ligtInPr_1 == "Zuid-Holland")
+
+ggplot() +
+  geom_sf(data = boundary_ZH, aes(color ="color"), show.legend = "line") +
+  scale_color_manual(name = "", labels = "Municipal Boundaries", values = c("color" = "gray18")) +
+  geom_sf(data = boundary_Delft, aes(shape = "shape"), color = "purple", fill = "purple") +
+  scale_shape_manual(name = "", labels = "Municipality of Delft", values = c("shape" = 19)) +
+  ggtitle("Delft location in South Holland") +
+  theme(legend.background = element_rect(color = NA)) +
+  coord_sf()
+
diff --git a/instructors/2-vector-slides.qmd b/instructors/2-vector-slides.qmd index 11224511..bf668f22 100644 --- a/instructors/2-vector-slides.qmd +++ b/instructors/2-vector-slides.qmd @@ -46,19 +46,23 @@ knitr::opts_chunk$set( ``` -## `sf` package for spatial vector data +# Intro to Geospatial Concepts + +# Geospatial Vector Data in R + +## The `sf` package ![](https://user-images.githubusercontent.com/520851/50280460-e35c1880-044c-11e9-9ed7-cc46754e49db.jpg){fig-align="center"} -## `sf` package for spatial vector data +## The `sf` package - `sf` provides [simple features access](https://en.wikipedia.org/wiki/Simple_Features) to R -- represents simple features as records in a `data.frame` or `tibble` with a `geometry` column +- represents simple features as records in a data frame with a `geometry` column - function names start with a prefix `st_` ("st" stands for spatial type), which is also handy for auto-completion in RStudio # Open and Plot Shapefiles -## Challenge 1: `r emo::ji("clock")` **3 mins** +## Challenge 1: `r emo::ji("clock")` **5 mins** Read in `delft-streets.shp` and `delft-leisure.shp` and call them `lines_Delft` and `point_Delft` respectively. @@ -80,13 +84,13 @@ countdown::countdown(minutes = 3) ```{r} #| label: ch-1 #| eval: false -#| include: false +#| include: true lines_Delft <- st_read(here("episodes", "data", "delft-streets.shp")) point_Delft <- st_read(here("episodes", "data", "delft-leisure.shp")) -class(lines_Delft) -class(point_Delft) +st_geometry_type(lines_Delft) +st_geometry_type(point_Delft) st_crs(lines_Delft) st_crs(point_Delft) @@ -121,7 +125,7 @@ countdown::countdown(minutes = 3) ```{r} #| label: ch-2 #| eval: false -#| include: false +#| include: true ncol(point_Delft) ncol(boundary_Delft) @@ -152,7 +156,7 @@ countdown::countdown(minutes = 5) ```{r} #| label: ch-3 #| eval: false -#| include: false +#| include: true levels(factor(lines_Delft$highway)) @@ -170,16 +174,6 @@ ggplot(data = motorway_Delft) + geom_sf(size = 1.5) + ggtitle("Mobility network of Delft", subtitle = "Motorways") + coord_sf() - -pedestrian_Delft <- lines_Delft %>% - filter(highway == "pedestrian") - -nrow(pedestrian_Delft) - -ggplot(data = pedestrian_Delft) + - geom_sf() + - ggtitle("Slow mobility network of Delft", subtitle = "Pedestrian") + - coord_sf() ``` ## Challenge 4: `r emo::ji("clock")` **3 mins** @@ -203,7 +197,7 @@ countdown::countdown(minutes = 3) ```{r} #| label: ch-4 #| eval: false -#| include: false +#| include: true levels(factor(lines_Delft$highway)) @@ -221,7 +215,7 @@ ggplot(data = lines_Delft_selection) + Create a plot that emphasizes only roads where bicycles are allowed, as follows: -- make the lines where bicycles are not allowed THINNER than the roads where bicycles are allowed. +- Make the lines where bicycles are not allowed THINNER than the roads where bicycles are allowed. - Be sure to add a title and legend to your map. - You might consider a color palette that has all bike-friendly roads displayed in a bright color. All other lines can be black. @@ -235,9 +229,7 @@ countdown::countdown(minutes = 5) ```{r} #| label: ch-5 #| eval: false -#| include: false - -class(lines_Delft_selection$highway) +#| include: true levels(factor(lines_Delft_selection$highway)) @@ -267,9 +259,9 @@ countdown::countdown(minutes = 3) . . . ```{r} -#| label: ch-6 +#| label: ch-6-1 #| eval: false -#| include: false +#| include: true municipal_boundaries_NL <- st_read(here("episodes", "data", "nl-gemeenten.shp")) str(municipal_boundaries_NL) @@ -287,7 +279,7 @@ ggplot(data = municipal_boundaries_NL) + Create a map of leisure locations only including `playground` and `picnic_table`: -- color each point by the leisure type. +- Color each point by the leisure type. - Overlay this layer on top of the `lines_Delft` layer (the streets). - Create a custom legend that applies line symbols to lines and point symbols to the points. @@ -303,39 +295,29 @@ countdown::countdown(minutes = 5) ```{r} #| label: ch-7 #| eval: false -#| include: false +#| include: true -leisure_locations_selection <- st_read(here("data", "delft-leisure.shp")) %>% +leisure_locations_selection <- st_read(here("episodes", "data", "delft-leisure.shp")) %>% filter(leisure %in% c("playground", "picnic_table")) -levels(factor(leisure_locations_selection$leisure)) - blue_orange <- c("cornflowerblue", "darkorange") -ggplot() + +p <- ggplot() + geom_sf(data = lines_Delft_selection, aes(color = highway)) + - geom_sf(data = leisure_locations_selection, aes(fill = leisure), - shape = 21, show.legend = 'point') + - scale_color_manual(name = "Line Type", values = road_colors, - guide = guide_legend(override.aes = list(linetype = "solid", shape = NA))) + - scale_fill_manual(name = "Soil Type", values = blue_orange, - guide = guide_legend(override.aes = list(linetype = "blank", shape = 21, colour = NA))) + - ggtitle("Traffic and leisure") + - coord_sf() + scale_color_manual(name = "Line Type", values = road_colors) + + ggtitle("Road network and leisure") -ggplot() + - geom_sf(data = lines_Delft_selection, aes(color = highway), size = 1) + - geom_sf(data = leisure_locations_selection, aes(fill = leisure, shape = leisure), size = 3) + - scale_shape_manual(name = "Leisure Type", values = c(21, 22)) + - scale_color_manual(name = "Line Type", values = road_colors) + - scale_fill_manual(name = "Leisure Type", values = rainbow(15), - guide = guide_legend(override.aes = list(linetype = "blank", shape = c(21, 22), - color = "black"))) + - ggtitle("Road network and leisure") + - coord_sf() +p + + geom_sf(data = leisure_locations_selection, aes(fill = leisure), shape = 21) + + scale_fill_manual(name = "Leisure Type", values = blue_orange) + +p + + geom_sf(data = leisure_locations_selection, aes(fill = leisure, shape = leisure), size = 3) + + scale_fill_manual(name = "Leisure Type", values = blue_orange) + + scale_shape_manual(name = "Leisure Type", values = c(21, 22)) ``` -# Handle spatial projections +# Handling spatial projections ## Challenge 8: `r emo::ji("clock")` **3 mins** @@ -357,7 +339,7 @@ countdown::countdown(minutes = 3) ```{r} #| label: ch-8 #| eval: false -#| include: false +#| include: true boundary_ZH <- municipal_boundary_NL %>% filter(ligtInPr_1 == "Zuid-Holland") diff --git a/instructors/2-vector-slides_files/figure-revealjs/ch-6-2-1.png b/instructors/2-vector-slides_files/figure-revealjs/ch-6-2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7777697c1fd3bd208c253e891a2237086ee39751 GIT binary patch literal 351753 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�?7B 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%0AXQbV$=w+ZAFbw72TDA@81a= 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 Soem24CoL&|KSx~8_x}LqCJn;? literal 0 HcmV?d00001 From a17f609ccc9a6df903377def8cea6c6e7424ae42 Mon Sep 17 00:00:00 2001 From: Claudiu Forgaci Date: Mon, 29 Jan 2024 16:12:55 +0100 Subject: [PATCH 21/21] remove usage of emo package --- instructors/2-vector-slides.qmd | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/instructors/2-vector-slides.qmd b/instructors/2-vector-slides.qmd index bf668f22..103d2ed2 100644 --- a/instructors/2-vector-slides.qmd +++ b/instructors/2-vector-slides.qmd @@ -62,7 +62,7 @@ knitr::opts_chunk$set( # Open and Plot Shapefiles -## Challenge 1: `r emo::ji("clock")` **5 mins** +## Challenge 1: **5 mins** Read in `delft-streets.shp` and `delft-leisure.shp` and call them `lines_Delft` and `point_Delft` respectively. @@ -101,7 +101,7 @@ st_bbox(point_Delft) # Explore and plot by vector layer attributes -## Challenge 2: `r emo::ji("clock")` **3 mins** +## Challenge 2: **3 mins** Explore the attributes associated with the `point_Delft` and `boundary_Delft` spatial objects. @@ -138,7 +138,7 @@ point_Delft names(point_Delft) ``` -## Challenge 3: `r emo::ji("clock")` **5 mins** +## Challenge 3: **5 mins** 1. Create a new object that only contains the motorways in Delft. 2. How many features does the new object have? @@ -176,7 +176,7 @@ ggplot(data = motorway_Delft) + coord_sf() ``` -## Challenge 4: `r emo::ji("clock")` **3 mins** +## Challenge 4: **3 mins** In the previous example, we set the line widths to be 1, 0.75, 0.5, and 0.25. In our case line thicknesses are consistent with the hierarchy of the selected road types, but in some cases we might want to show a different hierarchy. @@ -211,7 +211,7 @@ ggplot(data = lines_Delft_selection) + coord_sf() ``` -## Challenge 5: `r emo::ji("clock")` **5 mins** +## Challenge 5: **5 mins** Create a plot that emphasizes only roads where bicycles are allowed, as follows: @@ -243,7 +243,7 @@ ggplot() + coord_sf() ``` -## Challenge 6: `r emo::ji("clock")` **3 mins** +## Challenge 6: **3 mins** Create a map of the municipal boundaries in the Netherlands, as follows: @@ -275,7 +275,7 @@ ggplot(data = municipal_boundaries_NL) + # Plot multiple shapefiles -## Challenge 7: `r emo::ji("clock")` **5 mins** +## Challenge 7: **5 mins** Create a map of leisure locations only including `playground` and `picnic_table`: @@ -319,7 +319,7 @@ p + # Handling spatial projections -## Challenge 8: `r emo::ji("clock")` **3 mins** +## Challenge 8: **3 mins** Create a map of the South Holland, as follows: