├── EventStorming.pdf
├── LICENSE
├── README.md
├── index.html
├── run
├── run.bat
├── run.ps1
├── slideResources
├── black.css
├── clement_bouillier.jpg
├── cqrs.png
├── emilien_pecoul.jpg
├── eventsourcing.jpg
├── eventstorming.jpg
├── eventstorming_prepa_1.jpg
├── eventstorming_prepa_2.jpg
├── eventstorming_prepa_3.jpg
├── eventstorming_prepa_4.jpg
├── eventstorming_workshop.jpg
├── florent_pellet.jpg
├── head.min.js
├── jean_helou.jpg
├── reveal.css
├── reveal.min.js
├── step1_1.jpg
├── step1_2.png
├── step2_1.jpg
├── step2_2.png
├── step3_1.jpg
├── step3_2.jpg
├── step4.jpg
├── step5.png
├── unicorn.jpg
└── unicorn2.jpg
└── stepsDoc
├── end.txt
├── step1.txt
├── step2.txt
├── step3.txt
├── step4.txt
└── step5.txt
/EventStorming.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/EventStorming.pdf
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Mixter
2 | ======
3 | Mixter is a project to discover CQRS/Event sourcing through koans in multiple languages.
4 |
5 | At this point the koans have been ported to 5 languages: C#, Java 8, Scala, PHP and Javascript.
6 |
7 | Starting
8 | -------
9 |
10 | 1. Checkout `master` branch
11 | 2. Execute `./run` script
12 | 3. You will have to make tests pass green, then to go to next test, execute `./next`
13 |
14 | See few slides on http://devlyon.fr/mixter, it explains the main steps and goals for each.
15 |
16 | You can view one solution for each language with a small Web API on branches [lang]-solution.
17 |
18 | Feedback is required
19 | --------------------
20 |
21 | Feel free to use issues in this repo to give your feedback, to propose some improvements,
22 | to ask for other languages...and even better to submit pull requests.
23 |
24 | Explanations of some implementation details
25 | -------------------------------------------
26 |
27 | We have done some choices that we consider implementation details, but that can hurt
28 | some people. So we try to explain them here.
29 |
30 | ### About events publication mecanism in CQRS/ES, there are two main well known options :
31 |
32 | 1) use an AggregateRoot base class that accumulate uncommitted events that are picked by Repository on Save of the aggregate.
33 |
34 | 2) use DomainEvents.Raise(event) static call from AggregateRoot protected Apply method
35 |
36 | We chose a third way that consists of passing an IEventPublisher (with Publish method) to each aggregate method to raise events.
37 | There is no more need to call Repository.Save and it avoids static method call.
38 |
39 | ### We use a DecisionProjection concept to keep track of "transient state" of aggregates.
40 |
41 | We thought this "transient state" as a special projection (like Read model ones) to take further decision in the aggregate,
42 | that's why we call it DecisionProjection. We kept this class private inside the aggregate.
43 |
44 | ### Commands and command handlers are not shown here for now, for simplicity, it has been left implicit through method of aggregates.
45 |
46 | Perhaps something to introduce in further version.
47 |
48 | Any questions ?
49 | ---------------
50 |
51 | You can contact us through GitHub or on Twitter : @clem_bouillier, @florentpellet, @jeanhelou, @ouarzy.
52 |
53 |
54 | Add new languages
55 | ---------
56 | If you want to fork with your preferred language, you only need to follow some rules.
57 |
58 | The KoanCli script is based on a naming convention in commit message.
59 | * Failing tests should contain `[Test KO]`
60 | * Resolving tests should contain `[Test OK]`
61 |
62 | Currently the KoanCli script isn't dynamic and tests number must be static to know the correspondence between a test and a step.
63 | Here number of tests per step:
64 | * Step 1, delete command: 4 tests
65 | * Step 2, timeline messages: 1 tests
66 | * Step 3, subscription aggregate: 4 tests
67 | * Step 4, aggregates interaction: 4 tests
68 | * Step 5, command handler: 2 tests
69 |
70 |
71 | Changelog
72 | ---------
73 |
74 | ### V2
75 | * Create KoanCli: no git knowledge required. You simply call run script to starting, and next to jump at next step. (#3)
76 | * Remove reply message (#7)
77 | * Rename publish to quack (#16)
78 | * Fix several bug specific at languages (#15, #5, #4)
79 | * Make PHP version work with PHP 7.2 (#36)
80 |
81 | ### V1 (obsolete)
82 | First version, use during a Mix-IT workshop 2015 : http://www.mix-it.fr/session/1041/agilite-par-le-code-grace-a-cqrs-et-eventsourcing
83 |
84 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Workshop CQRS & EventSourcing discovery - Slides
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | CQRS & EventSourcing discovery
61 | Workshop
62 |
63 | Florent @florentpellet
64 | Clément @clem_bouillier
65 | Jean @jeanhelou
66 | Emilien @ouarzy
67 |
68 |
69 | Who are we ?
70 |
71 | 4 passionate guys initiated this workshop in 2015
72 | Feel free to give some feedbacks on GitHub
73 |
74 |
75 |
76 |
77 | Clément
78 | @clem_bouillier
79 |
80 |
81 |
82 | Emilien
83 | @ouarzy
84 |
85 |
86 |
87 | Florent
88 | @florentpellet
89 |
90 |
91 |
92 | Jean
93 | @jeanhelou
94 |
95 |
96 |
97 |
98 | CQRS Concept
99 |
100 | Ref. "Conceptual CQRS" - Alberto Brandolini
101 |
102 |
103 | Event Sourcing Concept
104 |
105 | NB: DecisionProjection is also called State
106 | Ref. Jérémie Chassaing
107 |
108 |
109 | The new unicorn
110 | We’ll revolutionize the web!
111 | We’ll create a product like Twitter but better ...
112 | A revolution!
113 |
114 |
115 |
116 | Mixter
117 | Instead tweet...
118 | we'll quack!
119 |
120 |
121 |
129 |
131 |
133 |
134 | Test Driven Workshop
135 |
136 | Working in pairs
137 | Execute "run" script and read instructions
138 |
139 | Red Test => Green Test
140 |
141 |
142 | 3 steps (+2 Bonus)
143 |
144 | C ommand DeleteMessage
145 | Q uery Timeline Message
146 | E vents in aggregate
147 |
148 |
149 |
150 |
151 |
152 | Focus on Core Domain
153 |
154 |
155 | Do not change
156 |
157 | Tests code
158 | Infrastructure code
159 |
160 |
161 |
162 | You can see Identity context implementation as example
163 |
164 |
165 |
166 | GIT Repository
167 | git clone https://github.com/DevLyon/mixter.git
168 | ./run
169 |
170 | Slide : http://devlyon.fr/mixter/
171 |
172 |
173 | 1. Delete Command
174 | What we will learn :
175 |
176 | publish events from aggregate,
177 | use projection for decision inside aggregate (contains only "state" for future decision, DO NOT keep all state like in an entity)
178 | Implement "business rules" that insure aggregate consistency (based on decision projection and command=method parameters)
179 |
180 | In brief : the C of CQRS
181 |
182 |
183 |
184 |
185 |
186 |
187 | 2. Timeline messages Projection
188 | What we will learn :
189 |
190 | Create another model for Query (Projection, TimelineMessageProjection)
191 | Transform events in a projection model through an EventHandler
192 | A projection repository (in-memory) with its interface is given
193 |
194 | In brief : Q of CQRS
195 |
196 |
197 |
198 |
199 |
200 |
201 | 3. Subscription Aggregate
202 | What we will learn :
203 |
204 | Create a new aggregate (Subscription)
205 | Raise events from it : UserFollowed and UserUnfollowed
206 | Create a decision projection for it
207 | Implement replay of events (event sourced aggregate)
208 |
209 | In brief : C of CQRS + Event Sourcing
210 |
211 |
212 |
213 |
214 |
215 |
216 | 4. Aggregates interaction
217 | What we will learn :
218 |
219 | Coordinate several aggregates to limit coupling
220 | Concept of " Eventual consistency"
221 |
222 |
223 |
224 |
225 |
226 |
227 | 5. Command Handler
228 | What we will learn :
229 |
230 | Integrate previous code from Message & Identity contexts in a command
231 | Write some web infrastructure code executing the command
232 |
233 |
234 | => Request Rest to execute delete Message command, with session validity verification
235 | NB : no tests for this step for now…
236 |
237 |
238 |
239 |
240 |
241 |
242 | CQRS & EventSourcing discovery
243 | Thanks!
244 |
245 | Florent @florentpellet
246 | Clément @clem_bouillier
247 | Jean @jeanhelou
248 | Emilien @ouarzy
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
262 |
263 |
264 |
--------------------------------------------------------------------------------
/run:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | testsNbByStep=( 4 1 4 4 2 )
4 |
5 | masterBranch="origin/master"
6 | testBranch="test"
7 | solutionBranch="solution"
8 | workshopBranch="workshop"
9 | referenceBranch=""
10 |
11 | MessageColor='\033[0;32m'
12 | CancelMessageColor='\033[0m'
13 |
14 | function switchRunnerIfWindows() {
15 | case "$(uname -s)" in
16 | CYGWIN*|MINGW*|MSYS*)
17 | echo 'Windows detected => Use run.bat'
18 | ./run.bat
19 | exit
20 | ;;
21 | esac
22 | }
23 |
24 | function askLanguage() {
25 | while true; do
26 | read -p "Language (js, csharp, csharp-core, fsharp, java, php, scala) ? " response
27 | case "$response" in
28 | "js")
29 | selectedLanguage=$response
30 | referenceBranch="origin/js/v2.1"
31 | break
32 | ;;
33 | "csharp")
34 | selectedLanguage=$response
35 | referenceBranch="origin/csharp/v2.3"
36 | break
37 | ;;
38 | "csharp-core")
39 | selectedLanguage=$response
40 | referenceBranch="origin/csharp-core/v2.1"
41 | break
42 | ;;
43 | "fsharp")
44 | selectedLanguage=$response
45 | referenceBranch="origin/fsharp/v2.2"
46 | break
47 | ;;
48 | "java")
49 | selectedLanguage=$response
50 | referenceBranch="origin/java/v2.2"
51 | break
52 | ;;
53 | "scala")
54 | selectedLanguage=$response
55 | referenceBranch="origin/scala/v2.2"
56 | break
57 | ;;
58 | "php")
59 | selectedLanguage=$response
60 | referenceBranch="origin/php/v2.1"
61 | break
62 | ;;
63 | esac
64 | done
65 | }
66 |
67 | function clean() {
68 | echo "Clean repository..."
69 |
70 | git clean -d -x -f > /dev/null
71 | git reset --hard HEAD > /dev/null
72 | git checkout master > /dev/null
73 | git branch -D $testBranch > /dev/null 2>&1
74 | git branch -D $solutionBranch > /dev/null 2>&1
75 | git branch -D $workshopBranch > /dev/null 2>&1
76 | git branch -D "${workshopBranch}-end" > /dev/null 2>&1
77 |
78 | git branch | grep -e '^\s*workshop-step[0-9]$' | xargs git branch -D > /dev/null 2>&1
79 | git tag --list | grep -e '^step[0-9]$' | xargs git tag -d > /dev/null 2>&1
80 | git tag --list | grep -e '^step[0-9]-test[0-9]$' | xargs git tag -d > /dev/null 2>&1
81 | }
82 |
83 | stepNb=${#testsNbByStep[@]}
84 | currentStep=1
85 | currentTestOfStep=1
86 | nextStep=1
87 | nextTestOfStep=1
88 | currentTestTag=""
89 | nextTestTag=""
90 | currentStepTag=""
91 | nextStepTag=""
92 | hasNextTestForCurrentStep=false
93 | hasNextStep=false
94 |
95 | function updateCurrentTestTag(){
96 | currentTestTag="step${currentStep}-test${currentTestOfStep}"
97 | }
98 |
99 | function updateNextTestTag(){
100 | if [ $currentStep -le $stepNb ] && [ ${testsNbByStep[$currentStep-1]} -le $currentTestOfStep ]
101 | then
102 | nextStep=$(($currentStep + 1))
103 | nextTestOfStep=1
104 | nextTestTag="step${nextStep}-test1"
105 | else
106 | nextTestOfStep=$(($currentTestOfStep + 1))
107 | nextTestTag="step${currentStep}-test${nextTestOfStep}"
108 | fi
109 | }
110 |
111 | function updateCurrentStepTag(){
112 | currentStepTag="step${currentStep}"
113 | }
114 |
115 | function updateNextStepTag(){
116 | nextStep=$(($currentStep + 1))
117 | nextStepTag="step${nextStep}"
118 | }
119 |
120 | function updateHasNextTestForCurrentStep(){
121 | if [ $currentStep -le $stepNb ] && [ $currentTestOfStep -lt ${testsNbByStep[$currentStep-1]} ]
122 | then
123 | hasNextTestForCurrentStep=true
124 | else
125 | hasNextTestForCurrentStep=false
126 | fi
127 | }
128 |
129 | function updateHasNextStep(){
130 | if [ $currentStep -lt $stepNb ]
131 | then
132 | hasNextStep=true
133 | else
134 | hasNextStep=false
135 | fi
136 | }
137 |
138 | function updateTagVariables(){
139 | updateCurrentTestTag
140 | updateNextTestTag
141 | updateCurrentStepTag
142 | updateNextStepTag
143 | updateHasNextTestForCurrentStep
144 | updateHasNextStep
145 | }
146 |
147 | function nextTest(){
148 | if [ ${testsNbByStep[$currentStep-1]} -le $currentTestOfStep ]
149 | then
150 | currentStep=$(($currentStep + 1))
151 | currentTestOfStep=1
152 | else
153 | currentTestOfStep=$(($currentTestOfStep + 1))
154 | fi
155 |
156 | updateTagVariables
157 | }
158 |
159 | function resetTestCounter(){
160 | currentStep=1
161 | currentTestOfStep=1
162 |
163 | updateTagVariables
164 | }
165 |
166 | function addStepNavigationCommand(){
167 | tag=$1
168 | stepNum=$2
169 |
170 | cat << EOF > ./jumpToNextStep
171 | #!/bin/bash
172 |
173 | git add -A
174 | git commit -m "Abort test"
175 | git checkout -b ${workshopBranch}-${tag} ${tag}
176 | git merge --no-edit ${tag}-test1 > /dev/null
177 | git checkout --ours .
178 | git add .
179 | git commit -m "Merge with test branch"
180 |
181 | echo ""
182 | echo ""
183 |
184 | printf '$MessageColor'
185 | cat stepsDoc/step${stepNum}.txt
186 | printf '$CancelMessageColor'
187 |
188 | echo ""
189 | echo ""
190 | EOF
191 |
192 | chmod +x ./jumpToNextStep
193 | git add jumpToNextStep > /dev/null
194 |
195 | git commit -m "Add step navigation commands" > /dev/null
196 | }
197 |
198 | function addEndStepNavigationCommand(){
199 | cat << EOF > ./jumpToNextStep
200 | #!/bin/bash
201 |
202 | git add -A
203 | git commit -m "Abort test"
204 | git checkout -b ${workshopBranch}-end ${solutionBranch}
205 |
206 | printf '$MessageColor'
207 | echo ""
208 | echo ""
209 | cat stepsDoc/end.txt
210 | echo ""
211 | echo ""
212 | printf '$CancelMessageColor'
213 |
214 | EOF
215 |
216 | chmod +x ./jumpToNextStep
217 | git add jumpToNextStep > /dev/null
218 |
219 | git commit -m "Add end commands" > /dev/null
220 | }
221 |
222 | function pickCommitForSolution(){
223 | line="$1"
224 | hash="$(echo $line | cut -d' ' -f1)"
225 |
226 | printf "."
227 |
228 | if [[ $line == *" KO]"* ]] && [ $currentTestOfStep -eq 1 ]
229 | then
230 | if [ $hasNextStep = true ]
231 | then
232 | addStepNavigationCommand $nextStepTag $nextStep
233 | else
234 | addEndStepNavigationCommand
235 | fi
236 | fi
237 |
238 | git cherry-pick $hash > /dev/null
239 |
240 | if [[ $line == *" KO]"* ]] && [ $currentTestOfStep -eq 1 ]
241 | then
242 | git tag $currentStepTag > /dev/null
243 | echo "${currentStepTag} Ok"
244 | fi
245 |
246 | if [[ $line == *" KO]"* ]]
247 | then
248 | nextTest
249 | fi
250 | }
251 |
252 | function initializeSolutionBranch() {
253 | echo "Initialize solution branch"
254 |
255 | resetTestCounter
256 |
257 | git checkout -b $solutionBranch $masterBranch > /dev/null
258 | git log $referenceBranch --pretty=tformat:'%h %s' --reverse -E HEAD.. | while read line
259 | do pickCommitForSolution "$line"
260 | done
261 |
262 | echo "Done"
263 | }
264 |
265 | function addNavigationCommand(){
266 | tag=$1
267 | stepNum=$2
268 | testNum=$3
269 |
270 | cat << EOF > ./next
271 | #!/bin/bash
272 |
273 | git add -A
274 | git commit -m "Resolve test"
275 | git merge --no-edit $tag
276 | EOF
277 |
278 | if [ $testNum -eq 1 ]
279 | then
280 | cat << EOF >> ./next
281 |
282 | echo ""
283 | echo ""
284 |
285 | printf '$MessageColor'
286 | cat stepsDoc/step${stepNum}.txt
287 | printf '$CancelMessageColor'
288 |
289 | echo ""
290 | echo ""
291 | EOF
292 | else
293 | cat << EOF >> ./next
294 |
295 | printf '$MessageColor'
296 | echo ""
297 | echo ""
298 | echo "========================"
299 | echo "=== STEP $(($stepNum - 1)) - Test $testNum ==="
300 | echo "========================"
301 | echo ""
302 | echo ""
303 | printf '$CancelMessageColor'
304 | EOF
305 | fi
306 |
307 | chmod +x ./next
308 | git add next > /dev/null
309 |
310 | git commit -m "Add test navigation commands" > /dev/null
311 | }
312 |
313 | function addEndNavigationCommand(){
314 | cat << EOF > ./next
315 | #!/bin/bash
316 |
317 | git add -A
318 | git commit -m "Resolve test"
319 | git merge --no-edit $testBranch
320 |
321 | printf '$MessageColor'
322 | echo ""
323 | echo ""
324 | cat stepsDoc/end.txt
325 | echo ""
326 | echo ""
327 | printf '$CancelMessageColor'
328 |
329 | EOF
330 |
331 | chmod +x ./next
332 | git add next > /dev/null
333 |
334 | git commit -m "Add end navigation commands" > /dev/null
335 | }
336 |
337 | function pickCommitForTest(){
338 | line=$1
339 | hash="$(echo $line | cut -d' ' -f1)"
340 |
341 | printf "."
342 |
343 | git cherry-pick $hash > /dev/null
344 |
345 | if [[ $line == *" KO]"* ]]
346 | then
347 | if [ $hasNextStep = true ] || [ $hasNextTestForCurrentStep = true ]
348 | then
349 | addNavigationCommand $nextTestTag $nextStep $nextTestOfStep
350 | else
351 | addEndNavigationCommand
352 | fi
353 |
354 | git tag $currentTestTag > /dev/null
355 | echo "$currentTestTag Ok"
356 |
357 | nextTest
358 | fi
359 | }
360 |
361 | function initializeTestBranch(){
362 | echo "Initialize test branch"
363 |
364 | resetTestCounter
365 |
366 | git checkout -b $testBranch $masterBranch > /dev/null
367 | git log $solutionBranch --pretty=tformat:'%h %s' --grep '[^K]\][^\[]' --grep '^[^\[]' --reverse -E HEAD.. | while read line
368 | do pickCommitForTest "$line"
369 | done
370 |
371 | echo "Done"
372 | }
373 |
374 | function initializeWorkflow(){
375 | echo "Initialize workspace"
376 |
377 | resetTestCounter
378 |
379 | git checkout -b $workshopBranch $currentTestTag
380 | }
381 |
382 | function customInitialize(){
383 | [ -f ./initialize ] && ./initialize
384 | }
385 |
386 | function displayWarningIfNotMaster(){
387 | currentBranchName="$(git name-rev --name-only HEAD)"
388 | if [[ $currentBranchName != "master" ]]
389 | then
390 | read -p "Are you sure you want to reinit everything? All your work will be lost! (y/N) : " response
391 | case $response in
392 | [Yy]* ) ;;
393 | * ) exit;;
394 | esac
395 | fi
396 | }
397 |
398 | switchRunnerIfWindows
399 |
400 | displayWarningIfNotMaster
401 | askLanguage
402 |
403 | clean
404 | initializeSolutionBranch
405 | initializeTestBranch
406 | initializeWorkflow
407 |
408 | customInitialize
409 |
410 | printf $MessageColor
411 | echo "Koan OK"
412 | echo ""
413 | echo ""
414 | cat stepsDoc/step1.txt
415 | echo ""
416 | echo ""
417 | printf $CancelMessageColor
418 |
--------------------------------------------------------------------------------
/run.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 |
3 | PowerShell -ExecutionPolicy Bypass -File run.ps1
--------------------------------------------------------------------------------
/run.ps1:
--------------------------------------------------------------------------------
1 | $languages = @{ "js"="origin/js/v2.1"; "csharp"="origin/csharp/v2.3";"csharp-core"="origin/csharp-core/v2.1"; "java"="origin/java/v2.2"; "scala"="origin/scala/v2.2"; "php"="origin/php/v2.1"; "fsharp"="origin/fsharp/v2.2" }
2 | $testsNbByStep = @{ 1=4; 2=1; 3=4; 4=4; 5=2 }
3 |
4 | $masterBranch = "origin/master"
5 | $testBranch = "test"
6 | $solutionBranch = "solution"
7 | $workshopBranch = "workshop"
8 |
9 | $batWrapperTemplate = @"
10 | @echo off
11 |
12 | PowerShell -ExecutionPolicy Bypass -File @@scriptname@@.ps1
13 | "@
14 |
15 | $nextCommandTemplate = @"
16 | git add -A
17 | git commit -m "Resolve test"
18 | git merge --no-edit @@nexttag@@
19 | "@
20 |
21 | $jumpToNextStepCommandTemplate = @"
22 | git add -A
23 | git commit -m "Abort test"
24 | git checkout -b $workshopBranch-@@nexttag@@ @@nexttag@@
25 | git merge --no-edit @@nexttag@@-test1 *> `$null`
26 | git checkout --ours .
27 | git add .
28 | git commit -m "Merge with test branch"
29 | "@
30 |
31 | $displayNextStepMessageTemplate = @"
32 | Write-Host ""
33 | Write-Host ""
34 | Get-Content stepsDoc/step@@stepNum@@.txt | Write-Host -f green
35 | Write-Host ""
36 | Write-Host ""
37 | "@
38 |
39 | $displayNextTestMessageTemplate = @"
40 | Write-Host ""
41 | Write-Host ""
42 | Write-Host -f green "========================"
43 | Write-Host -f green "=== STEP @@stepNum@@ - Test @@testNum@@ ==="
44 | Write-Host -f green "========================"
45 | Write-Host ""
46 | Write-Host ""
47 | "@
48 |
49 | $jumpToEndStepCommandTemplate = @"
50 | git add -A
51 | git commit -m "Abort test"
52 | git checkout -b $workshopBranch-end $solutionBranch
53 | "@
54 |
55 | $displayEndMessageTemplate = @"
56 | Write-Host ""
57 | Write-Host ""
58 | Get-Content stepsDoc/end.txt | Write-Host -f green
59 | Write-Host ""
60 | Write-Host ""
61 | "@
62 |
63 | function AskParametreWithValues($name, $values){
64 | do {
65 | $value = Read-Host ($name + " (" + ($values -join ", ") + ")")
66 | } while(-Not ($values -contains $value))
67 |
68 | return $value
69 | }
70 |
71 | function askLanguage(){
72 | AskParametreWithValues "Language" $languages.Keys
73 | }
74 |
75 | function generateTagsForStep($stepNum){
76 | [array]$testTags = 1..$testsNbByStep.$stepNum | %{ "step" + $stepNum + "-test" + $_ }
77 | [array]$stepTags = ("step" + $stepNum)
78 |
79 | $testTags + $stepTags
80 | }
81 |
82 | function generateTags(){
83 | 1..$testsNbByStep.Count | %{ generateTagsForStep $_ }
84 | }
85 |
86 | function getCurrentTestTag(){
87 | "step" + $currentStep + "-test" + $currentTestOfStep
88 | }
89 |
90 | function getNextTestTag(){
91 | if($testsNbByStep.$currentStep -le $currentTestOfStep){
92 | "step" + ($currentStep + 1) + "-test1"
93 | } else {
94 | "step" + $currentStep + "-test" + ($currentTestOfStep + 1)
95 | }
96 | }
97 |
98 | function getNextTestNum(){
99 | if($testsNbByStep.$currentStep -le $currentTestOfStep){
100 | return 1
101 | } else {
102 | return ($currentTestOfStep + 1)
103 | }
104 | }
105 |
106 | function getCurrentStepTag(){
107 | "step" + $currentStep
108 | }
109 |
110 | function getNextStepTag(){
111 | "step" + ($currentStep + 1)
112 | }
113 |
114 | function resetTestCounter(){
115 | $script:currentStep = 1
116 | $script:currentTestOfStep = 1
117 | }
118 |
119 | function nextTest(){
120 | if($testsNbByStep.$currentStep -le $currentTestOfStep){
121 | $script:currentStep++
122 | $script:currentTestOfStep = 1
123 | } else {
124 | $script:currentTestOfStep++
125 | }
126 | }
127 |
128 | function hasNextTestForCurrentStep(){
129 | $currentTestOfStep -lt $testsNbByStep.$currentStep
130 | }
131 |
132 | function hasNextStep(){
133 | $currentStep -lt $testsNbByStep.Count
134 | }
135 |
136 | function clean(){
137 | Write-Host "Clean repository..."
138 |
139 | git clean -d -x -f > $null
140 | git reset --hard HEAD > $null
141 | git checkout master > $null
142 | git branch -D $testBranch *> $null
143 | git branch -D $solutionBranch *> $null
144 | git branch -D $workshopBranch *> $null
145 | git branch -D ($workshopBranch + "-end") *> $null
146 | generateTags | %{ git branch -D ($workshopBranch + "-" + $_) } *> $null
147 | generateTags | %{ git tag -d $_ } *> $null
148 | }
149 |
150 | function extraCommitHashOfLog($line){
151 | $parts = $line.split(' ')
152 | $parts[0]
153 | }
154 |
155 | function isFailedTestCommit($line){
156 | $line -like '* KO]*'
157 | }
158 |
159 | function addStepNavigationCommand($nextStepTag, $nextStepNum){
160 | $nextCommandContent = $jumpToNextStepCommandTemplate.Replace("@@nexttag@@", $nextStepTag) + "`r`n" + $displayNextStepMessageTemplate.Replace("@@stepNum@@", $nextStepNum)
161 |
162 | $nextCommandContent | out-file 'jumpToNextStep.ps1' -enc ascii
163 | git add jumpToNextStep.ps1 > $null
164 |
165 | git commit -m "Add step navigation commands" > $null
166 | }
167 |
168 | function addEndStepNavigationCommand(){
169 | $nextCommandContent = $jumpToEndStepCommandTemplate + "`r`n" + $displayEndMessageTemplate
170 |
171 | $nextCommandContent | out-file 'jumpToNextStep.ps1' -enc ascii
172 | git add jumpToNextStep.ps1 > $null
173 |
174 | git commit -m "Add end step navigation commands" > $null
175 | }
176 |
177 | function pickCommitForSolution($line){
178 | $hash = extraCommitHashOfLog $line
179 |
180 | Write-Host -NoNewline "."
181 |
182 | $isKoTest = isFailedTestCommit $line
183 | $isFirstTestOfStep = $currentTestOfStep -eq 1
184 | if($isKoTest -and $isFirstTestOfStep){
185 | if((hasNextStep)) {
186 | addStepNavigationCommand (getNextStepTag) ($currentStep + 1)
187 | } else {
188 | addEndStepNavigationCommand
189 | }
190 | }
191 |
192 | git cherry-pick $hash > $null
193 |
194 | if($isKoTest -and $isFirstTestOfStep){
195 | git tag (getCurrentStepTag) > $null
196 |
197 | Write-Host ((getCurrentStepTag) + " Ok")
198 | }
199 |
200 | if($isKoTest){
201 | nextTest
202 | }
203 | }
204 |
205 | function getCommitLog($branch){
206 | git log $branch --pretty=tformat:'%h %s' --reverse -E HEAD..
207 | }
208 |
209 | function initializeNavigationScript(){
210 | $batWrapperTemplate.Replace("@@scriptname@@", 'jumpToNextStep') | out-file 'jumpToNextStep.bat' -enc ascii
211 | $batWrapperTemplate.Replace("@@scriptname@@", 'next') | out-file 'next.bat' -enc ascii
212 |
213 | git add jumpToNextStep.bat > $null
214 | git add next.bat > $null
215 |
216 | git commit -m "Add bat wrapper to navigation commands" > $null
217 | }
218 |
219 | function initializeSolutionBranch($referenceBranch){
220 | Write-Host "Initialize solution branch"
221 |
222 | resetTestCounter
223 |
224 | git checkout -b $solutionBranch $masterBranch > $null
225 | initializeNavigationScript
226 | getCommitLog $referenceBranch | %{ pickCommitForSolution $_ }
227 |
228 | Write-Host "Done"
229 | }
230 |
231 | function addNavigationCommand($nextTestTag, $nextTestNum, $currentStepNum){
232 | $nextCommandContent = $nextCommandTemplate.Replace("@@nexttag@@", $nextTestTag)
233 | if((getNextTestNum) -eq 1) {
234 | $nextCommandContent += "`r`n" + $displayNextStepMessageTemplate.Replace("@@stepNum@@", $currentStepNum + 1)
235 | } else {
236 | $nextCommandContent += "`r`n" + $displayNextTestMessageTemplate.Replace("@@stepNum@@", $currentStepNum).Replace("@@testNum@@", $nextTestNum)
237 | }
238 |
239 | $nextCommandContent | out-file 'next.ps1' -enc ascii
240 | git add next.ps1 > $null
241 |
242 | git commit -m "Add test navigation commands" > $null
243 | }
244 |
245 | function addEndNavigationCommand(){
246 | $nextCommandContent = $nextCommandTemplate.Replace("@@nexttag@@", $testBranch) + "`r`n" + $displayEndMessageTemplate
247 | $nextCommandContent | out-file 'next.ps1' -enc ascii
248 | git add next.ps1 > $null
249 |
250 | git commit -m "Add end test navigation commands" > $null
251 | }
252 |
253 | function pickCommitForTest($line){
254 | $hash = extraCommitHashOfLog $line
255 |
256 | Write-Host -NoNewline "."
257 |
258 | git cherry-pick $hash > $null
259 |
260 | if (isFailedTestCommit $line) {
261 | if((hasNextStep) -or (hasNextTestForCurrentStep)) {
262 | addNavigationCommand (getNextTestTag) (getNextTestNum) ($currentStep)
263 | } else {
264 | addEndNavigationCommand
265 | }
266 |
267 | git tag (getCurrentTestTag) > $null
268 | Write-Host ((getCurrentTestTag) + " Ok")
269 |
270 | nextTest
271 | }
272 | }
273 |
274 | function getCommitLogWithoutGreenTest($branch){
275 | git log $branch --pretty=tformat:'%h %s' --grep '[^K]\][^\[]' --grep '^[^\[]' --reverse -E HEAD..
276 | }
277 |
278 | function initializeTestBranch(){
279 | Write-Host "Initialize test branch"
280 |
281 | resetTestCounter
282 |
283 | git checkout -b $testBranch $masterBranch > $null
284 | getCommitLogWithoutGreenTest $solutionBranch | %{ pickCommitForTest $_ }
285 |
286 | Write-Host "Done"
287 | }
288 |
289 | function initializeWorkflow(){
290 | Write-Host "Initialize workspace"
291 |
292 | resetTestCounter
293 |
294 | git checkout -b $workshopBranch (getCurrentTestTag)
295 | }
296 |
297 | function customInitialize(){
298 | if (Test-Path ./initialize.bat) {
299 | & ./initialize.bat
300 | }
301 | }
302 |
303 | function displayWarningIfNotMaster(){
304 | $currentBranch = git name-rev --name-only HEAD
305 | if($currentBranch -ne "master") {
306 | $confirmation = Read-Host "Are you sure you want to reinit everything? All your work will be lost! (y/N)"
307 | if ($confirmation.ToLower() -ne 'y') {
308 | exit
309 | }
310 | }
311 | }
312 |
313 | displayWarningIfNotMaster
314 |
315 | $selectedLanguage = askLanguage
316 |
317 | clean
318 | initializeSolutionBranch $languages.$selectedLanguage
319 | initializeTestBranch
320 | initializeWorkflow
321 |
322 | customInitialize
323 |
324 | Write-Host "Koan OK"
325 | Write-Host ""
326 | Write-Host ""
327 | Get-Content stepsDoc/step1.txt | Write-Host -f green
328 | Write-Host ""
329 | Write-Host ""
330 |
--------------------------------------------------------------------------------
/slideResources/black.css:
--------------------------------------------------------------------------------
1 | /**
2 | * Black theme for reveal.js. This is the opposite of the 'white' theme.
3 | *
4 | * By Hakim El Hattab, http://hakim.se
5 | */
6 | @import url(https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.3.0/lib/font/source-sans-pro/source-sans-pro.min.css);
7 | section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 {
8 | color: #222; }
9 |
10 | /*********************************************
11 | * GLOBAL STYLES
12 | *********************************************/
13 | body {
14 | background: #222;
15 | background-color: #222; }
16 |
17 | .reveal {
18 | font-family: "Source Sans Pro", Helvetica, sans-serif;
19 | font-size: 38px;
20 | font-weight: normal;
21 | color: #fff; }
22 |
23 | ::selection {
24 | color: #fff;
25 | background: #bee4fd;
26 | text-shadow: none; }
27 |
28 | .reveal .slides > section,
29 | .reveal .slides > section > section {
30 | line-height: 1.3;
31 | font-weight: inherit; }
32 |
33 | /*********************************************
34 | * HEADERS
35 | *********************************************/
36 | .reveal h1,
37 | .reveal h2,
38 | .reveal h3,
39 | .reveal h4,
40 | .reveal h5,
41 | .reveal h6 {
42 | margin: 0 0 20px 0;
43 | color: #fff;
44 | font-family: "Source Sans Pro", Helvetica, sans-serif;
45 | font-weight: 600;
46 | line-height: 1.2;
47 | letter-spacing: normal;
48 | text-transform: uppercase;
49 | text-shadow: none;
50 | word-wrap: break-word; }
51 |
52 | .reveal h1 {
53 | font-size: 2.5em; }
54 |
55 | .reveal h2 {
56 | font-size: 1.6em; }
57 |
58 | .reveal h3 {
59 | font-size: 1.3em; }
60 |
61 | .reveal h4 {
62 | font-size: 1em; }
63 |
64 | .reveal h1 {
65 | text-shadow: none; }
66 |
67 | /*********************************************
68 | * OTHER
69 | *********************************************/
70 | .reveal p {
71 | margin: 20px 0;
72 | line-height: 1.3; }
73 |
74 | /* Ensure certain elements are never larger than the slide itself */
75 | .reveal img,
76 | .reveal video,
77 | .reveal iframe {
78 | max-width: 95%;
79 | max-height: 95%; }
80 |
81 | .reveal strong,
82 | .reveal b {
83 | font-weight: bold; }
84 |
85 | .reveal em {
86 | font-style: italic; }
87 |
88 | .reveal ol,
89 | .reveal dl,
90 | .reveal ul {
91 | display: inline-block;
92 | text-align: left;
93 | margin: 0 0 0 1em; }
94 |
95 | .reveal ol {
96 | list-style-type: decimal; }
97 |
98 | .reveal ul {
99 | list-style-type: disc; }
100 |
101 | .reveal ul ul {
102 | list-style-type: square; }
103 |
104 | .reveal ul ul ul {
105 | list-style-type: circle; }
106 |
107 | .reveal ul ul,
108 | .reveal ul ol,
109 | .reveal ol ol,
110 | .reveal ol ul {
111 | display: block;
112 | margin-left: 40px; }
113 |
114 | .reveal dt {
115 | font-weight: bold; }
116 |
117 | .reveal dd {
118 | margin-left: 40px; }
119 |
120 | .reveal q,
121 | .reveal blockquote {
122 | quotes: none; }
123 |
124 | .reveal blockquote {
125 | display: block;
126 | position: relative;
127 | width: 70%;
128 | margin: 20px auto;
129 | padding: 5px;
130 | font-style: italic;
131 | background: rgba(255, 255, 255, 0.05);
132 | box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
133 |
134 | .reveal blockquote p:first-child,
135 | .reveal blockquote p:last-child {
136 | display: inline-block; }
137 |
138 | .reveal q {
139 | font-style: italic; }
140 |
141 | .reveal pre {
142 | display: block;
143 | position: relative;
144 | width: 90%;
145 | margin: 20px auto;
146 | text-align: left;
147 | font-size: 0.55em;
148 | font-family: monospace;
149 | line-height: 1.2em;
150 | word-wrap: break-word;
151 | box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
152 |
153 | .reveal code {
154 | font-family: monospace; }
155 |
156 | .reveal pre code {
157 | display: block;
158 | padding: 5px;
159 | overflow: auto;
160 | max-height: 400px;
161 | word-wrap: normal; }
162 |
163 | .reveal table {
164 | margin: auto;
165 | border-collapse: collapse;
166 | border-spacing: 0; }
167 |
168 | .reveal table th {
169 | font-weight: bold; }
170 |
171 | .reveal table th,
172 | .reveal table td {
173 | text-align: left;
174 | padding: 0.2em 0.5em 0.2em 0.5em;
175 | border-bottom: 1px solid; }
176 |
177 | .reveal table th[align="center"],
178 | .reveal table td[align="center"] {
179 | text-align: center; }
180 |
181 | .reveal table th[align="right"],
182 | .reveal table td[align="right"] {
183 | text-align: right; }
184 |
185 | .reveal table tbody tr:last-child th,
186 | .reveal table tbody tr:last-child td {
187 | border-bottom: none; }
188 |
189 | .reveal sup {
190 | vertical-align: super; }
191 |
192 | .reveal sub {
193 | vertical-align: sub; }
194 |
195 | .reveal small {
196 | display: inline-block;
197 | font-size: 0.6em;
198 | line-height: 1.2em;
199 | vertical-align: top; }
200 |
201 | .reveal small * {
202 | vertical-align: top; }
203 |
204 | /*********************************************
205 | * LINKS
206 | *********************************************/
207 | .reveal a {
208 | color: #42affa;
209 | text-decoration: none;
210 | -webkit-transition: color .15s ease;
211 | -moz-transition: color .15s ease;
212 | transition: color .15s ease; }
213 |
214 | .reveal a:hover {
215 | color: #8dcffc;
216 | text-shadow: none;
217 | border: none; }
218 |
219 | .reveal .roll span:after {
220 | color: #fff;
221 | background: #068de9; }
222 |
223 | /*********************************************
224 | * IMAGES
225 | *********************************************/
226 | .reveal section img {
227 | margin: 15px 0px;
228 | background: rgba(255, 255, 255, 0.12);
229 | border: 4px solid #fff;
230 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
231 |
232 | .reveal section img.plain {
233 | border: 0;
234 | box-shadow: none; }
235 |
236 | .reveal a img {
237 | -webkit-transition: all .15s linear;
238 | -moz-transition: all .15s linear;
239 | transition: all .15s linear; }
240 |
241 | .reveal a:hover img {
242 | background: rgba(255, 255, 255, 0.2);
243 | border-color: #42affa;
244 | box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
245 |
246 | /*********************************************
247 | * NAVIGATION CONTROLS
248 | *********************************************/
249 | .reveal .controls .navigate-left,
250 | .reveal .controls .navigate-left.enabled {
251 | border-right-color: #42affa; }
252 |
253 | .reveal .controls .navigate-right,
254 | .reveal .controls .navigate-right.enabled {
255 | border-left-color: #42affa; }
256 |
257 | .reveal .controls .navigate-up,
258 | .reveal .controls .navigate-up.enabled {
259 | border-bottom-color: #42affa; }
260 |
261 | .reveal .controls .navigate-down,
262 | .reveal .controls .navigate-down.enabled {
263 | border-top-color: #42affa; }
264 |
265 | .reveal .controls .navigate-left.enabled:hover {
266 | border-right-color: #8dcffc; }
267 |
268 | .reveal .controls .navigate-right.enabled:hover {
269 | border-left-color: #8dcffc; }
270 |
271 | .reveal .controls .navigate-up.enabled:hover {
272 | border-bottom-color: #8dcffc; }
273 |
274 | .reveal .controls .navigate-down.enabled:hover {
275 | border-top-color: #8dcffc; }
276 |
277 | /*********************************************
278 | * PROGRESS BAR
279 | *********************************************/
280 | .reveal .progress {
281 | background: rgba(0, 0, 0, 0.2); }
282 |
283 | .reveal .progress span {
284 | background: #42affa;
285 | -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
286 | -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
287 | transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
288 |
--------------------------------------------------------------------------------
/slideResources/clement_bouillier.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/clement_bouillier.jpg
--------------------------------------------------------------------------------
/slideResources/cqrs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/cqrs.png
--------------------------------------------------------------------------------
/slideResources/emilien_pecoul.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/emilien_pecoul.jpg
--------------------------------------------------------------------------------
/slideResources/eventsourcing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventsourcing.jpg
--------------------------------------------------------------------------------
/slideResources/eventstorming.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming.jpg
--------------------------------------------------------------------------------
/slideResources/eventstorming_prepa_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming_prepa_1.jpg
--------------------------------------------------------------------------------
/slideResources/eventstorming_prepa_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming_prepa_2.jpg
--------------------------------------------------------------------------------
/slideResources/eventstorming_prepa_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming_prepa_3.jpg
--------------------------------------------------------------------------------
/slideResources/eventstorming_prepa_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming_prepa_4.jpg
--------------------------------------------------------------------------------
/slideResources/eventstorming_workshop.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/eventstorming_workshop.jpg
--------------------------------------------------------------------------------
/slideResources/florent_pellet.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/florent_pellet.jpg
--------------------------------------------------------------------------------
/slideResources/head.min.js:
--------------------------------------------------------------------------------
1 | /*! head.core - v1.0.2 */
2 | (function(n,t){"use strict";function r(n){a[a.length]=n}function k(n){var t=new RegExp(" ?\\b"+n+"\\b");c.className=c.className.replace(t,"")}function p(n,t){for(var i=0,r=n.length;in?(i.screensCss.gt&&r("gt-"+n),i.screensCss.gte&&r("gte-"+n)):tt);u.feature("landscape",fe?(i.browserCss.gt&&r("gt-"+f+e),i.browserCss.gte&&r("gte-"+f+e)):h2&&this[u+1]!==t)u&&r(this.slice(u,u+1).join("-").toLowerCase()+i.section);else{var f=n||"index",e=f.indexOf(".");e>0&&(f=f.substring(0,e));c.id=f.toLowerCase()+i.page;u||r("root"+i.section)}});u.screen={height:n.screen.height,width:n.screen.width};tt();b=0;n.addEventListener?n.addEventListener("resize",it,!1):n.attachEvent("onresize",it)})(window);
3 | /*! head.css3 - v1.0.0 */
4 | (function(n,t){"use strict";function a(n){for(var r in n)if(i[n[r]]!==t)return!0;return!1}function r(n){var t=n.charAt(0).toUpperCase()+n.substr(1),i=(n+" "+c.join(t+" ")+t).split(" ");return!!a(i)}var h=n.document,o=h.createElement("i"),i=o.style,s=" -o- -moz- -ms- -webkit- -khtml- ".split(" "),c="Webkit Moz O ms Khtml".split(" "),l=n.head_conf&&n.head_conf.head||"head",u=n[l],f={gradient:function(){var n="background-image:";return i.cssText=(n+s.join("gradient(linear,left top,right bottom,from(#9f9),to(#fff));"+n)+s.join("linear-gradient(left top,#eee,#fff);"+n)).slice(0,-n.length),!!i.backgroundImage},rgba:function(){return i.cssText="background-color:rgba(0,0,0,0.5)",!!i.backgroundColor},opacity:function(){return o.style.opacity===""},textshadow:function(){return i.textShadow===""},multiplebgs:function(){i.cssText="background:url(https://),url(https://),red url(https://)";var n=(i.background||"").match(/url/g);return Object.prototype.toString.call(n)==="[object Array]"&&n.length===3},boxshadow:function(){return r("boxShadow")},borderimage:function(){return r("borderImage")},borderradius:function(){return r("borderRadius")},cssreflections:function(){return r("boxReflect")},csstransforms:function(){return r("transform")},csstransitions:function(){return r("transition")},touch:function(){return"ontouchstart"in n},retina:function(){return n.devicePixelRatio>1},fontface:function(){var t=u.browser.name,n=u.browser.version;switch(t){case"ie":return n>=9;case"chrome":return n>=13;case"ff":return n>=6;case"ios":return n>=5;case"android":return!1;case"webkit":return n>=5.1;case"opera":return n>=10;default:return!1}}};for(var e in f)f[e]&&u.feature(e,f[e].call(),!0);u.feature()})(window);
5 | /*! head.load - v1.0.3 */
6 | (function(n,t){"use strict";function w(){}function u(n,t){if(n){typeof n=="object"&&(n=[].slice.call(n));for(var i=0,r=n.length;i section {
341 | -ms-perspective: 600px; }
342 |
343 | .reveal .slides > section,
344 | .reveal .slides > section > section {
345 | display: none;
346 | position: absolute;
347 | width: 100%;
348 | padding: 20px 0px;
349 | z-index: 10;
350 | -webkit-transform-style: preserve-3d;
351 | transform-style: preserve-3d;
352 | -webkit-transition: -webkit-transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), -webkit-transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
353 | transition: transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
354 |
355 | /* Global transition speed settings */
356 | .reveal[data-transition-speed="fast"] .slides section {
357 | -webkit-transition-duration: 400ms;
358 | transition-duration: 400ms; }
359 |
360 | .reveal[data-transition-speed="slow"] .slides section {
361 | -webkit-transition-duration: 1200ms;
362 | transition-duration: 1200ms; }
363 |
364 | /* Slide-specific transition speed overrides */
365 | .reveal .slides section[data-transition-speed="fast"] {
366 | -webkit-transition-duration: 400ms;
367 | transition-duration: 400ms; }
368 |
369 | .reveal .slides section[data-transition-speed="slow"] {
370 | -webkit-transition-duration: 1200ms;
371 | transition-duration: 1200ms; }
372 |
373 | .reveal .slides > section.stack {
374 | padding-top: 0;
375 | padding-bottom: 0; }
376 |
377 | .reveal .slides > section.present,
378 | .reveal .slides > section > section.present {
379 | display: block;
380 | z-index: 11;
381 | opacity: 1; }
382 |
383 | .reveal.center,
384 | .reveal.center .slides,
385 | .reveal.center .slides section {
386 | min-height: 0 !important; }
387 |
388 | /* Don't allow interaction with invisible slides */
389 | .reveal .slides > section.future,
390 | .reveal .slides > section > section.future,
391 | .reveal .slides > section.past,
392 | .reveal .slides > section > section.past {
393 | pointer-events: none; }
394 |
395 | .reveal.overview .slides > section,
396 | .reveal.overview .slides > section > section {
397 | pointer-events: auto; }
398 |
399 | .reveal .slides > section.past,
400 | .reveal .slides > section.future,
401 | .reveal .slides > section > section.past,
402 | .reveal .slides > section > section.future {
403 | opacity: 0; }
404 |
405 | /*********************************************
406 | * Mixins for readability of transitions
407 | *********************************************/
408 | /*********************************************
409 | * SLIDE TRANSITION
410 | * Aliased 'linear' for backwards compatibility
411 | *********************************************/
412 | .reveal.slide section {
413 | -webkit-backface-visibility: hidden;
414 | backface-visibility: hidden; }
415 |
416 | .reveal .slides > section[data-transition=slide].past,
417 | .reveal .slides > section[data-transition~=slide-out].past,
418 | .reveal.slide .slides > section:not([data-transition]).past {
419 | -webkit-transform: translate(-150%, 0);
420 | transform: translate(-150%, 0); }
421 |
422 | .reveal .slides > section[data-transition=slide].future,
423 | .reveal .slides > section[data-transition~=slide-in].future,
424 | .reveal.slide .slides > section:not([data-transition]).future {
425 | -webkit-transform: translate(150%, 0);
426 | transform: translate(150%, 0); }
427 |
428 | .reveal .slides > section > section[data-transition=slide].past,
429 | .reveal .slides > section > section[data-transition~=slide-out].past,
430 | .reveal.slide .slides > section > section:not([data-transition]).past {
431 | -webkit-transform: translate(0, -150%);
432 | transform: translate(0, -150%); }
433 |
434 | .reveal .slides > section > section[data-transition=slide].future,
435 | .reveal .slides > section > section[data-transition~=slide-in].future,
436 | .reveal.slide .slides > section > section:not([data-transition]).future {
437 | -webkit-transform: translate(0, 150%);
438 | transform: translate(0, 150%); }
439 |
440 | .reveal.linear section {
441 | -webkit-backface-visibility: hidden;
442 | backface-visibility: hidden; }
443 |
444 | .reveal .slides > section[data-transition=linear].past,
445 | .reveal .slides > section[data-transition~=linear-out].past,
446 | .reveal.linear .slides > section:not([data-transition]).past {
447 | -webkit-transform: translate(-150%, 0);
448 | transform: translate(-150%, 0); }
449 |
450 | .reveal .slides > section[data-transition=linear].future,
451 | .reveal .slides > section[data-transition~=linear-in].future,
452 | .reveal.linear .slides > section:not([data-transition]).future {
453 | -webkit-transform: translate(150%, 0);
454 | transform: translate(150%, 0); }
455 |
456 | .reveal .slides > section > section[data-transition=linear].past,
457 | .reveal .slides > section > section[data-transition~=linear-out].past,
458 | .reveal.linear .slides > section > section:not([data-transition]).past {
459 | -webkit-transform: translate(0, -150%);
460 | transform: translate(0, -150%); }
461 |
462 | .reveal .slides > section > section[data-transition=linear].future,
463 | .reveal .slides > section > section[data-transition~=linear-in].future,
464 | .reveal.linear .slides > section > section:not([data-transition]).future {
465 | -webkit-transform: translate(0, 150%);
466 | transform: translate(0, 150%); }
467 |
468 | /*********************************************
469 | * CONVEX TRANSITION
470 | * Aliased 'default' for backwards compatibility
471 | *********************************************/
472 | .reveal .slides > section[data-transition=default].past,
473 | .reveal .slides > section[data-transition~=default-out].past,
474 | .reveal.default .slides > section:not([data-transition]).past {
475 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
476 | transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); }
477 |
478 | .reveal .slides > section[data-transition=default].future,
479 | .reveal .slides > section[data-transition~=default-in].future,
480 | .reveal.default .slides > section:not([data-transition]).future {
481 | -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
482 | transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); }
483 |
484 | .reveal .slides > section > section[data-transition=default].past,
485 | .reveal .slides > section > section[data-transition~=default-out].past,
486 | .reveal.default .slides > section > section:not([data-transition]).past {
487 | -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
488 | transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); }
489 |
490 | .reveal .slides > section > section[data-transition=default].future,
491 | .reveal .slides > section > section[data-transition~=default-in].future,
492 | .reveal.default .slides > section > section:not([data-transition]).future {
493 | -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
494 | transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); }
495 |
496 | .reveal .slides > section[data-transition=convex].past,
497 | .reveal .slides > section[data-transition~=convex-out].past,
498 | .reveal.convex .slides > section:not([data-transition]).past {
499 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
500 | transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); }
501 |
502 | .reveal .slides > section[data-transition=convex].future,
503 | .reveal .slides > section[data-transition~=convex-in].future,
504 | .reveal.convex .slides > section:not([data-transition]).future {
505 | -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
506 | transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); }
507 |
508 | .reveal .slides > section > section[data-transition=convex].past,
509 | .reveal .slides > section > section[data-transition~=convex-out].past,
510 | .reveal.convex .slides > section > section:not([data-transition]).past {
511 | -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0);
512 | transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); }
513 |
514 | .reveal .slides > section > section[data-transition=convex].future,
515 | .reveal .slides > section > section[data-transition~=convex-in].future,
516 | .reveal.convex .slides > section > section:not([data-transition]).future {
517 | -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0);
518 | transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); }
519 |
520 | /*********************************************
521 | * CONCAVE TRANSITION
522 | *********************************************/
523 | .reveal .slides > section[data-transition=concave].past,
524 | .reveal .slides > section[data-transition~=concave-out].past,
525 | .reveal.concave .slides > section:not([data-transition]).past {
526 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
527 | transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); }
528 |
529 | .reveal .slides > section[data-transition=concave].future,
530 | .reveal .slides > section[data-transition~=concave-in].future,
531 | .reveal.concave .slides > section:not([data-transition]).future {
532 | -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
533 | transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); }
534 |
535 | .reveal .slides > section > section[data-transition=concave].past,
536 | .reveal .slides > section > section[data-transition~=concave-out].past,
537 | .reveal.concave .slides > section > section:not([data-transition]).past {
538 | -webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0);
539 | transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); }
540 |
541 | .reveal .slides > section > section[data-transition=concave].future,
542 | .reveal .slides > section > section[data-transition~=concave-in].future,
543 | .reveal.concave .slides > section > section:not([data-transition]).future {
544 | -webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0);
545 | transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); }
546 |
547 | /*********************************************
548 | * ZOOM TRANSITION
549 | *********************************************/
550 | .reveal .slides section[data-transition=zoom],
551 | .reveal.zoom .slides section:not([data-transition]) {
552 | -webkit-transition-timing-function: ease;
553 | transition-timing-function: ease; }
554 |
555 | .reveal .slides > section[data-transition=zoom].past,
556 | .reveal .slides > section[data-transition~=zoom-out].past,
557 | .reveal.zoom .slides > section:not([data-transition]).past {
558 | visibility: hidden;
559 | -webkit-transform: scale(16);
560 | transform: scale(16); }
561 |
562 | .reveal .slides > section[data-transition=zoom].future,
563 | .reveal .slides > section[data-transition~=zoom-in].future,
564 | .reveal.zoom .slides > section:not([data-transition]).future {
565 | visibility: hidden;
566 | -webkit-transform: scale(0.2);
567 | transform: scale(0.2); }
568 |
569 | .reveal .slides > section > section[data-transition=zoom].past,
570 | .reveal .slides > section > section[data-transition~=zoom-out].past,
571 | .reveal.zoom .slides > section > section:not([data-transition]).past {
572 | -webkit-transform: translate(0, -150%);
573 | transform: translate(0, -150%); }
574 |
575 | .reveal .slides > section > section[data-transition=zoom].future,
576 | .reveal .slides > section > section[data-transition~=zoom-in].future,
577 | .reveal.zoom .slides > section > section:not([data-transition]).future {
578 | -webkit-transform: translate(0, 150%);
579 | transform: translate(0, 150%); }
580 |
581 | /*********************************************
582 | * CUBE TRANSITION
583 | *********************************************/
584 | .reveal.cube .slides {
585 | -webkit-perspective: 1300px;
586 | perspective: 1300px; }
587 |
588 | .reveal.cube .slides section {
589 | padding: 30px;
590 | min-height: 700px;
591 | -webkit-backface-visibility: hidden;
592 | backface-visibility: hidden;
593 | box-sizing: border-box; }
594 |
595 | .reveal.center.cube .slides section {
596 | min-height: 0; }
597 |
598 | .reveal.cube .slides section:not(.stack):before {
599 | content: '';
600 | position: absolute;
601 | display: block;
602 | width: 100%;
603 | height: 100%;
604 | left: 0;
605 | top: 0;
606 | background: rgba(0, 0, 0, 0.1);
607 | border-radius: 4px;
608 | -webkit-transform: translateZ(-20px);
609 | transform: translateZ(-20px); }
610 |
611 | .reveal.cube .slides section:not(.stack):after {
612 | content: '';
613 | position: absolute;
614 | display: block;
615 | width: 90%;
616 | height: 30px;
617 | left: 5%;
618 | bottom: 0;
619 | background: none;
620 | z-index: 1;
621 | border-radius: 4px;
622 | box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2);
623 | -webkit-transform: translateZ(-90px) rotateX(65deg);
624 | transform: translateZ(-90px) rotateX(65deg); }
625 |
626 | .reveal.cube .slides > section.stack {
627 | padding: 0;
628 | background: none; }
629 |
630 | .reveal.cube .slides > section.past {
631 | -webkit-transform-origin: 100% 0%;
632 | transform-origin: 100% 0%;
633 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg);
634 | transform: translate3d(-100%, 0, 0) rotateY(-90deg); }
635 |
636 | .reveal.cube .slides > section.future {
637 | -webkit-transform-origin: 0% 0%;
638 | transform-origin: 0% 0%;
639 | -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg);
640 | transform: translate3d(100%, 0, 0) rotateY(90deg); }
641 |
642 | .reveal.cube .slides > section > section.past {
643 | -webkit-transform-origin: 0% 100%;
644 | transform-origin: 0% 100%;
645 | -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg);
646 | transform: translate3d(0, -100%, 0) rotateX(90deg); }
647 |
648 | .reveal.cube .slides > section > section.future {
649 | -webkit-transform-origin: 0% 0%;
650 | transform-origin: 0% 0%;
651 | -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg);
652 | transform: translate3d(0, 100%, 0) rotateX(-90deg); }
653 |
654 | /*********************************************
655 | * PAGE TRANSITION
656 | *********************************************/
657 | .reveal.page .slides {
658 | -webkit-perspective-origin: 0% 50%;
659 | perspective-origin: 0% 50%;
660 | -webkit-perspective: 3000px;
661 | perspective: 3000px; }
662 |
663 | .reveal.page .slides section {
664 | padding: 30px;
665 | min-height: 700px;
666 | box-sizing: border-box; }
667 |
668 | .reveal.page .slides section.past {
669 | z-index: 12; }
670 |
671 | .reveal.page .slides section:not(.stack):before {
672 | content: '';
673 | position: absolute;
674 | display: block;
675 | width: 100%;
676 | height: 100%;
677 | left: 0;
678 | top: 0;
679 | background: rgba(0, 0, 0, 0.1);
680 | -webkit-transform: translateZ(-20px);
681 | transform: translateZ(-20px); }
682 |
683 | .reveal.page .slides section:not(.stack):after {
684 | content: '';
685 | position: absolute;
686 | display: block;
687 | width: 90%;
688 | height: 30px;
689 | left: 5%;
690 | bottom: 0;
691 | background: none;
692 | z-index: 1;
693 | border-radius: 4px;
694 | box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2);
695 | -webkit-transform: translateZ(-90px) rotateX(65deg); }
696 |
697 | .reveal.page .slides > section.stack {
698 | padding: 0;
699 | background: none; }
700 |
701 | .reveal.page .slides > section.past {
702 | -webkit-transform-origin: 0% 0%;
703 | transform-origin: 0% 0%;
704 | -webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg);
705 | transform: translate3d(-40%, 0, 0) rotateY(-80deg); }
706 |
707 | .reveal.page .slides > section.future {
708 | -webkit-transform-origin: 100% 0%;
709 | transform-origin: 100% 0%;
710 | -webkit-transform: translate3d(0, 0, 0);
711 | transform: translate3d(0, 0, 0); }
712 |
713 | .reveal.page .slides > section > section.past {
714 | -webkit-transform-origin: 0% 0%;
715 | transform-origin: 0% 0%;
716 | -webkit-transform: translate3d(0, -40%, 0) rotateX(80deg);
717 | transform: translate3d(0, -40%, 0) rotateX(80deg); }
718 |
719 | .reveal.page .slides > section > section.future {
720 | -webkit-transform-origin: 0% 100%;
721 | transform-origin: 0% 100%;
722 | -webkit-transform: translate3d(0, 0, 0);
723 | transform: translate3d(0, 0, 0); }
724 |
725 | /*********************************************
726 | * FADE TRANSITION
727 | *********************************************/
728 | .reveal .slides section[data-transition=fade],
729 | .reveal.fade .slides section:not([data-transition]),
730 | .reveal.fade .slides > section > section:not([data-transition]) {
731 | -webkit-transform: none;
732 | transform: none;
733 | -webkit-transition: opacity 0.5s;
734 | transition: opacity 0.5s; }
735 |
736 | .reveal.fade.overview .slides section,
737 | .reveal.fade.overview .slides > section > section {
738 | -webkit-transition: none;
739 | transition: none; }
740 |
741 | /*********************************************
742 | * NO TRANSITION
743 | *********************************************/
744 | .reveal .slides section[data-transition=none],
745 | .reveal.none .slides section:not([data-transition]) {
746 | -webkit-transform: none;
747 | transform: none;
748 | -webkit-transition: none;
749 | transition: none; }
750 |
751 | /*********************************************
752 | * PAUSED MODE
753 | *********************************************/
754 | .reveal .pause-overlay {
755 | position: absolute;
756 | top: 0;
757 | left: 0;
758 | width: 100%;
759 | height: 100%;
760 | background: black;
761 | visibility: hidden;
762 | opacity: 0;
763 | z-index: 100;
764 | -webkit-transition: all 1s ease;
765 | transition: all 1s ease; }
766 |
767 | .reveal.paused .pause-overlay {
768 | visibility: visible;
769 | opacity: 1; }
770 |
771 | /*********************************************
772 | * FALLBACK
773 | *********************************************/
774 | .no-transforms {
775 | overflow-y: auto; }
776 |
777 | .no-transforms .reveal .slides {
778 | position: relative;
779 | width: 80%;
780 | height: auto !important;
781 | top: 0;
782 | left: 50%;
783 | margin: 0;
784 | text-align: center; }
785 |
786 | .no-transforms .reveal .controls,
787 | .no-transforms .reveal .progress {
788 | display: none !important; }
789 |
790 | .no-transforms .reveal .slides section {
791 | display: block !important;
792 | opacity: 1 !important;
793 | position: relative !important;
794 | height: auto;
795 | min-height: 0;
796 | top: 0;
797 | left: -50%;
798 | margin: 70px 0;
799 | -webkit-transform: none;
800 | transform: none; }
801 |
802 | .no-transforms .reveal .slides section section {
803 | left: 0; }
804 |
805 | .reveal .no-transition,
806 | .reveal .no-transition * {
807 | -webkit-transition: none !important;
808 | transition: none !important; }
809 |
810 | /*********************************************
811 | * PER-SLIDE BACKGROUNDS
812 | *********************************************/
813 | .reveal .backgrounds {
814 | position: absolute;
815 | width: 100%;
816 | height: 100%;
817 | top: 0;
818 | left: 0;
819 | -webkit-perspective: 600px;
820 | perspective: 600px; }
821 |
822 | .reveal .slide-background {
823 | display: none;
824 | position: absolute;
825 | width: 100%;
826 | height: 100%;
827 | opacity: 0;
828 | visibility: hidden;
829 | background-color: transparent;
830 | background-position: 50% 50%;
831 | background-repeat: no-repeat;
832 | background-size: cover;
833 | -webkit-transition: all 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
834 | transition: all 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
835 |
836 | .reveal .slide-background.stack {
837 | display: block; }
838 |
839 | .reveal .slide-background.present {
840 | opacity: 1;
841 | visibility: visible; }
842 |
843 | .print-pdf .reveal .slide-background {
844 | opacity: 1 !important;
845 | visibility: visible !important; }
846 |
847 | /* Video backgrounds */
848 | .reveal .slide-background video {
849 | position: absolute;
850 | width: 100%;
851 | height: 100%;
852 | max-width: none;
853 | max-height: none;
854 | top: 0;
855 | left: 0; }
856 |
857 | /* Immediate transition style */
858 | .reveal[data-background-transition=none] > .backgrounds .slide-background,
859 | .reveal > .backgrounds .slide-background[data-background-transition=none] {
860 | -webkit-transition: none;
861 | transition: none; }
862 |
863 | /* Slide */
864 | .reveal[data-background-transition=slide] > .backgrounds .slide-background,
865 | .reveal > .backgrounds .slide-background[data-background-transition=slide] {
866 | opacity: 1;
867 | -webkit-backface-visibility: hidden;
868 | backface-visibility: hidden; }
869 |
870 | .reveal[data-background-transition=slide] > .backgrounds .slide-background.past,
871 | .reveal > .backgrounds .slide-background.past[data-background-transition=slide] {
872 | -webkit-transform: translate(-100%, 0);
873 | transform: translate(-100%, 0); }
874 |
875 | .reveal[data-background-transition=slide] > .backgrounds .slide-background.future,
876 | .reveal > .backgrounds .slide-background.future[data-background-transition=slide] {
877 | -webkit-transform: translate(100%, 0);
878 | transform: translate(100%, 0); }
879 |
880 | .reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.past,
881 | .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=slide] {
882 | -webkit-transform: translate(0, -100%);
883 | transform: translate(0, -100%); }
884 |
885 | .reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.future,
886 | .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=slide] {
887 | -webkit-transform: translate(0, 100%);
888 | transform: translate(0, 100%); }
889 |
890 | /* Convex */
891 | .reveal[data-background-transition=convex] > .backgrounds .slide-background.past,
892 | .reveal > .backgrounds .slide-background.past[data-background-transition=convex] {
893 | opacity: 0;
894 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0);
895 | transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); }
896 |
897 | .reveal[data-background-transition=convex] > .backgrounds .slide-background.future,
898 | .reveal > .backgrounds .slide-background.future[data-background-transition=convex] {
899 | opacity: 0;
900 | -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0);
901 | transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); }
902 |
903 | .reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.past,
904 | .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=convex] {
905 | opacity: 0;
906 | -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0);
907 | transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); }
908 |
909 | .reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.future,
910 | .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=convex] {
911 | opacity: 0;
912 | -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0);
913 | transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); }
914 |
915 | /* Concave */
916 | .reveal[data-background-transition=concave] > .backgrounds .slide-background.past,
917 | .reveal > .backgrounds .slide-background.past[data-background-transition=concave] {
918 | opacity: 0;
919 | -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0);
920 | transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); }
921 |
922 | .reveal[data-background-transition=concave] > .backgrounds .slide-background.future,
923 | .reveal > .backgrounds .slide-background.future[data-background-transition=concave] {
924 | opacity: 0;
925 | -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0);
926 | transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); }
927 |
928 | .reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.past,
929 | .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=concave] {
930 | opacity: 0;
931 | -webkit-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0);
932 | transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); }
933 |
934 | .reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.future,
935 | .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=concave] {
936 | opacity: 0;
937 | -webkit-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0);
938 | transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); }
939 |
940 | /* Zoom */
941 | .reveal[data-background-transition=zoom] > .backgrounds .slide-background,
942 | .reveal > .backgrounds .slide-background[data-background-transition=zoom] {
943 | -webkit-transition-timing-function: ease;
944 | transition-timing-function: ease; }
945 |
946 | .reveal[data-background-transition=zoom] > .backgrounds .slide-background.past,
947 | .reveal > .backgrounds .slide-background.past[data-background-transition=zoom] {
948 | opacity: 0;
949 | visibility: hidden;
950 | -webkit-transform: scale(16);
951 | transform: scale(16); }
952 |
953 | .reveal[data-background-transition=zoom] > .backgrounds .slide-background.future,
954 | .reveal > .backgrounds .slide-background.future[data-background-transition=zoom] {
955 | opacity: 0;
956 | visibility: hidden;
957 | -webkit-transform: scale(0.2);
958 | transform: scale(0.2); }
959 |
960 | .reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.past,
961 | .reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=zoom] {
962 | opacity: 0;
963 | visibility: hidden;
964 | -webkit-transform: scale(16);
965 | transform: scale(16); }
966 |
967 | .reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.future,
968 | .reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=zoom] {
969 | opacity: 0;
970 | visibility: hidden;
971 | -webkit-transform: scale(0.2);
972 | transform: scale(0.2); }
973 |
974 | /* Global transition speed settings */
975 | .reveal[data-transition-speed="fast"] > .backgrounds .slide-background {
976 | -webkit-transition-duration: 400ms;
977 | transition-duration: 400ms; }
978 |
979 | .reveal[data-transition-speed="slow"] > .backgrounds .slide-background {
980 | -webkit-transition-duration: 1200ms;
981 | transition-duration: 1200ms; }
982 |
983 | /*********************************************
984 | * OVERVIEW
985 | *********************************************/
986 | .reveal.overview {
987 | -webkit-perspective-origin: 50% 50%;
988 | perspective-origin: 50% 50%;
989 | -webkit-perspective: 700px;
990 | perspective: 700px; }
991 | .reveal.overview .slides section {
992 | height: 100%;
993 | top: 0 !important;
994 | opacity: 1 !important;
995 | overflow: hidden;
996 | visibility: visible !important;
997 | cursor: pointer;
998 | box-sizing: border-box; }
999 | .reveal.overview .slides section:hover,
1000 | .reveal.overview .slides section.present {
1001 | outline: 10px solid rgba(150, 150, 150, 0.4);
1002 | outline-offset: 10px; }
1003 | .reveal.overview .slides section .fragment {
1004 | opacity: 1;
1005 | -webkit-transition: none;
1006 | transition: none; }
1007 | .reveal.overview .slides section:after,
1008 | .reveal.overview .slides section:before {
1009 | display: none !important; }
1010 | .reveal.overview .slides > section.stack {
1011 | padding: 0;
1012 | top: 0 !important;
1013 | background: none;
1014 | outline: none;
1015 | overflow: visible; }
1016 | .reveal.overview .backgrounds {
1017 | -webkit-perspective: inherit;
1018 | perspective: inherit; }
1019 | .reveal.overview .backgrounds .slide-background {
1020 | opacity: 1;
1021 | visibility: visible;
1022 | outline: 10px solid rgba(150, 150, 150, 0.1);
1023 | outline-offset: 10px; }
1024 |
1025 | .reveal.overview .slides section,
1026 | .reveal.overview-deactivating .slides section {
1027 | -webkit-transition: none;
1028 | transition: none; }
1029 |
1030 | .reveal.overview .backgrounds .slide-background,
1031 | .reveal.overview-deactivating .backgrounds .slide-background {
1032 | -webkit-transition: none;
1033 | transition: none; }
1034 |
1035 | .reveal.overview-animated .slides {
1036 | -webkit-transition: -webkit-transform 0.4s ease;
1037 | transition: transform 0.4s ease; }
1038 |
1039 | /*********************************************
1040 | * RTL SUPPORT
1041 | *********************************************/
1042 | .reveal.rtl .slides,
1043 | .reveal.rtl .slides h1,
1044 | .reveal.rtl .slides h2,
1045 | .reveal.rtl .slides h3,
1046 | .reveal.rtl .slides h4,
1047 | .reveal.rtl .slides h5,
1048 | .reveal.rtl .slides h6 {
1049 | direction: rtl;
1050 | font-family: sans-serif; }
1051 |
1052 | .reveal.rtl pre,
1053 | .reveal.rtl code {
1054 | direction: ltr; }
1055 |
1056 | .reveal.rtl ol,
1057 | .reveal.rtl ul {
1058 | text-align: right; }
1059 |
1060 | .reveal.rtl .progress span {
1061 | float: right; }
1062 |
1063 | /*********************************************
1064 | * PARALLAX BACKGROUND
1065 | *********************************************/
1066 | .reveal.has-parallax-background .backgrounds {
1067 | -webkit-transition: all 0.8s ease;
1068 | transition: all 0.8s ease; }
1069 |
1070 | /* Global transition speed settings */
1071 | .reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds {
1072 | -webkit-transition-duration: 400ms;
1073 | transition-duration: 400ms; }
1074 |
1075 | .reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds {
1076 | -webkit-transition-duration: 1200ms;
1077 | transition-duration: 1200ms; }
1078 |
1079 | /*********************************************
1080 | * LINK PREVIEW OVERLAY
1081 | *********************************************/
1082 | .reveal .overlay {
1083 | position: absolute;
1084 | top: 0;
1085 | left: 0;
1086 | width: 100%;
1087 | height: 100%;
1088 | z-index: 1000;
1089 | background: rgba(0, 0, 0, 0.9);
1090 | opacity: 0;
1091 | visibility: hidden;
1092 | -webkit-transition: all 0.3s ease;
1093 | transition: all 0.3s ease; }
1094 |
1095 | .reveal .overlay.visible {
1096 | opacity: 1;
1097 | visibility: visible; }
1098 |
1099 | .reveal .overlay .spinner {
1100 | position: absolute;
1101 | display: block;
1102 | top: 50%;
1103 | left: 50%;
1104 | width: 32px;
1105 | height: 32px;
1106 | margin: -16px 0 0 -16px;
1107 | z-index: 10;
1108 | 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);
1109 | visibility: visible;
1110 | opacity: 0.6;
1111 | -webkit-transition: all 0.3s ease;
1112 | transition: all 0.3s ease; }
1113 |
1114 | .reveal .overlay header {
1115 | position: absolute;
1116 | left: 0;
1117 | top: 0;
1118 | width: 100%;
1119 | height: 40px;
1120 | z-index: 2;
1121 | border-bottom: 1px solid #222; }
1122 |
1123 | .reveal .overlay header a {
1124 | display: inline-block;
1125 | width: 40px;
1126 | height: 40px;
1127 | padding: 0 10px;
1128 | float: right;
1129 | opacity: 0.6;
1130 | box-sizing: border-box; }
1131 |
1132 | .reveal .overlay header a:hover {
1133 | opacity: 1; }
1134 |
1135 | .reveal .overlay header a .icon {
1136 | display: inline-block;
1137 | width: 20px;
1138 | height: 20px;
1139 | background-position: 50% 50%;
1140 | background-size: 100%;
1141 | background-repeat: no-repeat; }
1142 |
1143 | .reveal .overlay header a.close .icon {
1144 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC); }
1145 |
1146 | .reveal .overlay header a.external .icon {
1147 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); }
1148 |
1149 | .reveal .overlay .viewport {
1150 | position: absolute;
1151 | display: -webkit-box;
1152 | display: -webkit-flex;
1153 | display: -ms-flexbox;
1154 | display: flex;
1155 | top: 40px;
1156 | right: 0;
1157 | bottom: 0;
1158 | left: 0; }
1159 |
1160 | .reveal .overlay.overlay-preview .viewport iframe {
1161 | width: 100%;
1162 | height: 100%;
1163 | max-width: 100%;
1164 | max-height: 100%;
1165 | border: 0;
1166 | opacity: 0;
1167 | visibility: hidden;
1168 | -webkit-transition: all 0.3s ease;
1169 | transition: all 0.3s ease; }
1170 |
1171 | .reveal .overlay.overlay-preview.loaded .viewport iframe {
1172 | opacity: 1;
1173 | visibility: visible; }
1174 |
1175 | .reveal .overlay.overlay-preview.loaded .spinner {
1176 | opacity: 0;
1177 | visibility: hidden;
1178 | -webkit-transform: scale(0.2);
1179 | transform: scale(0.2); }
1180 |
1181 | .reveal .overlay.overlay-help .viewport {
1182 | overflow: auto;
1183 | color: #fff; }
1184 |
1185 | .reveal .overlay.overlay-help .viewport .viewport-inner {
1186 | width: 600px;
1187 | margin: auto;
1188 | padding: 20px 20px 80px 20px;
1189 | text-align: center;
1190 | letter-spacing: normal; }
1191 |
1192 | .reveal .overlay.overlay-help .viewport .viewport-inner .title {
1193 | font-size: 20px; }
1194 |
1195 | .reveal .overlay.overlay-help .viewport .viewport-inner table {
1196 | border: 1px solid #fff;
1197 | border-collapse: collapse;
1198 | font-size: 16px; }
1199 |
1200 | .reveal .overlay.overlay-help .viewport .viewport-inner table th,
1201 | .reveal .overlay.overlay-help .viewport .viewport-inner table td {
1202 | width: 200px;
1203 | padding: 14px;
1204 | border: 1px solid #fff;
1205 | vertical-align: middle; }
1206 |
1207 | .reveal .overlay.overlay-help .viewport .viewport-inner table th {
1208 | padding-top: 20px;
1209 | padding-bottom: 20px; }
1210 |
1211 | /*********************************************
1212 | * PLAYBACK COMPONENT
1213 | *********************************************/
1214 | .reveal .playback {
1215 | position: fixed;
1216 | left: 15px;
1217 | bottom: 20px;
1218 | z-index: 30;
1219 | cursor: pointer;
1220 | -webkit-transition: all 400ms ease;
1221 | transition: all 400ms ease; }
1222 |
1223 | .reveal.overview .playback {
1224 | opacity: 0;
1225 | visibility: hidden; }
1226 |
1227 | /*********************************************
1228 | * ROLLING LINKS
1229 | *********************************************/
1230 | .reveal .roll {
1231 | display: inline-block;
1232 | line-height: 1.2;
1233 | overflow: hidden;
1234 | vertical-align: top;
1235 | -webkit-perspective: 400px;
1236 | perspective: 400px;
1237 | -webkit-perspective-origin: 50% 50%;
1238 | perspective-origin: 50% 50%; }
1239 |
1240 | .reveal .roll:hover {
1241 | background: none;
1242 | text-shadow: none; }
1243 |
1244 | .reveal .roll span {
1245 | display: block;
1246 | position: relative;
1247 | padding: 0 2px;
1248 | pointer-events: none;
1249 | -webkit-transition: all 400ms ease;
1250 | transition: all 400ms ease;
1251 | -webkit-transform-origin: 50% 0%;
1252 | transform-origin: 50% 0%;
1253 | -webkit-transform-style: preserve-3d;
1254 | transform-style: preserve-3d;
1255 | -webkit-backface-visibility: hidden;
1256 | backface-visibility: hidden; }
1257 |
1258 | .reveal .roll:hover span {
1259 | background: rgba(0, 0, 0, 0.5);
1260 | -webkit-transform: translate3d(0px, 0px, -45px) rotateX(90deg);
1261 | transform: translate3d(0px, 0px, -45px) rotateX(90deg); }
1262 |
1263 | .reveal .roll span:after {
1264 | content: attr(data-title);
1265 | display: block;
1266 | position: absolute;
1267 | left: 0;
1268 | top: 0;
1269 | padding: 0 2px;
1270 | -webkit-backface-visibility: hidden;
1271 | backface-visibility: hidden;
1272 | -webkit-transform-origin: 50% 0%;
1273 | transform-origin: 50% 0%;
1274 | -webkit-transform: translate3d(0px, 110%, 0px) rotateX(-90deg);
1275 | transform: translate3d(0px, 110%, 0px) rotateX(-90deg); }
1276 |
1277 | /*********************************************
1278 | * SPEAKER NOTES
1279 | *********************************************/
1280 | .reveal aside.notes {
1281 | display: none; }
1282 |
1283 | .reveal .speaker-notes {
1284 | display: none;
1285 | position: absolute;
1286 | width: 70%;
1287 | max-height: 15%;
1288 | left: 15%;
1289 | bottom: 26px;
1290 | padding: 10px;
1291 | z-index: 1;
1292 | font-size: 18px;
1293 | line-height: 1.4;
1294 | color: #fff;
1295 | background-color: rgba(0, 0, 0, 0.5);
1296 | overflow: auto;
1297 | box-sizing: border-box;
1298 | text-align: left;
1299 | font-family: Helvetica, sans-serif;
1300 | -webkit-overflow-scrolling: touch; }
1301 |
1302 | .reveal .speaker-notes.visible:not(:empty) {
1303 | display: block; }
1304 |
1305 | @media screen and (max-width: 1024px) {
1306 | .reveal .speaker-notes {
1307 | font-size: 14px; } }
1308 |
1309 | @media screen and (max-width: 600px) {
1310 | .reveal .speaker-notes {
1311 | width: 90%;
1312 | left: 5%; } }
1313 |
1314 | /*********************************************
1315 | * ZOOM PLUGIN
1316 | *********************************************/
1317 | .zoomed .reveal *,
1318 | .zoomed .reveal *:before,
1319 | .zoomed .reveal *:after {
1320 | -webkit-backface-visibility: visible !important;
1321 | backface-visibility: visible !important; }
1322 |
1323 | .zoomed .reveal .progress,
1324 | .zoomed .reveal .controls {
1325 | opacity: 0; }
1326 |
1327 | .zoomed .reveal .roll span {
1328 | background: none; }
1329 |
1330 | .zoomed .reveal .roll span:after {
1331 | visibility: hidden; }
1332 |
--------------------------------------------------------------------------------
/slideResources/reveal.min.js:
--------------------------------------------------------------------------------
1 | !function(e,t){"function"==typeof define&&define.amd?define(function(){return e.Reveal=t(),e.Reveal}):"object"==typeof exports?module.exports=t():e.Reveal=t()}(this,function(){"use strict";function e(e){if(t(),Vt.transforms2d||Vt.transforms3d){jt.wrapper=document.querySelector(".reveal"),jt.slides=document.querySelector(".reveal .slides"),window.addEventListener("load",R,!1);var n=kt.getQueryHash();"undefined"!=typeof n.dependencies&&delete n.dependencies,v(zt,e),v(zt,n),q(),r()}else{document.body.setAttribute("class","no-transforms");for(var a=g(document.getElementsByTagName("img")),i=g(document.getElementsByTagName("iframe")),o=a.concat(i),s=0,l=o.length;l>s;s++){var c=o[s];c.getAttribute("data-src")&&(c.setAttribute("src",c.getAttribute("data-src")),c.removeAttribute("data-src"))}}}function t(){qt=/(iphone|ipod|ipad|android)/gi.test(Dt),Mt=/chrome/i.test(Dt)&&!/edge/i.test(Dt);var e=document.createElement("div");Vt.transforms3d="WebkitPerspective"in e.style||"MozPerspective"in e.style||"msPerspective"in e.style||"OPerspective"in e.style||"perspective"in e.style,Vt.transforms2d="WebkitTransform"in e.style||"MozTransform"in e.style||"msTransform"in e.style||"OTransform"in e.style||"transform"in e.style,Vt.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,Vt.requestAnimationFrame="function"==typeof Vt.requestAnimationFrameMethod,Vt.canvas=!!document.createElement("canvas").getContext,Vt.overviewTransitions=!/Version\/[\d\.]+.*Safari/.test(Dt),Vt.zoom="zoom"in e.style&&!qt&&(Mt||/Version\/[\d\.]+.*Safari/.test(Dt))}function r(){function e(){a.length&&head.js.apply(null,a),n()}function t(t){head.ready(t.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],function(){"function"==typeof t.callback&&t.callback.apply(this),0===--i&&e()})}for(var r=[],a=[],i=0,o=0,s=zt.dependencies.length;s>o;o++){var l=zt.dependencies[o];l.condition&&!l.condition()||(l.async?a.push(l.src):r.push(l.src),t(l))}r.length?(i=r.length,head.js.apply(null,r)):e()}function n(){a(),u(),s(),ae(),p(),qe(),he(!0),setTimeout(function(){jt.slides.classList.remove("no-transition"),Rt=!0,N("ready",{indexh:Lt,indexv:At,currentSlide:St})},1),x()&&(h(),"complete"===document.readyState?o():window.addEventListener("load",o))}function a(){jt.slides.classList.add("no-transition"),jt.background=l(jt.wrapper,"div","backgrounds",null),jt.progress=l(jt.wrapper,"div","progress"," "),jt.progressbar=jt.progress.querySelector("span"),l(jt.wrapper,"aside","controls",' '),jt.slideNumber=l(jt.wrapper,"div","slide-number",""),jt.speakerNotes=l(jt.wrapper,"div","speaker-notes",null),jt.speakerNotes.setAttribute("data-prevent-swipe",""),l(jt.wrapper,"div","pause-overlay",null),jt.controls=document.querySelector(".reveal .controls"),jt.theme=document.querySelector("#theme"),jt.wrapper.setAttribute("role","application"),jt.controlsLeft=g(document.querySelectorAll(".navigate-left")),jt.controlsRight=g(document.querySelectorAll(".navigate-right")),jt.controlsUp=g(document.querySelectorAll(".navigate-up")),jt.controlsDown=g(document.querySelectorAll(".navigate-down")),jt.controlsPrev=g(document.querySelectorAll(".navigate-prev")),jt.controlsNext=g(document.querySelectorAll(".navigate-next")),jt.statusDiv=i()}function i(){var e=document.getElementById("aria-status-div");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.setAttribute("id","aria-status-div"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),jt.wrapper.appendChild(e)),e}function o(){var e=O(window.innerWidth,window.innerHeight),t=Math.floor(e.width*(1+zt.margin)),r=Math.floor(e.height*(1+zt.margin)),n=e.width,a=e.height;k("@page{size:"+t+"px "+r+"px; margin: 0;}"),k(".reveal section>img, .reveal section>video, .reveal section>iframe{max-width: "+n+"px; max-height:"+a+"px}"),document.body.classList.add("print-pdf"),document.body.style.width=t+"px",document.body.style.height=r+"px",g(jt.wrapper.querySelectorAll(Ct)).forEach(function(e,t){e.setAttribute("data-index-h",t),e.classList.contains("stack")&&g(e.querySelectorAll("section")).forEach(function(e,r){e.setAttribute("data-index-h",t),e.setAttribute("data-index-v",r)})}),g(jt.wrapper.querySelectorAll(It)).forEach(function(e){if(e.classList.contains("stack")===!1){var i=(t-n)/2,o=(r-a)/2,s=E(e),l=Math.max(Math.ceil(s/r),1);(1===l&&zt.center||e.classList.contains("center"))&&(o=Math.max((r-s)/2,0)),e.style.left=i+"px",e.style.top=o+"px",e.style.width=n+"px";var c=e.querySelector(".slide-background");if(c&&(c.style.width=t+"px",c.style.height=r*l+"px",c.style.top=-o+"px",c.style.left=-i+"px"),zt.showNotes){var d=Pe(e);if(d){var u=8,p=document.createElement("div");p.classList.add("speaker-notes"),p.classList.add("speaker-notes-pdf"),p.innerHTML=d,p.style.left=u-i+"px",p.style.bottom=u-o+"px",p.style.width=t-2*u+"px",e.appendChild(p)}}if(zt.slideNumber){var f=parseInt(e.getAttribute("data-index-h"),10)+1,h=parseInt(e.getAttribute("data-index-v"),10)+1,v=document.createElement("div");v.classList.add("slide-number"),v.classList.add("slide-number-pdf"),v.innerHTML=pe(f,".",h),c.appendChild(v)}}}),g(jt.wrapper.querySelectorAll(It+" .fragment")).forEach(function(e){e.classList.add("visible")})}function s(){setInterval(function(){0===jt.wrapper.scrollTop&&0===jt.wrapper.scrollLeft||(jt.wrapper.scrollTop=0,jt.wrapper.scrollLeft=0)},1e3)}function l(e,t,r,n){for(var a=e.querySelectorAll("."+r),i=0;i1&&zt.autoSlide&&zt.autoSlideStoppable&&Vt.canvas&&Vt.requestAnimationFrame&&(Nt=new wt(jt.wrapper,function(){return Math.min(Math.max((Date.now()-Jt)/_t,0),1)}),Nt.on("click",yt),Qt=!1),zt.fragments===!1&&g(jt.slides.querySelectorAll(".fragment")).forEach(function(e){e.classList.add("visible"),e.classList.remove("current-fragment")}),ne()}function f(){if(Kt=!0,window.addEventListener("hashchange",ht,!1),window.addEventListener("resize",vt,!1),zt.touch&&(jt.wrapper.addEventListener("touchstart",et,!1),jt.wrapper.addEventListener("touchmove",tt,!1),jt.wrapper.addEventListener("touchend",rt,!1),window.navigator.pointerEnabled?(jt.wrapper.addEventListener("pointerdown",nt,!1),jt.wrapper.addEventListener("pointermove",at,!1),jt.wrapper.addEventListener("pointerup",it,!1)):window.navigator.msPointerEnabled&&(jt.wrapper.addEventListener("MSPointerDown",nt,!1),jt.wrapper.addEventListener("MSPointerMove",at,!1),jt.wrapper.addEventListener("MSPointerUp",it,!1))),zt.keyboard&&(document.addEventListener("keydown",Ge,!1),document.addEventListener("keypress",Qe,!1)),zt.progress&&jt.progress&&jt.progress.addEventListener("click",st,!1),zt.focusBodyOnPageVisibilityChange){var e;"hidden"in document?e="visibilitychange":"msHidden"in document?e="msvisibilitychange":"webkitHidden"in document&&(e="webkitvisibilitychange"),e&&document.addEventListener(e,gt,!1)}var t=["touchstart","click"];Dt.match(/android/gi)&&(t=["touchstart"]),t.forEach(function(e){jt.controlsLeft.forEach(function(t){t.addEventListener(e,lt,!1)}),jt.controlsRight.forEach(function(t){t.addEventListener(e,ct,!1)}),jt.controlsUp.forEach(function(t){t.addEventListener(e,dt,!1)}),jt.controlsDown.forEach(function(t){t.addEventListener(e,ut,!1)}),jt.controlsPrev.forEach(function(t){t.addEventListener(e,pt,!1)}),jt.controlsNext.forEach(function(t){t.addEventListener(e,ft,!1)})})}function h(){Kt=!1,document.removeEventListener("keydown",Ge,!1),document.removeEventListener("keypress",Qe,!1),window.removeEventListener("hashchange",ht,!1),window.removeEventListener("resize",vt,!1),jt.wrapper.removeEventListener("touchstart",et,!1),jt.wrapper.removeEventListener("touchmove",tt,!1),jt.wrapper.removeEventListener("touchend",rt,!1),window.navigator.pointerEnabled?(jt.wrapper.removeEventListener("pointerdown",nt,!1),jt.wrapper.removeEventListener("pointermove",at,!1),jt.wrapper.removeEventListener("pointerup",it,!1)):window.navigator.msPointerEnabled&&(jt.wrapper.removeEventListener("MSPointerDown",nt,!1),jt.wrapper.removeEventListener("MSPointerMove",at,!1),jt.wrapper.removeEventListener("MSPointerUp",it,!1)),zt.progress&&jt.progress&&jt.progress.removeEventListener("click",st,!1),["touchstart","click"].forEach(function(e){jt.controlsLeft.forEach(function(t){t.removeEventListener(e,lt,!1)}),jt.controlsRight.forEach(function(t){t.removeEventListener(e,ct,!1)}),jt.controlsUp.forEach(function(t){t.removeEventListener(e,dt,!1)}),jt.controlsDown.forEach(function(t){t.removeEventListener(e,ut,!1)}),jt.controlsPrev.forEach(function(t){t.removeEventListener(e,pt,!1)}),jt.controlsNext.forEach(function(t){t.removeEventListener(e,ft,!1)})})}function v(e,t){for(var r in t)e[r]=t[r]}function g(e){return Array.prototype.slice.call(e)}function m(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}function b(e,t){var r=e.x-t.x,n=e.y-t.y;return Math.sqrt(r*r+n*n)}function y(e,t){e.style.WebkitTransform=t,e.style.MozTransform=t,e.style.msTransform=t,e.style.transform=t}function w(e){"string"==typeof e.layout&&(Xt.layout=e.layout),"string"==typeof e.overview&&(Xt.overview=e.overview),Xt.layout?y(jt.slides,Xt.layout+" "+Xt.overview):y(jt.slides,Xt.overview)}function k(e){var t=document.createElement("style");t.type="text/css",t.styleSheet?t.styleSheet.cssText=e:t.appendChild(document.createTextNode(e)),document.getElementsByTagName("head")[0].appendChild(t)}function L(e){var 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)};var r=e.match(/^#([0-9a-f]{6})$/i);if(r&&r[1])return r=r[1],{r:parseInt(r.substr(0,2),16),g:parseInt(r.substr(2,2),16),b:parseInt(r.substr(4,2),16)};var n=e.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i);if(n)return{r:parseInt(n[1],10),g:parseInt(n[2],10),b:parseInt(n[3],10)};var 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}function A(e){return"string"==typeof e&&(e=L(e)),e?(299*e.r+587*e.g+114*e.b)/1e3:null}function E(e){var t=0;if(e){var r=0;g(e.childNodes).forEach(function(e){"number"==typeof e.offsetTop&&e.style&&("absolute"===window.getComputedStyle(e).position&&(r+=1),t=Math.max(t,e.offsetTop+e.offsetHeight))}),0===r&&(t=e.offsetHeight)}return t}function S(e,t){if(t=t||0,e){var r,n=e.style.height;return e.style.height="0px",r=t-e.parentNode.offsetHeight,e.style.height=n+"px",r}return t}function x(){return/print-pdf/gi.test(window.location.search)}function q(){zt.hideAddressBar&&qt&&(window.addEventListener("load",M,!1),window.addEventListener("orientationchange",M,!1))}function M(){setTimeout(function(){window.scrollTo(0,1)},10)}function N(e,t){var r=document.createEvent("HTMLEvents",1,2);r.initEvent(e,!0,!0),v(r,t),jt.wrapper.dispatchEvent(r),zt.postMessageEvents&&window.parent!==window.self&&window.parent.postMessage(JSON.stringify({namespace:"reveal",eventName:e,state:He()}),"*")}function T(){if(Vt.transforms3d&&!("msPerspective"in document.body.style))for(var e=jt.wrapper.querySelectorAll(It+" a"),t=0,r=e.length;r>t;t++){var n=e[t];if(n.textContent&&!n.querySelector("*")&&(!n.className||!n.classList.contains(n,"roll"))){var a=document.createElement("span");a.setAttribute("data-title",n.text),a.innerHTML=n.innerHTML,n.classList.add("roll"),n.innerHTML="",n.appendChild(a)}}}function I(){for(var e=jt.wrapper.querySelectorAll(It+" a.roll"),t=0,r=e.length;r>t;t++){var n=e[t],a=n.querySelector("span");a&&(n.classList.remove("roll"),n.innerHTML=a.innerHTML)}}function C(e){var t=g(document.querySelectorAll(e?e:"a"));t.forEach(function(e){/^(http|www)/gi.test(e.getAttribute("href"))&&e.addEventListener("click",bt,!1)})}function P(){var e=g(document.querySelectorAll("a"));e.forEach(function(e){/^(http|www)/gi.test(e.getAttribute("href"))&&e.removeEventListener("click",bt,!1)})}function H(e){z(),jt.overlay=document.createElement("div"),jt.overlay.classList.add("overlay"),jt.overlay.classList.add("overlay-preview"),jt.wrapper.appendChild(jt.overlay),jt.overlay.innerHTML=["",'
','','',"
"].join(""),jt.overlay.querySelector("iframe").addEventListener("load",function(e){jt.overlay.classList.add("loaded")},!1),jt.overlay.querySelector(".close").addEventListener("click",function(e){z(),e.preventDefault()},!1),jt.overlay.querySelector(".external").addEventListener("click",function(e){z()},!1),setTimeout(function(){jt.overlay.classList.add("visible")},1)}function D(){if(zt.help){z(),jt.overlay=document.createElement("div"),jt.overlay.classList.add("overlay"),jt.overlay.classList.add("overlay-help"),jt.wrapper.appendChild(jt.overlay);var e='Keyboard Shortcuts
';e+="KEY ACTION ";for(var t in er)e+=""+t+" "+er[t]+" ";e+="
",jt.overlay.innerHTML=["",'"].join(""),jt.overlay.querySelector(".close").addEventListener("click",function(e){z(),e.preventDefault()},!1),setTimeout(function(){jt.overlay.classList.add("visible")},1)}}function z(){jt.overlay&&(jt.overlay.parentNode.removeChild(jt.overlay),jt.overlay=null)}function R(){if(jt.wrapper&&!x()){var e=O(),t=20;W(zt.width,zt.height,t),jt.slides.style.width=e.width+"px",jt.slides.style.height=e.height+"px",Yt=Math.min(e.presentationWidth/e.width,e.presentationHeight/e.height),Yt=Math.max(Yt,zt.minScale),Yt=Math.min(Yt,zt.maxScale),1===Yt?(jt.slides.style.zoom="",jt.slides.style.left="",jt.slides.style.top="",jt.slides.style.bottom="",jt.slides.style.right="",w({layout:""})):Yt>1&&Vt.zoom?(jt.slides.style.zoom=Yt,jt.slides.style.left="",jt.slides.style.top="",jt.slides.style.bottom="",jt.slides.style.right="",w({layout:""})):(jt.slides.style.zoom="",jt.slides.style.left="50%",jt.slides.style.top="50%",jt.slides.style.bottom="auto",jt.slides.style.right="auto",w({layout:"translate(-50%, -50%) scale("+Yt+")"}));for(var r=g(jt.wrapper.querySelectorAll(It)),n=0,a=r.length;a>n;n++){var i=r[n];"none"!==i.style.display&&(zt.center||i.classList.contains("center")?i.classList.contains("stack")?i.style.top=0:i.style.top=Math.max((e.height-E(i))/2-t,0)+"px":i.style.top="")}de(),ve()}}function W(e,t,r){g(jt.slides.querySelectorAll("section > .stretch")).forEach(function(r){var n=S(r,t);if(/(img|video)/gi.test(r.nodeName)){var a=r.naturalWidth||r.videoWidth,i=r.naturalHeight||r.videoHeight,o=Math.min(e/a,n/i);r.style.width=a*o+"px",r.style.height=i*o+"px"}else r.style.width=e+"px",r.style.height=n+"px"})}function O(e,t){var r={width:zt.width,height:zt.height,presentationWidth:e||jt.wrapper.offsetWidth,presentationHeight:t||jt.wrapper.offsetHeight};return r.presentationWidth-=r.presentationWidth*zt.margin,r.presentationHeight-=r.presentationHeight*zt.margin,"string"==typeof r.width&&/%$/.test(r.width)&&(r.width=parseInt(r.width,10)/100*r.presentationWidth),"string"==typeof r.height&&/%$/.test(r.height)&&(r.height=parseInt(r.height,10)/100*r.presentationHeight),r}function B(e,t){"object"==typeof e&&"function"==typeof e.setAttribute&&e.setAttribute("data-previous-indexv",t||0)}function F(e){if("object"==typeof e&&"function"==typeof e.setAttribute&&e.classList.contains("stack")){var t=e.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(e.getAttribute(t)||0,10)}return 0}function Y(){if(zt.overview&&!$()){Wt=!0,jt.wrapper.classList.add("overview"),jt.wrapper.classList.remove("overview-deactivating"),Vt.overviewTransitions&&setTimeout(function(){jt.wrapper.classList.add("overview-animated")},1),Fe(),jt.slides.appendChild(jt.background),g(jt.wrapper.querySelectorAll(It)).forEach(function(e){e.classList.contains("stack")||e.addEventListener("click",mt,!0)});var e=70,t=O();Ot=t.width+e,Bt=t.height+e,zt.rtl&&(Ot=-Ot),le(),X(),j(),R(),N("overviewshown",{indexh:Lt,indexv:At,currentSlide:St})}}function X(){g(jt.wrapper.querySelectorAll(Ct)).forEach(function(e,t){e.setAttribute("data-index-h",t),y(e,"translate3d("+t*Ot+"px, 0, 0)"),e.classList.contains("stack")&&g(e.querySelectorAll("section")).forEach(function(e,r){e.setAttribute("data-index-h",t),e.setAttribute("data-index-v",r),y(e,"translate3d(0, "+r*Bt+"px, 0)")})}),g(jt.background.childNodes).forEach(function(e,t){y(e,"translate3d("+t*Ot+"px, 0, 0)"),g(e.querySelectorAll(".slide-background")).forEach(function(e,t){y(e,"translate3d(0, "+t*Bt+"px, 0)")})})}function j(){w({overview:["translateX("+-Lt*Ot+"px)","translateY("+-At*Bt+"px)","translateZ("+(window.innerWidth<400?-1e3:-2500)+"px)"].join(" ")})}function V(){zt.overview&&(Wt=!1,jt.wrapper.classList.remove("overview"),jt.wrapper.classList.remove("overview-animated"),jt.wrapper.classList.add("overview-deactivating"),setTimeout(function(){jt.wrapper.classList.remove("overview-deactivating")},1),jt.wrapper.appendChild(jt.background),g(jt.wrapper.querySelectorAll(It)).forEach(function(e){y(e,""),e.removeEventListener("click",mt,!0)}),g(jt.background.querySelectorAll(".slide-background")).forEach(function(e){y(e,"")}),w({overview:""}),re(Lt,At),R(),Be(),N("overviewhidden",{indexh:Lt,indexv:At,currentSlide:St}))}function U(e){"boolean"==typeof e?e?Y():V():$()?V():Y()}function $(){return Wt}function K(e){return e=e?e:St,e&&e.parentNode&&!!e.parentNode.nodeName.match(/section/i)}function _(){var e=document.body,t=e.requestFullScreen||e.webkitRequestFullscreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullscreen;t&&t.apply(e)}function Z(){if(zt.pause){var e=jt.wrapper.classList.contains("paused");Fe(),jt.wrapper.classList.add("paused"),e===!1&&N("paused")}}function J(){var e=jt.wrapper.classList.contains("paused");jt.wrapper.classList.remove("paused"),Be(),e&&N("resumed")}function Q(e){"boolean"==typeof e?e?Z():J():G()?J():Z()}function G(){return jt.wrapper.classList.contains("paused")}function ee(e){"boolean"==typeof e?e?Xe():Ye():Qt?Xe():Ye()}function te(){return!(!_t||Qt)}function re(e,t,r,n){Et=St;var a=jt.wrapper.querySelectorAll(Ct);void 0!==t||$()||(t=F(a[e])),Et&&Et.parentNode&&Et.parentNode.classList.contains("stack")&&B(Et.parentNode,At);var i=Ft.concat();Ft.length=0;var o=Lt||0,s=At||0;Lt=se(Ct,void 0===e?Lt:e),At=se(Pt,void 0===t?At:t),le(),R();e:for(var l=0,c=Ft.length;c>l;l++){for(var d=0;d0&&(e.classList.remove("present"),e.classList.remove("past"),e.classList.add("future"),e.setAttribute("aria-hidden","true"))})})}function ie(){var e=g(jt.wrapper.querySelectorAll(Ct));e.forEach(function(e){var t=g(e.querySelectorAll("section"));t.forEach(function(e,t){ze(e.querySelectorAll(".fragment"))}),0===t.length&&ze(e.querySelectorAll(".fragment"))})}function oe(){var e=g(jt.wrapper.querySelectorAll(Ct));e.forEach(function(t){jt.slides.insertBefore(t,e[Math.floor(Math.random()*e.length)])})}function se(e,t){var r=g(jt.wrapper.querySelectorAll(e)),n=r.length,a=x();if(n){zt.loop&&(t%=n,0>t&&(t=n+t)),t=Math.max(Math.min(t,n-1),0);for(var i=0;n>i;i++){var o=r[i],s=zt.rtl&&!K(o);if(o.classList.remove("past"),o.classList.remove("present"),o.classList.remove("future"),o.setAttribute("hidden",""),o.setAttribute("aria-hidden","true"),o.querySelector("section")&&o.classList.add("stack"),a)o.classList.add("present");else if(t>i){if(o.classList.add(s?"future":"past"),zt.fragments)for(var l=g(o.querySelectorAll(".fragment"));l.length;){var c=l.pop();c.classList.add("visible"),c.classList.remove("current-fragment")}}else if(i>t&&(o.classList.add(s?"past":"future"),zt.fragments))for(var d=g(o.querySelectorAll(".fragment.visible"));d.length;){var u=d.pop();u.classList.remove("visible"),u.classList.remove("current-fragment")}}r[t].classList.add("present"),r[t].removeAttribute("hidden"),r[t].removeAttribute("aria-hidden");var p=r[t].getAttribute("data-state");p&&(Ft=Ft.concat(p.split(" ")))}else t=0;return t}function le(){var e,t,r=g(jt.wrapper.querySelectorAll(Ct)),n=r.length;if(n&&"undefined"!=typeof Lt){var a=$()?10:zt.viewDistance;qt&&(a=$()?6:2),x()&&(a=Number.MAX_VALUE);for(var i=0;n>i;i++){var o=r[i],s=g(o.querySelectorAll("section")),l=s.length;if(e=Math.abs((Lt||0)-i)||0,zt.loop&&(e=Math.abs(((Lt||0)-i)%(n-a))||0),a>e?ge(o):me(o),l)for(var c=F(o),d=0;l>d;d++){var u=s[d];t=i===(Lt||0)?Math.abs((At||0)-d):Math.abs(d-c),a>e+t?ge(u):me(u)}}}}function ce(){zt.showNotes&&jt.speakerNotes&&St&&!x()&&(jt.speakerNotes.innerHTML=Pe()||"")}function de(){zt.progress&&jt.progressbar&&(jt.progressbar.style.width=Se()*jt.wrapper.offsetWidth+"px")}function ue(){if(zt.slideNumber&&jt.slideNumber){var e=[],t="h.v";switch("string"==typeof zt.slideNumber&&(t=zt.slideNumber),t){case"c":e.push(Ee()+1);break;case"c/t":e.push(Ee()+1,"/",Te());break;case"h/v":e.push(Lt+1),K()&&e.push("/",At+1);break;default:e.push(Lt+1),K()&&e.push(".",At+1)}jt.slideNumber.innerHTML=pe(e[0],e[1],e[2])}}function pe(e,t,r){return"number"!=typeof r||isNaN(r)?''+e+" ":''+e+' '+t+' '+r+" "}function fe(){var e=be(),t=ye();jt.controlsLeft.concat(jt.controlsRight).concat(jt.controlsUp).concat(jt.controlsDown).concat(jt.controlsPrev).concat(jt.controlsNext).forEach(function(e){e.classList.remove("enabled"),e.classList.remove("fragmented")}),e.left&&jt.controlsLeft.forEach(function(e){e.classList.add("enabled")}),e.right&&jt.controlsRight.forEach(function(e){e.classList.add("enabled")}),e.up&&jt.controlsUp.forEach(function(e){e.classList.add("enabled")}),e.down&&jt.controlsDown.forEach(function(e){e.classList.add("enabled")}),(e.left||e.up)&&jt.controlsPrev.forEach(function(e){e.classList.add("enabled")}),(e.right||e.down)&&jt.controlsNext.forEach(function(e){e.classList.add("enabled")}),St&&(t.prev&&jt.controlsPrev.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&jt.controlsNext.forEach(function(e){e.classList.add("fragmented","enabled")}),K(St)?(t.prev&&jt.controlsUp.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&jt.controlsDown.forEach(function(e){e.classList.add("fragmented","enabled")})):(t.prev&&jt.controlsLeft.forEach(function(e){e.classList.add("fragmented","enabled")}),t.next&&jt.controlsRight.forEach(function(e){e.classList.add("fragmented","enabled")})))}function he(e){var t=null,r=zt.rtl?"future":"past",n=zt.rtl?"past":"future";if(g(jt.background.childNodes).forEach(function(a,i){a.classList.remove("past"),a.classList.remove("present"),a.classList.remove("future"),Lt>i?a.classList.add(r):i>Lt?a.classList.add(n):(a.classList.add("present"),t=a),(e||i===Lt)&&g(a.querySelectorAll(".slide-background")).forEach(function(e,r){e.classList.remove("past"),e.classList.remove("present"),e.classList.remove("future"),At>r?e.classList.add("past"):r>At?e.classList.add("future"):(e.classList.add("present"),i===Lt&&(t=e))})}),xt){var a=xt.querySelector("video");a&&a.pause()}if(t){var i=t.querySelector("video");if(i){var o=function(){i.currentTime=0,i.play(),i.removeEventListener("loadeddata",o)};i.readyState>1?o():i.addEventListener("loadeddata",o)}var s=t.style.backgroundImage||"";/\.gif/i.test(s)&&(t.style.backgroundImage="",window.getComputedStyle(t).opacity,t.style.backgroundImage=s);var l=xt?xt.getAttribute("data-background-hash"):null,c=t.getAttribute("data-background-hash");c&&c===l&&t!==xt&&jt.background.classList.add("no-transition"),xt=t}St&&["has-light-background","has-dark-background"].forEach(function(e){St.classList.contains(e)?jt.wrapper.classList.add(e):jt.wrapper.classList.remove(e)}),setTimeout(function(){jt.background.classList.remove("no-transition")},1)}function ve(){if(zt.parallaxBackgroundImage){var e,t,r=jt.wrapper.querySelectorAll(Ct),n=jt.wrapper.querySelectorAll(Pt),a=jt.background.style.backgroundSize.split(" ");1===a.length?e=t=parseInt(a[0],10):(e=parseInt(a[0],10),t=parseInt(a[1],10));var i,o,s=jt.background.offsetWidth,l=r.length;i="number"==typeof zt.parallaxBackgroundHorizontal?zt.parallaxBackgroundHorizontal:l>1?(e-s)/(l-1):0,o=i*Lt*-1;var c,d,u=jt.background.offsetHeight,p=n.length;c="number"==typeof zt.parallaxBackgroundVertical?zt.parallaxBackgroundVertical:(t-u)/(p-1),d=p>0?c*At*1:0,jt.background.style.backgroundPosition=o+"px "+-d+"px"}}function ge(e){e.style.display="block",g(e.querySelectorAll("img[data-src], video[data-src], audio[data-src]")).forEach(function(e){e.setAttribute("src",e.getAttribute("data-src")),e.removeAttribute("data-src")}),g(e.querySelectorAll("video, audio")).forEach(function(e){var t=0;g(e.querySelectorAll("source[data-src]")).forEach(function(e){e.setAttribute("src",e.getAttribute("data-src")),e.removeAttribute("data-src"),t+=1}),t>0&&e.load()});var t=Ne(e),r=Ce(t.h,t.v);if(r&&(r.style.display="block",r.hasAttribute("data-loaded")===!1)){r.setAttribute("data-loaded","true");var n=e.getAttribute("data-background-image"),a=e.getAttribute("data-background-video"),i=e.hasAttribute("data-background-video-loop"),o=e.hasAttribute("data-background-video-muted"),s=e.getAttribute("data-background-iframe");if(n)r.style.backgroundImage="url("+n+")";else if(a&&!xe()){var l=document.createElement("video");i&&l.setAttribute("loop",""),o&&(l.muted=!0),a.split(",").forEach(function(e){l.innerHTML+=''}),r.appendChild(l)}else if(s){var c=document.createElement("iframe");c.setAttribute("src",s),c.style.width="100%",c.style.height="100%",c.style.maxHeight="100%",c.style.maxWidth="100%",r.appendChild(c)}}}function me(e){e.style.display="none";var t=Ne(e),r=Ce(t.h,t.v);r&&(r.style.display="none")}function be(){var e=jt.wrapper.querySelectorAll(Ct),t=jt.wrapper.querySelectorAll(Pt),r={left:Lt>0||zt.loop,right:Lt0,down:At0,next:!!t.length}}return{prev:!1,next:!1}}function we(){var e=function(e,t,r){g(jt.slides.querySelectorAll("iframe["+e+'*="'+t+'"]')).forEach(function(t){var n=t.getAttribute(e);n&&-1===n.indexOf(r)&&t.setAttribute(e,n+(/\?/.test(n)?"&":"?")+r)})};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")}function ke(e){e&&!xe()&&(g(e.querySelectorAll('img[src$=".gif"]')).forEach(function(e){
2 | e.setAttribute("src",e.getAttribute("src"))}),g(e.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-autoplay")&&"function"==typeof e.play&&e.play()}),g(e.querySelectorAll("iframe[src]")).forEach(function(e){Le({target:e})}),g(e.querySelectorAll("iframe[data-src]")).forEach(function(e){e.getAttribute("src")!==e.getAttribute("data-src")&&(e.removeEventListener("load",Le),e.addEventListener("load",Le),e.setAttribute("src",e.getAttribute("data-src")))}))}function Le(e){var t=e.target;/youtube\.com\/embed\//.test(t.getAttribute("src"))&&t.hasAttribute("data-autoplay")?t.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*"):/player\.vimeo\.com\//.test(t.getAttribute("src"))&&t.hasAttribute("data-autoplay")?t.contentWindow.postMessage('{"method":"play"}',"*"):t.contentWindow.postMessage("slide:start","*")}function Ae(e){e&&e.parentNode&&(g(e.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-ignore")||"function"!=typeof e.pause||e.pause()}),g(e.querySelectorAll("iframe")).forEach(function(e){e.contentWindow.postMessage("slide:stop","*"),e.removeEventListener("load",Le)}),g(e.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(e){e.hasAttribute("data-ignore")||"function"!=typeof e.contentWindow.postMessage||e.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}),g(e.querySelectorAll('iframe[src*="player.vimeo.com/"]')).forEach(function(e){e.hasAttribute("data-ignore")||"function"!=typeof e.contentWindow.postMessage||e.contentWindow.postMessage('{"method":"pause"}',"*")}),g(e.querySelectorAll("iframe[data-src]")).forEach(function(e){e.setAttribute("src","about:blank"),e.removeAttribute("src")}))}function Ee(){var e=g(jt.wrapper.querySelectorAll(Ct)),t=0;e:for(var r=0;r0){var n=St.querySelectorAll(".fragment.visible"),a=.9;t+=n.length/r.length*a}}return t/(e-1)}function xe(){return!!window.location.search.match(/receiver/gi)}function qe(){var e=window.location.hash,t=e.slice(2).split("/"),r=e.replace(/#|\//gi,"");if(isNaN(parseInt(t[0],10))&&r.length){var n;if(/^[a-zA-Z][\w:.-]*$/.test(r)&&(n=document.getElementById(r)),n){var a=kt.getIndices(n);re(a.h,a.v)}else re(Lt||0,At||0)}else{var i=parseInt(t[0],10)||0,o=parseInt(t[1],10)||0;i===Lt&&o===At||re(i,o)}}function Me(e){if(zt.history)if(clearTimeout($t),"number"==typeof e)$t=setTimeout(Me,e);else if(St){var t="/",r=St.getAttribute("id");r&&(r=r.replace(/[^a-zA-Z0-9\-\_\:\.]/g,"")),"string"==typeof r&&r.length?t="/"+r:((Lt>0||At>0)&&(t+=Lt),At>0&&(t+="/"+At)),window.location.hash=t}}function Ne(e){var t,r=Lt,n=At;if(e){var a=K(e),i=a?e.parentNode:e,o=g(jt.wrapper.querySelectorAll(Ct));r=Math.max(o.indexOf(i),0),n=void 0,a&&(n=Math.max(g(e.parentNode.querySelectorAll("section")).indexOf(e),0))}if(!e&&St){var s=St.querySelectorAll(".fragment").length>0;if(s){var l=St.querySelector(".current-fragment");t=l&&l.hasAttribute("data-fragment-index")?parseInt(l.getAttribute("data-fragment-index"),10):St.querySelectorAll(".fragment.visible").length-1}}return{h:r,v:n,f:t}}function Te(){return jt.wrapper.querySelectorAll(It+":not(.stack)").length}function Ie(e,t){var r=jt.wrapper.querySelectorAll(Ct)[e],n=r&&r.querySelectorAll("section");return n&&n.length&&"number"==typeof t?n?n[t]:void 0:r}function Ce(e,t){if(!x()){var r=jt.wrapper.querySelectorAll(".backgrounds>.slide-background")[e],n=r&&r.querySelectorAll(".slide-background");return n&&n.length&&"number"==typeof t?n?n[t]:void 0:r}var a=Ie(e,t);if(a){var i=a.querySelector(".slide-background");if(i&&i.parentNode===a)return i}}function Pe(e){if(e=e||St,e.hasAttribute("data-notes"))return e.getAttribute("data-notes");var t=e.querySelector("aside.notes");return t?t.innerHTML:null}function He(){var e=Ne();return{indexh:e.h,indexv:e.v,indexf:e.f,paused:G(),overview:$()}}function De(e){if("object"==typeof e){re(m(e.indexh),m(e.indexv),m(e.indexf));var t=m(e.paused),r=m(e.overview);"boolean"==typeof t&&t!==G()&&Q(t),"boolean"==typeof r&&r!==$()&&U(r)}}function ze(e){e=g(e);var t=[],r=[],n=[];e.forEach(function(e,n){if(e.hasAttribute("data-fragment-index")){var a=parseInt(e.getAttribute("data-fragment-index"),10);t[a]||(t[a]=[]),t[a].push(e)}else r.push([e])}),t=t.concat(r);var a=0;return t.forEach(function(e){e.forEach(function(e){n.push(e),e.setAttribute("data-fragment-index",a)}),a++}),n}function Re(e,t){if(St&&zt.fragments){var r=ze(St.querySelectorAll(".fragment"));if(r.length){if("number"!=typeof e){var n=ze(St.querySelectorAll(".fragment.visible")).pop();e=n?parseInt(n.getAttribute("data-fragment-index")||0,10):-1}"number"==typeof t&&(e+=t);var a=[],i=[];return g(r).forEach(function(t,r){t.hasAttribute("data-fragment-index")&&(r=parseInt(t.getAttribute("data-fragment-index"),10)),e>=r?(t.classList.contains("visible")||a.push(t),t.classList.add("visible"),t.classList.remove("current-fragment"),jt.statusDiv.textContent=t.textContent,r===e&&t.classList.add("current-fragment")):(t.classList.contains("visible")&&i.push(t),t.classList.remove("visible"),t.classList.remove("current-fragment"))}),i.length&&N("fragmenthidden",{fragment:i[0],fragments:i}),a.length&&N("fragmentshown",{fragment:a[0],fragments:a}),fe(),de(),!(!a.length&&!i.length)}}return!1}function We(){return Re(null,1)}function Oe(){return Re(null,-1)}function Be(){if(Fe(),St){var e=St.querySelector(".current-fragment"),t=e?e.getAttribute("data-autoslide"):null,r=St.parentNode?St.parentNode.getAttribute("data-autoslide"):null,n=St.getAttribute("data-autoslide");_t=t?parseInt(t,10):n?parseInt(n,10):r?parseInt(r,10):zt.autoSlide,0===St.querySelectorAll(".fragment").length&&g(St.querySelectorAll("video, audio")).forEach(function(e){e.hasAttribute("data-autoplay")&&_t&&1e3*e.duration>_t&&(_t=1e3*e.duration+1e3)}),!_t||Qt||G()||$()||kt.isLastSlide()&&!ye().next&&zt.loop!==!0||(Zt=setTimeout(function(){"function"==typeof zt.autoSlideMethod?zt.autoSlideMethod():_e(),Be()},_t),Jt=Date.now()),Nt&&Nt.setPlaying(-1!==Zt)}}function Fe(){clearTimeout(Zt),Zt=-1}function Ye(){_t&&!Qt&&(Qt=!0,N("autoslidepaused"),clearTimeout(Zt),Nt&&Nt.setPlaying(!1))}function Xe(){_t&&Qt&&(Qt=!1,N("autoslideresumed"),Be())}function je(){zt.rtl?($()||We()===!1)&&be().left&&re(Lt+1):($()||Oe()===!1)&&be().left&&re(Lt-1)}function Ve(){zt.rtl?($()||Oe()===!1)&&be().right&&re(Lt-1):($()||We()===!1)&&be().right&&re(Lt+1)}function Ue(){($()||Oe()===!1)&&be().up&&re(Lt,At-1)}function $e(){($()||We()===!1)&&be().down&&re(Lt,At+1)}function Ke(){if(Oe()===!1)if(be().up)Ue();else{var e;if(e=zt.rtl?g(jt.wrapper.querySelectorAll(Ct+".future")).pop():g(jt.wrapper.querySelectorAll(Ct+".past")).pop()){var t=e.querySelectorAll("section").length-1||void 0,r=Lt-1;re(r,t)}}}function _e(){We()===!1&&(be().down?$e():zt.rtl?je():Ve())}function Ze(e){for(;e&&"function"==typeof e.hasAttribute;){if(e.hasAttribute("data-prevent-swipe"))return!0;e=e.parentNode}return!1}function Je(e){zt.autoSlideStoppable&&Ye()}function Qe(e){e.shiftKey&&63===e.charCode&&(jt.overlay?z():D(!0))}function Ge(e){if("function"==typeof zt.keyboardCondition&&zt.keyboardCondition()===!1)return!0;var t=Qt;Je(e);var r=document.activeElement&&"inherit"!==document.activeElement.contentEditable,n=document.activeElement&&document.activeElement.tagName&&/input|textarea/i.test(document.activeElement.tagName);if(!(r||n||e.shiftKey&&32!==e.keyCode||e.altKey||e.ctrlKey||e.metaKey)){var a,i=[66,190,191];if("object"==typeof zt.keyboard)for(a in zt.keyboard)"togglePause"===zt.keyboard[a]&&i.push(parseInt(a,10));if(G()&&-1===i.indexOf(e.keyCode))return!1;var o=!1;if("object"==typeof zt.keyboard)for(a in zt.keyboard)if(parseInt(a,10)===e.keyCode){var s=zt.keyboard[a];"function"==typeof s?s.apply(null,[e]):"string"==typeof s&&"function"==typeof kt[s]&&kt[s].call(),o=!0}if(o===!1)switch(o=!0,e.keyCode){case 80:case 33:Ke();break;case 78:case 34:_e();break;case 72:case 37:je();break;case 76:case 39:Ve();break;case 75:case 38:Ue();break;case 74:case 40:$e();break;case 36:re(0);break;case 35:re(Number.MAX_VALUE);break;case 32:$()?V():e.shiftKey?Ke():_e();break;case 13:$()?V():o=!1;break;case 58:case 59:case 66:case 190:case 191:Q();break;case 70:_();break;case 65:zt.autoSlideStoppable&&ee(t);break;default:o=!1}o?e.preventDefault&&e.preventDefault():27!==e.keyCode&&79!==e.keyCode||!Vt.transforms3d||(jt.overlay?z():U(),e.preventDefault&&e.preventDefault()),Be()}}function et(e){return Ze(e.target)?!0:(Gt.startX=e.touches[0].clientX,Gt.startY=e.touches[0].clientY,Gt.startCount=e.touches.length,void(2===e.touches.length&&zt.overview&&(Gt.startSpan=b({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:Gt.startX,y:Gt.startY}))))}function tt(e){if(Ze(e.target))return!0;if(Gt.captured)Dt.match(/android/gi)&&e.preventDefault();else{Je(e);var t=e.touches[0].clientX,r=e.touches[0].clientY;if(2===e.touches.length&&2===Gt.startCount&&zt.overview){var n=b({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:Gt.startX,y:Gt.startY});Math.abs(Gt.startSpan-n)>Gt.threshold&&(Gt.captured=!0,nGt.threshold&&Math.abs(a)>Math.abs(i)?(Gt.captured=!0,je()):a<-Gt.threshold&&Math.abs(a)>Math.abs(i)?(Gt.captured=!0,Ve()):i>Gt.threshold?(Gt.captured=!0,Ue()):i<-Gt.threshold&&(Gt.captured=!0,$e()),zt.embedded?(Gt.captured||K(St))&&e.preventDefault():e.preventDefault()}}}function rt(e){Gt.captured=!1}function nt(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],et(e))}function at(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],tt(e))}function it(e){e.pointerType!==e.MSPOINTER_TYPE_TOUCH&&"touch"!==e.pointerType||(e.touches=[{clientX:e.clientX,clientY:e.clientY}],rt(e))}function ot(e){if(Date.now()-Ut>600){Ut=Date.now();var t=e.detail||-e.wheelDelta;t>0?_e():Ke()}}function st(e){Je(e),e.preventDefault();var t=g(jt.wrapper.querySelectorAll(Ct)).length,r=Math.floor(e.clientX/jt.wrapper.offsetWidth*t);zt.rtl&&(r=t-r),re(r)}function lt(e){e.preventDefault(),Je(),je()}function ct(e){e.preventDefault(),Je(),Ve()}function dt(e){e.preventDefault(),Je(),Ue()}function ut(e){e.preventDefault(),Je(),$e()}function pt(e){e.preventDefault(),Je(),Ke()}function ft(e){e.preventDefault(),Je(),_e()}function ht(e){qe()}function vt(e){R()}function gt(e){var t=document.webkitHidden||document.msHidden||document.hidden;t===!1&&document.activeElement!==document.body&&("function"==typeof document.activeElement.blur&&document.activeElement.blur(),document.body.focus())}function mt(e){if(Kt&&$()){e.preventDefault();for(var t=e.target;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(V(),t.nodeName.match(/section/gi))){var r=parseInt(t.getAttribute("data-index-h"),10),n=parseInt(t.getAttribute("data-index-v"),10);re(r,n)}}}function bt(e){if(e.currentTarget&&e.currentTarget.hasAttribute("href")){var t=e.currentTarget.getAttribute("href");t&&(H(t),e.preventDefault())}}function yt(e){kt.isLastSlide()&&zt.loop===!1?(re(0,0),Xe()):Qt?Xe():Ye()}function wt(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()}var kt,Lt,At,Et,St,xt,qt,Mt,Nt,Tt="3.3.0",It=".slides section",Ct=".slides>section",Pt=".slides>section.present>section",Ht=".slides>section:first-of-type",Dt=navigator.userAgent,zt={width:960,height:700,margin:.1,minScale:.2,maxScale:1.5,controls:!0,progress:!0,slideNumber:!1,history:!1,keyboard:!0,keyboardCondition:null,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,shuffle:!1,fragments:!0,embedded:!1,help:!0,pause:!0,showNotes:!1,autoSlide:0,autoSlideStoppable:!0,autoSlideMethod:null,mouseWheel:!1,rollingLinks:!1,hideAddressBar:!0,previewLinks:!1,postMessage:!0,postMessageEvents:!1,focusBodyOnPageVisibilityChange:!0,transition:"slide",transitionSpeed:"default",backgroundTransition:"fade",parallaxBackgroundImage:"",parallaxBackgroundSize:"",parallaxBackgroundHorizontal:null,parallaxBackgroundVertical:null,viewDistance:3,dependencies:[]},Rt=!1,Wt=!1,Ot=null,Bt=null,Ft=[],Yt=1,Xt={layout:"",overview:""},jt={},Vt={},Ut=0,$t=0,Kt=!1,_t=0,Zt=0,Jt=-1,Qt=!1,Gt={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40},er={"N , SPACE":"Next slide",P:"Previous slide","← , H":"Navigate left","→ , L":"Navigate right","↑ , K":"Navigate up","↓ , J":"Navigate down",Home:"First slide",End:"Last slide","B , .":"Pause",F:"Fullscreen","ESC, O":"Slide overview"};return wt.prototype.setPlaying=function(e){var t=this.playing;this.playing=e,!t&&this.playing?this.animate():this.render()},wt.prototype.animate=function(){var e=this.progress;this.progress=this.progressCheck(),e>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&Vt.requestAnimationFrameMethod.call(window,this.animate.bind(this))},wt.prototype.render=function(){var e=this.playing?this.progress:0,t=this.diameter2-this.thickness,r=this.diameter2,n=this.diameter2,a=28;this.progressOffset+=.1*(1-this.progressOffset);var i=-Math.PI/2+e*(2*Math.PI),o=-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(r,n,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(r,n,t,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#666",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(r,n,t,o,i,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(r-a/2,n-a/2),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,a/2-4,a),this.context.fillRect(a/2+4,0,a/2-4,a)):(this.context.beginPath(),this.context.translate(4,0),this.context.moveTo(0,0),this.context.lineTo(a-4,a/2),this.context.lineTo(0,a),this.context.fillStyle="#fff",this.context.fill()),this.context.restore()},wt.prototype.on=function(e,t){this.canvas.addEventListener(e,t,!1)},wt.prototype.off=function(e,t){this.canvas.removeEventListener(e,t,!1)},wt.prototype.destroy=function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)},kt={VERSION:Tt,initialize:e,configure:p,sync:ne,slide:re,left:je,right:Ve,up:Ue,down:$e,prev:Ke,next:_e,navigateFragment:Re,prevFragment:Oe,nextFragment:We,navigateTo:re,navigateLeft:je,navigateRight:Ve,navigateUp:Ue,navigateDown:$e,navigatePrev:Ke,navigateNext:_e,layout:R,shuffle:oe,availableRoutes:be,availableFragments:ye,toggleOverview:U,togglePause:Q,toggleAutoSlide:ee,isOverview:$,isPaused:G,isAutoSliding:te,addEventListeners:f,removeEventListeners:h,getState:He,setState:De,getProgress:Se,getIndices:Ne,getTotalSlides:Te,getSlide:Ie,getSlideBackground:Ce,getSlideNotes:Pe,getPreviousSlide:function(){return Et},getCurrentSlide:function(){return St},getScale:function(){return Yt},getConfig:function(){return zt},getQueryHash:function(){var e={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,function(t){e[t.split("=").shift()]=t.split("=").pop()});for(var t in e){var r=e[t];e[t]=m(unescape(r))}return e},isFirstSlide:function(){return 0===Lt&&0===At},isLastSlide:function(){return St?St.nextElementSibling?!1:!K(St)||!St.parentNode.nextElementSibling:!1},isReady:function(){return Rt},addEventListener:function(e,t,r){"addEventListener"in window&&(jt.wrapper||document.querySelector(".reveal")).addEventListener(e,t,r)},removeEventListener:function(e,t,r){"addEventListener"in window&&(jt.wrapper||document.querySelector(".reveal")).removeEventListener(e,t,r)},triggerKey:function(e){Ge({keyCode:e})},registerKeyboardShortcut:function(e,t){er[e]=t}}});
3 | //# sourceMappingURL=./reveal.min.js.map
--------------------------------------------------------------------------------
/slideResources/step1_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step1_1.jpg
--------------------------------------------------------------------------------
/slideResources/step1_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step1_2.png
--------------------------------------------------------------------------------
/slideResources/step2_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step2_1.jpg
--------------------------------------------------------------------------------
/slideResources/step2_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step2_2.png
--------------------------------------------------------------------------------
/slideResources/step3_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step3_1.jpg
--------------------------------------------------------------------------------
/slideResources/step3_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step3_2.jpg
--------------------------------------------------------------------------------
/slideResources/step4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step4.jpg
--------------------------------------------------------------------------------
/slideResources/step5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/step5.png
--------------------------------------------------------------------------------
/slideResources/unicorn.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/unicorn.jpg
--------------------------------------------------------------------------------
/slideResources/unicorn2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DevLyon/mixter/52dc83089b65b403a6fbb1daf26a74826c68ee30/slideResources/unicorn2.jpg
--------------------------------------------------------------------------------
/stepsDoc/end.txt:
--------------------------------------------------------------------------------
1 | CQRS
2 |
3 | +----+ |
4 | | UX | +---------+
5 | +----+ +---------+ | COMMAND |
6 | +--------> Command +-------+ +----+----+
7 | XXXXXXX | +----+----+ | |
8 | X X X X | | +-----v-----+ |
9 | XXXXXXX +--+ | Aggregate | |
10 | X | +-----+-----+ |
11 | XXX | |
12 | X X X | +----v---+ +--+---+
13 | X X X - - - -+ Events | - - | CQRS |
14 | X X X | +----+---+ +--+---+
15 | XXX | |
16 | XX XX <-----+ | +--------v----+ |
17 | XX XX | | Projections | |
18 | XX XX | | +-------+-----+ |
19 | XX XX | | |
20 | ^ | +-----------+ | +---+---+
21 | | +--+ Interface <------+ | QUERY |
22 | | +-----------+ +-------+
23 | +-----+------+
24 | | MONDE REEL | |
25 |
26 |
27 | Event Sourcing
28 |
29 | Aggregate
30 | +------------------------------+
31 | | |
32 | | Commands +---------+ Events |
33 | +------------> +-----+----->
34 | | | Decide | | |
35 | | +----> | | |
36 | | | +---------+ | |
37 | | | | |
38 | | | +---------+ | |
39 | | +----+ Apply <-----+ |
40 | | | +---^-----+ |
41 | | | | |
42 | | +--------+ |
43 | | |
44 | +------------------------------+
45 |
46 |
47 | =====================
48 | === END ===
49 | =====================
50 |
51 | Thank to submit feedback on github : https://github.com/DevLyon/mixter
--------------------------------------------------------------------------------
/stepsDoc/step1.txt:
--------------------------------------------------------------------------------
1 | Mixter - EventSourcing/CQRS Koan
2 | https://github.com/DevLyon/mixter/
3 |
4 | =======================
5 | === STEP 1 ===
6 | === DELETE COMMAND ===
7 | =======================
8 |
9 | EventStorming :
10 |
11 | +---------+
12 | | (core) |
13 | | Mixter |
14 | | context |
15 | +---------+
16 |
17 | +---------+
18 | | Message | +----------+
19 | +---------+ | Message |
20 | | deleted |
21 | +---------+ |
22 | | +----------+
23 | | Delete |
24 | | message |
25 | +---------+
26 |
27 |
28 | CQRS Principle (command) :
29 |
30 | +---------+
31 | +---------+ | COMMAND |
32 | -> Command +-------+ +----+----+
33 | +----+----+ | |
34 | | +-----v-----+ |
35 | | Aggregate | |
36 | | +-----+-----+ |
37 | | |
38 | | +----v---+ +--+---+
39 | - - - -+ Events | - - | CQRS |
40 | | +--------+ +------+
41 |
42 |
43 | Subject :
44 |
45 | What we will learn
46 | - publish events from aggregate,
47 | - use projection for decision inside aggregate (contains only "state" for future decision, DO NOT keep all state like in an entity)
48 | - Implement "business rules" that insure aggregate consistency (based on decision projection and command=method parameters)
49 |
50 | In brief : the C of CQRS
51 |
52 |
53 |
54 | Welcome
55 |
56 | 1 test failed... It's normal :)
57 | It's your first exercice. You should implement the failing test.
58 | When it's green, then call "next" command to jump to next test
59 |
60 | If you cannot find the solution, DON'T PANIC. You can go to the next step with the "jumpToNextStep" command. But only use it if you are short on time.
61 |
62 | Feel free to use issues in this repo to give your feedback, to propose some improvements, to ask for other languages...and even better to submit pull requests.
63 |
64 | Enjoy
--------------------------------------------------------------------------------
/stepsDoc/step2.txt:
--------------------------------------------------------------------------------
1 | ======================
2 | === STEP 2 ===
3 | === Timeline ===
4 | === messages ===
5 | === Projection ===
6 | ======================
7 |
8 | EventStorming :
9 |
10 | +---------+
11 | | (core) |
12 | | Mixter | +---------+
13 | | context | | Requack |
14 | +---------+ | message |
15 | +----+----+------+
16 | +---------+ | Message |
17 | | Message | | Requacked |
18 | +---------+ +-----------+
19 | +---------+
20 | | Quack |
21 | | Message | +------------+
22 | +----+----+----+ || Timeline ||
23 | | Message | || Messages ||
24 | | quacked | +------------+
25 | +---------+
26 |
27 |
28 | CQRS Principle (query) :
29 |
30 | | |
31 | | +----v---+ +--+---+
32 | - - - -| Events | - - -| CQRS |
33 | | +----+---+ +--+---+
34 | | |
35 | | +--------v----+ |
36 | | Projections | |
37 | | +-------+-----+ |
38 | | |
39 | +-----------+ | +---+---+
40 | --+ Interface <------+ | QUERY |
41 | +-----------+ +-------+
42 |
43 |
44 | Subject :
45 |
46 | What we will learn
47 | - Create another model for Query (Projection, TimelineMessageProjection)
48 | - Transform events in a projection model through an EventHandler
49 | - A projection repository (in-memory) with its interface is given
50 |
51 | In brief : Q of CQRS
--------------------------------------------------------------------------------
/stepsDoc/step3.txt:
--------------------------------------------------------------------------------
1 | ========================
2 | === STEP 3 ===
3 | === Subscription ===
4 | === Aggregate ===
5 | ========================
6 |
7 | EventStorming :
8 |
9 | +---------------+
10 | | Unfollow user |
11 | +------+--------+--------+
12 | | User unfollowed |
13 | +-----------------+
14 |
15 | +--------------+
16 | | Subscription |
17 | +--------------+
18 |
19 | +-------------+
20 | | Follow user |
21 | +-----+-------+-------+
22 | | User followed |
23 | +---------------+
24 |
25 |
26 | Event Sourcing Principle :
27 |
28 | Aggregate
29 | +------------------------------+
30 | | |
31 | | Commands +---------+ Events |
32 | +------------> +-----+----->
33 | | | Decide | | |
34 | | +----> | | |
35 | | | +---------+ | |
36 | | | | |
37 | | | +---------+ | |
38 | | +----+ Apply <-----+ |
39 | | | +---^-----+ |
40 | | | | |
41 | | +--------+ |
42 | | |
43 | +------------------------------+
44 |
45 |
46 | Subject :
47 |
48 | What we will learn
49 | - Create a new aggregate (Subscription)
50 | - Raise events from it : UserFollowed and UserUnfollowed
51 | - Create a decision projection for it
52 | - Implement replay of events (event sourced aggregate)
53 |
54 | In brief : C of CQRS + Event Sourcing
--------------------------------------------------------------------------------
/stepsDoc/step4.txt:
--------------------------------------------------------------------------------
1 | =======================
2 | === STEP 4 ===
3 | === Aggregates ===
4 | === interaction ===
5 | =======================
6 |
7 | EventStorming :
8 |
9 | +------------+
10 | || Timeline ||
11 | || messages ||
12 | +------------+
13 |
14 | +---------+ +------------------+
15 | | Message +------+ | Followee Message |
16 | | quacked | | | Quacked |
17 | +---------+ +---v----+-+----------------+
18 | | Notify |
19 | | follower |
20 | +-----------+ +-----^----+
21 | | Message | | +--------------+
22 | | requacked +-------+ | Subscription |
23 | +-----------+ +--------------+
24 | +-----------------+
25 | +---------+ | User unfollowed |
26 | | Message | +-----------------+
27 | +---------+ +---------------+
28 | +-------------+ | User followed |
29 | || Followers || +---------------+
30 | +-------------+
31 |
32 |
33 | Subject :
34 |
35 | What we will learn
36 | - Coordinate several aggregates to limit coupling
37 | - Concept of "Eventual consistency"
38 |
--------------------------------------------------------------------------------
/stepsDoc/step5.txt:
--------------------------------------------------------------------------------
1 | =====================
2 | === STEP 5 ===
3 | === Command ===
4 | === Handler ===
5 | =====================
6 |
7 | CQRS Principle :
8 |
9 | +----+ |
10 | | UX | +---------+
11 | +----+ +---------+ | COMMAND |
12 | +--------> Command +-------+ +----+----+
13 | XXXXXXX | +----+----+ | |
14 | X X X X | | +-----v-----+ |
15 | XXXXXXX +--+ | Aggregate | |
16 | X | +-----+-----+ |
17 | XXX | |
18 | X X X | +----v---+ +--+---+
19 | X X X - - - -+ Events | - - | CQRS |
20 | X X X | +----+---+ +--+---+
21 | XXX | |
22 | XX XX <-----+ | +--------v----+ |
23 | XX XX | | Projections | |
24 | XX XX | | +-------+-----+ |
25 | XX XX | | |
26 | ^ | +-----------+ | +---+---+
27 | | +--+ Interface <------+ | QUERY |
28 | | +-----------+ +-------+
29 | +-----+------+
30 | | MONDE REEL | |
31 |
32 |
33 | Subject :
34 |
35 | Request Rest to execute delete Message command, with session validity verification
36 |
--------------------------------------------------------------------------------