metya 7 лет назад
Сommit
44b8fe24a8
100 измененных файлов с 8533 добавлено и 0 удалено
  1. 0 0
      .nojekyll
  2. 0 0
      assets/css/.gitkeep
  3. 50 0
      assets/css/ribbons.css
  4. 0 0
      assets/img/.gitkeep
  5. 0 0
      assets/js/.gitkeep
  6. 0 0
      assets/layouts/.gitkeep
  7. 53 0
      coreml.Rmd
  8. 47 0
      coreml.html
  9. 53 0
      coreml.md
  10. 61 0
      index.Rmd
  11. 207 0
      index.html
  12. 61 0
      index.md
  13. 3 0
      libraries/frameworks/html5slides/config.yml
  14. BIN
      libraries/frameworks/html5slides/default/images/colorbar.png
  15. BIN
      libraries/frameworks/html5slides/default/images/google-logo-small.png
  16. BIN
      libraries/frameworks/html5slides/default/images/google-logo.png
  17. BIN
      libraries/frameworks/html5slides/default/images/googleio-logo.png
  18. BIN
      libraries/frameworks/html5slides/default/images/mcgill-logo-small.png
  19. BIN
      libraries/frameworks/html5slides/default/images/mcgill-logo.jpg
  20. BIN
      libraries/frameworks/html5slides/default/images/slidify-log.png
  21. BIN
      libraries/frameworks/html5slides/default/images/slidify-logo-small.png
  22. 19 0
      libraries/frameworks/html5slides/default/layouts/deck.html
  23. 9 0
      libraries/frameworks/html5slides/default/layouts/head.html
  24. 5 0
      libraries/frameworks/html5slides/default/layouts/slide.html
  25. 635 0
      libraries/frameworks/html5slides/default/slides.js
  26. 0 0
      libraries/frameworks/html5slides/default/slides.min.js
  27. 612 0
      libraries/frameworks/html5slides/default/styles.css
  28. 16 0
      libraries/frameworks/html5slides/layouts/deck.html
  29. 5 0
      libraries/frameworks/html5slides/layouts/slide.html
  30. 9 0
      libraries/frameworks/html5slides/partials/head.html
  31. BIN
      libraries/frameworks/html5slides/uulm/images/header_sample.jpg
  32. 887 0
      libraries/frameworks/html5slides/uulm/slides.js
  33. 872 0
      libraries/frameworks/html5slides/uulm/styles.css
  34. 187 0
      libraries/frameworks/html5slides/uulm/uulm.css
  35. 5 0
      libraries/frameworks/html5slides/uulm/uulm_logo.svg
  36. 12 0
      libraries/frameworks/io2012/README.md
  37. 3 0
      libraries/frameworks/io2012/config.yml
  38. 1503 0
      libraries/frameworks/io2012/css/default.css
  39. 24 0
      libraries/frameworks/io2012/css/fonts.css
  40. 27 0
      libraries/frameworks/io2012/css/phone.css
  41. 368 0
      libraries/frameworks/io2012/css/slidify.css
  42. BIN
      libraries/frameworks/io2012/images/google_developers_icon_128.png
  43. BIN
      libraries/frameworks/io2012/images/io2012_logo.png
  44. 586 0
      libraries/frameworks/io2012/js/hammer.js
  45. 3 0
      libraries/frameworks/io2012/js/modernizr.custom.45394.js
  46. 8 0
      libraries/frameworks/io2012/js/order.js
  47. 2 0
      libraries/frameworks/io2012/js/polyfills/classList.min.js
  48. 2 0
      libraries/frameworks/io2012/js/polyfills/dataset.min.js
  49. 0 0
      libraries/frameworks/io2012/js/polyfills/history.min.js
  50. 2 0
      libraries/frameworks/io2012/js/prettify/lang-apollo.js
  51. 18 0
      libraries/frameworks/io2012/js/prettify/lang-clj.js
  52. 2 0
      libraries/frameworks/io2012/js/prettify/lang-css.js
  53. 1 0
      libraries/frameworks/io2012/js/prettify/lang-go.js
  54. 2 0
      libraries/frameworks/io2012/js/prettify/lang-hs.js
  55. 3 0
      libraries/frameworks/io2012/js/prettify/lang-lisp.js
  56. 2 0
      libraries/frameworks/io2012/js/prettify/lang-lua.js
  57. 2 0
      libraries/frameworks/io2012/js/prettify/lang-ml.js
  58. 4 0
      libraries/frameworks/io2012/js/prettify/lang-n.js
  59. 1 0
      libraries/frameworks/io2012/js/prettify/lang-proto.js
  60. 2 0
      libraries/frameworks/io2012/js/prettify/lang-scala.js
  61. 2 0
      libraries/frameworks/io2012/js/prettify/lang-sql.js
  62. 1 0
      libraries/frameworks/io2012/js/prettify/lang-tex.js
  63. 2 0
      libraries/frameworks/io2012/js/prettify/lang-vb.js
  64. 3 0
      libraries/frameworks/io2012/js/prettify/lang-vhdl.js
  65. 2 0
      libraries/frameworks/io2012/js/prettify/lang-wiki.js
  66. 1 0
      libraries/frameworks/io2012/js/prettify/lang-xq.js
  67. 2 0
      libraries/frameworks/io2012/js/prettify/lang-yaml.js
  68. 1 0
      libraries/frameworks/io2012/js/prettify/prettify.css
  69. 28 0
      libraries/frameworks/io2012/js/prettify/prettify.js
  70. 33 0
      libraries/frameworks/io2012/js/require-1.0.8.min.js
  71. 109 0
      libraries/frameworks/io2012/js/slide-controller.js
  72. 853 0
      libraries/frameworks/io2012/js/slide-deck.js
  73. 16 0
      libraries/frameworks/io2012/js/slide_config.js
  74. 3 0
      libraries/frameworks/io2012/js/slides.js
  75. 41 0
      libraries/frameworks/io2012/layouts/default.html
  76. 19 0
      libraries/frameworks/io2012/layouts/slide.html
  77. 10 0
      libraries/frameworks/io2012/layouts/twocol.html
  78. 16 0
      libraries/frameworks/io2012/layouts/vcenter.html
  79. 13 0
      libraries/frameworks/io2012/partials/head.html
  80. 10 0
      libraries/frameworks/io2012/partials/logoslide.html
  81. 12 0
      libraries/frameworks/io2012/partials/pagination.html
  82. 25 0
      libraries/frameworks/io2012/partials/titleslide.html
  83. 15 0
      libraries/frameworks/io2012/partials/toc.html
  84. 31 0
      libraries/frameworks/shower/Contributing.md
  85. 9 0
      libraries/frameworks/shower/License.txt
  86. 45 0
      libraries/frameworks/shower/Readme.md
  87. 2 0
      libraries/frameworks/shower/config.yml
  88. 37 0
      libraries/frameworks/shower/layouts/deck.html
  89. 6 0
      libraries/frameworks/shower/layouts/slide.html
  90. 14 0
      libraries/frameworks/shower/layouts/slide0.html
  91. 11 0
      libraries/frameworks/shower/partials/head.html
  92. 726 0
      libraries/frameworks/shower/shower.js
  93. 5 0
      libraries/frameworks/shower/shower.min.js
  94. 31 0
      libraries/frameworks/shower/themes/ribbon/Contributing.md
  95. 9 0
      libraries/frameworks/shower/themes/ribbon/License.txt
  96. 17 0
      libraries/frameworks/shower/themes/ribbon/Readme.md
  97. BIN
      libraries/frameworks/shower/themes/ribbon/fonts/PTMono.woff
  98. BIN
      libraries/frameworks/shower/themes/ribbon/fonts/PTSans.Bold.Italic.woff
  99. BIN
      libraries/frameworks/shower/themes/ribbon/fonts/PTSans.Bold.woff
  100. BIN
      libraries/frameworks/shower/themes/ribbon/fonts/PTSans.Italic.woff

+ 0 - 0
assets/css/.gitkeep


+ 50 - 0
assets/css/ribbons.css

@@ -0,0 +1,50 @@
+/*Github Ribbon Test*/
+/* Source: https://github.com/dciccale/css3-github-ribbon */
+/* Define classes for example, definition, problem etc. */
+/* Choose meaningful colors for background and text */
+
+.example {
+  background-color: #121621;
+  top: 1.2em;
+  right: -3.2em;
+  -webkit-transform: rotate(45deg);
+  -moz-transform: rotate(45deg);
+  transform: rotate(45deg);
+  -webkit-box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  -moz-box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  color: #FF0;
+  display: block;
+  padding: .6em 3.5em;
+  position: absolute;
+  font: bold .82em sans-serif;
+  text-align: center;
+  text-decoration: none;
+  text-shadow: 1px -1px 8px rgba(0,0,0,0.60);
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  user-select: none;
+}
+
+.definition {
+  background-color: #a00;
+  top: 1.2em;
+  right: -3.2em;
+  -webkit-transform: rotate(45deg);
+  -moz-transform: rotate(45deg);
+  transform: rotate(45deg);
+  -webkit-box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  -moz-box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  color: #FFF;
+  display: block;
+  padding: .6em 3.5em;
+  position: absolute;
+  font: bold .82em sans-serif;
+  text-align: center;
+  text-decoration: none;
+  text-shadow: 1px -1px 8px rgba(0,0,0,0.60);
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  user-select: none;
+}

+ 0 - 0
assets/img/.gitkeep


+ 0 - 0
assets/js/.gitkeep


+ 0 - 0
assets/layouts/.gitkeep


+ 53 - 0
coreml.Rmd

@@ -0,0 +1,53 @@
+---
+title: "CoreML"
+author: "metya"
+date: '3 августа 2018 г '
+output: ioslides_presentation
+---
+
+# Core ML algorithms
+### From the not zero to thе beginings
+by metya and nikitos (нет)
+Летняя Школа 2018, Deep Learning Workshop
+
+---
+### Regression
+- Linear regression ([объяснение на хабре](https://habr.com/company/ods/blog/323890/))
+- NonLinear Regression
+- Descision Trees 
+- Autoregression (ARIMA, etc.) 
+  
+(множественные модели, многомерные модели, регрессионные остатки)
+
+---
+### Classification
+- Logistic regression ([объяснение на хабре](https://habr.com/company/ods/blog/323890/))
+- Descision Trees ([объяснение на хабре](https://habr.com/company/ods/blog/322534/))
+- K Nearest Neighbours ([объяснение на хабре](https://habr.com/company/ods/blog/322534/))
+- Naive Bayes ([Wiki](https://ru.wikipedia.org/wiki/Наивный_байесовский_классификатор), [habr (свежак!)](https://habr.com/post/415963/))
+- Linear discriminant analysis (Fisher's)
+- Support Vector Machine ([хабр](https://habr.com/post/105220/))
+- Genetics Algorithms
+- Expectation-Maximization (EM) ([где то в интернете](https://basegroup.ru/community/articles/em))
+
+
+---
+
+### Clusterization
+([Николенко, слайды](https://logic.pdmi.ras.ru/~sergey/teaching/mlau12/10-clustem.pdf))
+- K-means ([объяснение на хабре](https://habr.com/company/ods/blog/325654/))
+- DBSCAN ([хабр](https://habrahabr.ru/post/322034/))
+- Affinity Propagation ([habr](https://habr.com/post/321216/))
+- EM 
+- Self-Organaized Maps aka Kohonen's networks ([все там же отличная статья!](https://habr.com/post/338868/))
+- Principal Component Analysis aka Понижение размерности ([объяснение на хабре](https://habr.com/company/ods/blog/325654/))
+- t-SNE 
+
+---
+### Many of them together
+- - Bagging aka Bootstrap aggregation (Random Forest, etc.) ([объяснение на хабре](https://habr.com/company/ods/blog/324402/))
+- - Boosting ([все там же](https://habr.com/company/ods/blog/327250/), [дьяконов](https://alexanderdyakonov.wordpress.com/2017/06/09/градиентный-бустинг/comment-page-1/), [чья то неплохая курсовая](http://www.machinelearning.ru/wiki/images/9/9a/fonarev.overview_of_boosting_methods.pdf))
+
+---
+# FIN!
+

Разница между файлами не показана из-за своего большого размера
+ 47 - 0
coreml.html


+ 53 - 0
coreml.md

@@ -0,0 +1,53 @@
+---
+title: "CoreML"
+author: "metya"
+date: '3 августа 2018 г '
+output: ioslides_presentation
+---
+
+# Core ML algorithms
+### From the not zero to thе beginings
+by metya and nikitos (нет)
+Летняя Школа 2018, Deep Learning Workshop
+
+---
+### Regression
+- Linear regression ([объяснение на хабре](https://habr.com/company/ods/blog/323890/))
+- NonLinear Regression
+- Descision Trees 
+- Autoregression (ARIMA, etc.) 
+  
+(множественные модели, многомерные модели, регрессионные остатки)
+
+---
+### Classification
+- Logistic regression ([объяснение на хабре](https://habr.com/company/ods/blog/323890/))
+- Descision Trees ([объяснение на хабре](https://habr.com/company/ods/blog/322534/))
+- K Nearest Neighbours ([объяснение на хабре](https://habr.com/company/ods/blog/322534/))
+- Naive Bayes ([Wiki](https://ru.wikipedia.org/wiki/Наивный_байесовский_классификатор), [habr (свежак!)](https://habr.com/post/415963/))
+- Linear discriminant analysis (Fisher's)
+- Support Vector Machine ([хабр](https://habr.com/post/105220/))
+- Genetics Algorithms
+- Expectation-Maximization (EM) ([где то в интернете](https://basegroup.ru/community/articles/em))
+
+
+---
+
+### Clusterization
+([Николенко, слайды](https://logic.pdmi.ras.ru/~sergey/teaching/mlau12/10-clustem.pdf))
+- K-means ([объяснение на хабре](https://habr.com/company/ods/blog/325654/))
+- DBSCAN ([хабр](https://habrahabr.ru/post/322034/))
+- Affinity Propagation ([habr](https://habr.com/post/321216/))
+- EM 
+- Self-Organaized Maps aka Kohonen's networks ([все там же отличная статья!](https://habr.com/post/338868/))
+- Principal Component Analysis aka Понижение размерности ([объяснение на хабре](https://habr.com/company/ods/blog/325654/))
+- t-SNE 
+
+---
+### Many of them together
+- - Bagging aka Bootstrap aggregation (Random Forest, etc.) ([объяснение на хабре](https://habr.com/company/ods/blog/324402/))
+- - Boosting ([все там же](https://habr.com/company/ods/blog/327250/), [дьяконов](https://alexanderdyakonov.wordpress.com/2017/06/09/градиентный-бустинг/comment-page-1/), [чья то неплохая курсовая](http://www.machinelearning.ru/wiki/images/9/9a/fonarev.overview_of_boosting_methods.pdf))
+
+---
+# FIN!
+

+ 61 - 0
index.Rmd

@@ -0,0 +1,61 @@
+---
+title       : CoreML algorytms
+subtitle    : From the beginings to the not
+author      : metya
+job         : Летняя Школа 2018, Deep Learning Workshop
+framework   : io2012        # {io2012, html5slides, shower, dzslides, ...}
+highlighter : highlight.js  # {highlight.js, prettify, highlight}
+hitheme     : tomorrow      # 
+widgets     : [mathjax]            # {mathjax, quiz, bootstrap}
+mode        : selfcontained # {standalone, draft}
+knit        : slidify::knit2slides
+guthub      :
+  user: 'metya'
+  repo: 'CoreML'
+---
+
+# A few base algorythms and even farther
+
+---
+
+# Regression
+- Linear regression ([объяснение на хабре](https://habr.com/company/ods/blog/323890/))
+- NonLinear Regression
+- Descision Trees 
+- Autoregression (ARIMA, etc.) 
+  
+(множественные модели, многомерные модели, регрессионные остатки)
+
+---
+
+# Classification
+- Logistic regression ([объяснение на хабре](https://habr.com/company/ods/blog/323890/))
+- Descision Trees ([объяснение на хабре](https://habr.com/company/ods/blog/322534/))
+- K Nearest Neighbours ([объяснение на хабре](https://habr.com/company/ods/blog/322534/))
+- Naive Bayes ([Wiki](https://ru.wikipedia.org/wiki/Наивный_байесовский_классификатор), [habr (свежак!)](https://habr.com/post/415963/))
+- Linear discriminant analysis (Fisher's)
+- Support Vector Machine ([хабр](https://habr.com/post/105220/))
+- Genetics Algorithms
+- Expectation-Maximization (EM) ([где то в интернете](https://basegroup.ru/community/articles/em))
+
+---
+# Clusterization
+([Николенко, слайды](https://logic.pdmi.ras.ru/~sergey/teaching/mlau12/10-clustem.pdf), [воронцов, лекция](http://www.ccas.ru/voron/download/Clustering.pdf))
+- K-means ([объяснение на хабре](https://habr.com/company/ods/blog/325654/))
+- DBSCAN ([хабр](https://habrahabr.ru/post/322034/))
+- Affinity Propagation ([habr](https://habr.com/post/321216/))
+- EM 
+- Self-Organaized Maps aka Kohonen's networks ([все там же отличная статья!](https://habr.com/post/338868/))
+- Principal Component Analysis aka Понижение размерности ([объяснение на хабре](https://habr.com/company/ods/blog/325654/))
+- t-SNE 
+
+---
+# Many of them together 
+- Bagging aka Bootstrap aggregation (Random Forest, etc.) 
+([объяснение на хабре](https://habr.com/company/ods/blog/324402/))
+
+- Boosting ([все там же](https://habr.com/company/ods/blog/327250/), [дьяконов](https://alexanderdyakonov.wordpress.com/2017/06/09/градиентный-бустинг/comment-page-1/), [чья то неплохая курсовая](http://www.machinelearning.ru/wiki/images/9/9a/fonarev.overview_of_boosting_methods.pdf))
+
+--- .middle
+
+# FIN!

+ 207 - 0
index.html

@@ -0,0 +1,207 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>CoreML algorytms</title>
+  <meta charset="utf-8">
+  <meta name="description" content="CoreML algorytms">
+  <meta name="author" content="metya">
+  <meta name="generator" content="slidify" />
+  <meta name="apple-mobile-web-app-capable" content="yes">
+  <meta http-equiv="X-UA-Compatible" content="chrome=1">
+  <link rel="stylesheet" href="libraries/frameworks/io2012/css/default.css" media="all" >
+  <link rel="stylesheet" href="libraries/frameworks/io2012/css/phone.css" 
+    media="only screen and (max-device-width: 480px)" >
+  <link rel="stylesheet" href="libraries/frameworks/io2012/css/slidify.css" >
+  <link rel="stylesheet" href="libraries/highlighters/highlight.js/css/tomorrow.css" />
+  <base target="_blank"> <!-- This amazingness opens all links in a new tab. -->  <link rel=stylesheet href="./assets/css/ribbons.css"></link>
+
+  
+  <!-- Grab CDN jQuery, fall back to local if offline -->
+  <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.min.js"></script>
+  <script>window.jQuery || document.write('<script src="libraries/widgets/quiz/js/jquery.js"><\/script>')</script> 
+  <script data-main="libraries/frameworks/io2012/js/slides" 
+    src="libraries/frameworks/io2012/js/require-1.0.8.min.js">
+  </script>
+  
+  
+
+</head>
+<body style="opacity: 0">
+  <slides class="layout-widescreen">
+    
+    <!-- LOGO SLIDE -->
+        <slide class="title-slide segue nobackground">
+  <hgroup class="auto-fadein">
+    <h1>CoreML algorytms</h1>
+    <h2>From the beginings to the not</h2>
+    <p>metya<br/>Летняя Школа 2018, Deep Learning Workshop</p>
+  </hgroup>
+  <article></article>  
+</slide>
+    
+
+    <!-- SLIDES -->
+    <slide class="" id="slide-1" style="background:;">
+  <hgroup>
+    <h1>A few base algorythms and even farther</h1>
+  </hgroup>
+  <article data-timings="">
+    
+  </article>
+  <!-- Presenter Notes -->
+</slide>
+
+<slide class="" id="slide-2" style="background:;">
+  <hgroup>
+    <h1>Regression</h1>
+  </hgroup>
+  <article data-timings="">
+    <ul>
+<li>Linear regression (<a href="https://habr.com/company/ods/blog/323890/">объяснение на хабре</a>)</li>
+<li>NonLinear Regression</li>
+<li>Descision Trees </li>
+<li>Autoregression (ARIMA, etc.) </li>
+</ul>
+
+<p>(множественные модели, многомерные модели, регрессионные остатки)</p>
+
+  </article>
+  <!-- Presenter Notes -->
+</slide>
+
+<slide class="" id="slide-3" style="background:;">
+  <hgroup>
+    <h1>Classification</h1>
+  </hgroup>
+  <article data-timings="">
+    <ul>
+<li>Logistic regression (<a href="https://habr.com/company/ods/blog/323890/">объяснение на хабре</a>)</li>
+<li>Descision Trees (<a href="https://habr.com/company/ods/blog/322534/">объяснение на хабре</a>)</li>
+<li>K Nearest Neighbours (<a href="https://habr.com/company/ods/blog/322534/">объяснение на хабре</a>)</li>
+<li>Naive Bayes (<a href="https://ru.wikipedia.org/wiki/%D0%A0%D1%9C%D0%A0%C2%B0%D0%A0%D1%91%D0%A0%D0%86%D0%A0%D0%85%D0%A1%E2%80%B9%D0%A0%E2%84%96_%D0%A0%C2%B1%D0%A0%C2%B0%D0%A0%E2%84%96%D0%A0%C2%B5%D0%A1%D0%83%D0%A0%D1%95%D0%A0%D0%86%D0%A1%D0%83%D0%A0%D1%94%D0%A0%D1%91%D0%A0%E2%84%96_%D0%A0%D1%94%D0%A0%C2%BB%D0%A0%C2%B0%D0%A1%D0%83%D0%A1%D0%83%D0%A0%D1%91%D0%A1%E2%80%9E%D0%A0%D1%91%D0%A0%D1%94%D0%A0%C2%B0%D0%A1%E2%80%9A%D0%A0%D1%95%D0%A1%D0%82">Wiki</a>, <a href="https://habr.com/post/415963/">habr (свежак!)</a>)</li>
+<li>Linear discriminant analysis (Fisher&#39;s)</li>
+<li>Support Vector Machine (<a href="https://habr.com/post/105220/">хабр</a>)</li>
+<li>Genetics Algorithms</li>
+<li>Expectation-Maximization (EM) (<a href="https://basegroup.ru/community/articles/em">где то в интернете</a>)</li>
+</ul>
+
+  </article>
+  <!-- Presenter Notes -->
+</slide>
+
+<slide class="" id="slide-4" style="background:;">
+  <hgroup>
+    <h1>Clusterization</h1>
+  </hgroup>
+  <article data-timings="">
+    <p>(<a href="https://logic.pdmi.ras.ru/%7Esergey/teaching/mlau12/10-clustem.pdf">Николенко, слайды</a>, <a href="http://www.ccas.ru/voron/download/Clustering.pdf">воронцов, лекция</a>)</p>
+
+<ul>
+<li>K-means (<a href="https://habr.com/company/ods/blog/325654/">объяснение на хабре</a>)</li>
+<li>DBSCAN (<a href="https://habrahabr.ru/post/322034/">хабр</a>)</li>
+<li>Affinity Propagation (<a href="https://habr.com/post/321216/">habr</a>)</li>
+<li>EM </li>
+<li>Self-Organaized Maps aka Kohonen&#39;s networks (<a href="https://habr.com/post/338868/">все там же отличная статья!</a>)</li>
+<li>Principal Component Analysis aka Понижение размерности (<a href="https://habr.com/company/ods/blog/325654/">объяснение на хабре</a>)</li>
+<li>t-SNE </li>
+</ul>
+
+  </article>
+  <!-- Presenter Notes -->
+</slide>
+
+<slide class="" id="slide-5" style="background:;">
+  <hgroup>
+    <h1>Many of them together</h1>
+  </hgroup>
+  <article data-timings="">
+    <ul>
+<li><p>Bagging aka Bootstrap aggregation (Random Forest, etc.) 
+(<a href="https://habr.com/company/ods/blog/324402/">объяснение на хабре</a>)</p></li>
+<li><p>Boosting (<a href="https://habr.com/company/ods/blog/327250/">все там же</a>, <a href="https://alexanderdyakonov.wordpress.com/2017/06/09/%D0%A0%D1%96%D0%A1%D0%82%D0%A0%C2%B0%D0%A0%D2%91%D0%A0%D1%91%D0%A0%C2%B5%D0%A0%D0%85%D0%A1%E2%80%9A%D0%A0%D0%85%D0%A1%E2%80%B9%D0%A0%E2%84%96-%D0%A0%C2%B1%D0%A1%D1%93%D0%A1%D0%83%D0%A1%E2%80%9A%D0%A0%D1%91%D0%A0%D0%85%D0%A0%D1%96/comment-page-1/">дьяконов</a>, <a href="http://www.machinelearning.ru/wiki/images/9/9a/fonarev.overview_of_boosting_methods.pdf">чья то неплохая курсовая</a>)</p></li>
+</ul>
+
+  </article>
+  <!-- Presenter Notes -->
+</slide>
+
+<slide class="middle" id="slide-6" style="background:;">
+  <hgroup>
+    <h1>FIN!</h1>
+  </hgroup>
+  <article data-timings="">
+    
+  </article>
+  <!-- Presenter Notes -->
+</slide>
+
+    <slide class="backdrop"></slide>
+  </slides>
+  <div class="pagination pagination-small" id='io2012-ptoc' style="display:none;">
+    <ul>
+      <li>
+      <a href="#" target="_self" rel='tooltip' 
+        data-slide=1 title='A few base algorythms and even farther'>
+         1
+      </a>
+    </li>
+    <li>
+      <a href="#" target="_self" rel='tooltip' 
+        data-slide=2 title='Regression'>
+         2
+      </a>
+    </li>
+    <li>
+      <a href="#" target="_self" rel='tooltip' 
+        data-slide=3 title='Classification'>
+         3
+      </a>
+    </li>
+    <li>
+      <a href="#" target="_self" rel='tooltip' 
+        data-slide=4 title='Clusterization'>
+         4
+      </a>
+    </li>
+    <li>
+      <a href="#" target="_self" rel='tooltip' 
+        data-slide=5 title='Many of them together'>
+         5
+      </a>
+    </li>
+    <li>
+      <a href="#" target="_self" rel='tooltip' 
+        data-slide=6 title='FIN!'>
+         6
+      </a>
+    </li>
+  </ul>
+  </div>  <!--[if IE]>
+    <script 
+      src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js">  
+    </script>
+    <script>CFInstall.check({mode: 'overlay'});</script>
+  <![endif]-->
+</body>
+  <!-- Load Javascripts for Widgets -->
+  
+  <!-- MathJax: Fall back to local if CDN offline but local image fonts are not supported (saves >100MB) -->
+  <script type="text/x-mathjax-config">
+    MathJax.Hub.Config({
+      tex2jax: {
+        inlineMath: [['$','$'], ['\\(','\\)']],
+        processEscapes: true
+      }
+    });
+  </script>
+  <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/2.0-latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
+  <!-- <script src="https://c328740.ssl.cf1.rackcdn.com/mathjax/2.0-latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
+  </script> -->
+  <script>window.MathJax || document.write('<script type="text/x-mathjax-config">MathJax.Hub.Config({"HTML-CSS":{imageFont:null}});<\/script><script src="libraries/widgets/mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"><\/script>')
+</script>
+<!-- LOAD HIGHLIGHTER JS FILES -->
+  <script src="libraries/highlighters/highlight.js/highlight.pack.js"></script>
+  <script>hljs.initHighlightingOnLoad();</script>
+  <!-- DONE LOADING HIGHLIGHTER JS FILES -->
+   
+  </html>

+ 61 - 0
index.md

@@ -0,0 +1,61 @@
+---
+title       : CoreML algorytms
+subtitle    : From the beginings to the not
+author      : metya
+job         : Летняя Школа 2018, Deep Learning Workshop
+framework   : io2012        # {io2012, html5slides, shower, dzslides, ...}
+highlighter : highlight.js  # {highlight.js, prettify, highlight}
+hitheme     : tomorrow      # 
+widgets     : [mathjax]            # {mathjax, quiz, bootstrap}
+mode        : selfcontained # {standalone, draft}
+knit        : slidify::knit2slides
+guthub      :
+  user: 'metya'
+  repo: 'CoreML'
+---
+
+# A few base algorythms and even farther
+
+---
+
+# Regression
+- Linear regression ([объяснение на хабре](https://habr.com/company/ods/blog/323890/))
+- NonLinear Regression
+- Descision Trees 
+- Autoregression (ARIMA, etc.) 
+  
+(множественные модели, многомерные модели, регрессионные остатки)
+
+---
+
+# Classification
+- Logistic regression ([объяснение на хабре](https://habr.com/company/ods/blog/323890/))
+- Descision Trees ([объяснение на хабре](https://habr.com/company/ods/blog/322534/))
+- K Nearest Neighbours ([объяснение на хабре](https://habr.com/company/ods/blog/322534/))
+- Naive Bayes ([Wiki](https://ru.wikipedia.org/wiki/Наивный_байесовский_классификатор), [habr (свежак!)](https://habr.com/post/415963/))
+- Linear discriminant analysis (Fisher's)
+- Support Vector Machine ([хабр](https://habr.com/post/105220/))
+- Genetics Algorithms
+- Expectation-Maximization (EM) ([где то в интернете](https://basegroup.ru/community/articles/em))
+
+---
+# Clusterization
+([Николенко, слайды](https://logic.pdmi.ras.ru/~sergey/teaching/mlau12/10-clustem.pdf), [воронцов, лекция](http://www.ccas.ru/voron/download/Clustering.pdf))
+- K-means ([объяснение на хабре](https://habr.com/company/ods/blog/325654/))
+- DBSCAN ([хабр](https://habrahabr.ru/post/322034/))
+- Affinity Propagation ([habr](https://habr.com/post/321216/))
+- EM 
+- Self-Organaized Maps aka Kohonen's networks ([все там же отличная статья!](https://habr.com/post/338868/))
+- Principal Component Analysis aka Понижение размерности ([объяснение на хабре](https://habr.com/company/ods/blog/325654/))
+- t-SNE 
+
+---
+# Many of them together 
+- Bagging aka Bootstrap aggregation (Random Forest, etc.) 
+([объяснение на хабре](https://habr.com/company/ods/blog/324402/))
+
+- Boosting ([все там же](https://habr.com/company/ods/blog/327250/), [дьяконов](https://alexanderdyakonov.wordpress.com/2017/06/09/градиентный-бустинг/comment-page-1/), [чья то неплохая курсовая](http://www.machinelearning.ru/wiki/images/9/9a/fonarev.overview_of_boosting_methods.pdf))
+
+--- .middle
+
+# FIN!

+ 3 - 0
libraries/frameworks/html5slides/config.yml

@@ -0,0 +1,3 @@
+html5slides:
+  theme: default
+  template: regular

BIN
libraries/frameworks/html5slides/default/images/colorbar.png


BIN
libraries/frameworks/html5slides/default/images/google-logo-small.png


BIN
libraries/frameworks/html5slides/default/images/google-logo.png


BIN
libraries/frameworks/html5slides/default/images/googleio-logo.png


BIN
libraries/frameworks/html5slides/default/images/mcgill-logo-small.png


BIN
libraries/frameworks/html5slides/default/images/mcgill-logo.jpg


BIN
libraries/frameworks/html5slides/default/images/slidify-log.png


BIN
libraries/frameworks/html5slides/default/images/slidify-logo-small.png


+ 19 - 0
libraries/frameworks/html5slides/default/layouts/deck.html

@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+	{{> head }}
+  {{{ stylesheets }}}  
+</head>
+<body style='display: none'>
+	<section class='slides layout-regular template-regular'>
+     <!-- SLIDES -->
+      {{# slides }}
+        {{{ slide }}}
+      {{/ slides }} 
+  </section>
+</body>
+  <!-- LOAD JAVASCRIPTS  -->
+	<script src='{{url.theme}}/slides.js'></script>
+	{{> javascripts }}
+</html>
+

+ 9 - 0
libraries/frameworks/html5slides/default/layouts/head.html

@@ -0,0 +1,9 @@
+<meta charset='utf-8'>
+<title>{{ title }}</title>
+<meta name="description" content="{{ title }}">
+<meta name="author" content="{{ author }}">
+<meta name="generator" content="slidify" />
+
+<!-- LOAD STYLE SHEETS -->
+<link rel="stylesheet" href="{{url.theme}}/styles.css">
+<link rel="stylesheet" href="{{url.highlighter}}/css/{{hitheme}}.css" />

+ 5 - 0
libraries/frameworks/html5slides/default/layouts/slide.html

@@ -0,0 +1,5 @@
+<article class="{{ class }}" id="{{ id }}" style="background:{{{ bg }}};">
+  <h3>{{{ title }}}</h3>
+  {{{ content }}}
+</article>
+

+ 635 - 0
libraries/frameworks/html5slides/default/slides.js

@@ -0,0 +1,635 @@
+/*
+  Google HTML5 slides template
+
+  Authors: Luke Mahé (code)
+           Marcin Wichary (code and design)
+
+           Dominic Mazzoni (browser compatibility)
+           Charles Chen (ChromeVox support)
+
+  URL: http://code.google.com/p/html5slides/
+*/
+
+var PERMANENT_URL_PREFIX = 'inst/frameworks/html5slides';
+
+var SLIDE_CLASSES = ['far-past', 'past', 'current', 'next', 'far-next'];
+
+var PM_TOUCH_SENSITIVITY = 15;
+
+var curSlide;
+
+/* ---------------------------------------------------------------------- */
+/* classList polyfill by Eli Grey 
+ * (http://purl.eligrey.com/github/classList.js/blob/master/classList.js) */
+
+if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) {
+
+(function (view) {
+
+var
+    classListProp = "classList"
+  , protoProp = "prototype"
+  , elemCtrProto = (view.HTMLElement || view.Element)[protoProp]
+  , objCtr = Object
+    strTrim = String[protoProp].trim || function () {
+    return this.replace(/^\s+|\s+$/g, "");
+  }
+  , arrIndexOf = Array[protoProp].indexOf || function (item) {
+    for (var i = 0, len = this.length; i < len; i++) {
+      if (i in this && this[i] === item) {
+        return i;
+      }
+    }
+    return -1;
+  }
+  // Vendors: please allow content code to instantiate DOMExceptions
+  , DOMEx = function (type, message) {
+    this.name = type;
+    this.code = DOMException[type];
+    this.message = message;
+  }
+  , checkTokenAndGetIndex = function (classList, token) {
+    if (token === "") {
+      throw new DOMEx(
+          "SYNTAX_ERR"
+        , "An invalid or illegal string was specified"
+      );
+    }
+    if (/\s/.test(token)) {
+      throw new DOMEx(
+          "INVALID_CHARACTER_ERR"
+        , "String contains an invalid character"
+      );
+    }
+    return arrIndexOf.call(classList, token);
+  }
+  , ClassList = function (elem) {
+    var
+        trimmedClasses = strTrim.call(elem.className)
+      , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
+    ;
+    for (var i = 0, len = classes.length; i < len; i++) {
+      this.push(classes[i]);
+    }
+    this._updateClassName = function () {
+      elem.className = this.toString();
+    };
+  }
+  , classListProto = ClassList[protoProp] = []
+  , classListGetter = function () {
+    return new ClassList(this);
+  }
+;
+// Most DOMException implementations don't allow calling DOMException's toString()
+// on non-DOMExceptions. Error's toString() is sufficient here.
+DOMEx[protoProp] = Error[protoProp];
+classListProto.item = function (i) {
+  return this[i] || null;
+};
+classListProto.contains = function (token) {
+  token += "";
+  return checkTokenAndGetIndex(this, token) !== -1;
+};
+classListProto.add = function (token) {
+  token += "";
+  if (checkTokenAndGetIndex(this, token) === -1) {
+    this.push(token);
+    this._updateClassName();
+  }
+};
+classListProto.remove = function (token) {
+  token += "";
+  var index = checkTokenAndGetIndex(this, token);
+  if (index !== -1) {
+    this.splice(index, 1);
+    this._updateClassName();
+  }
+};
+classListProto.toggle = function (token) {
+  token += "";
+  if (checkTokenAndGetIndex(this, token) === -1) {
+    this.add(token);
+  } else {
+    this.remove(token);
+  }
+};
+classListProto.toString = function () {
+  return this.join(" ");
+};
+
+if (objCtr.defineProperty) {
+  var classListPropDesc = {
+      get: classListGetter
+    , enumerable: true
+    , configurable: true
+  };
+  try {
+    objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+  } catch (ex) { // IE 8 doesn't support enumerable:true
+    if (ex.number === -0x7FF5EC54) {
+      classListPropDesc.enumerable = false;
+      objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+    }
+  }
+} else if (objCtr[protoProp].__defineGetter__) {
+  elemCtrProto.__defineGetter__(classListProp, classListGetter);
+}
+
+}(self));
+
+}
+/* ---------------------------------------------------------------------- */
+
+/* Slide movement */
+
+function getSlideEl(no) {
+  if ((no < 0) || (no >= slideEls.length)) { 
+    return null;
+  } else {
+    return slideEls[no];
+  }
+};
+
+function updateSlideClass(slideNo, className) {
+  var el = getSlideEl(slideNo);
+  
+  if (!el) {
+    return;
+  }
+  
+  if (className) {
+    el.classList.add(className);
+  }
+    
+  for (var i in SLIDE_CLASSES) {
+    if (className != SLIDE_CLASSES[i]) {
+      el.classList.remove(SLIDE_CLASSES[i]);
+    }
+  }
+};
+
+function updateSlides() {
+  for (var i = 0; i < slideEls.length; i++) {
+    switch (i) {
+      case curSlide - 2:
+        updateSlideClass(i, 'far-past');
+        break;
+      case curSlide - 1:
+        updateSlideClass(i, 'past');
+        break;
+      case curSlide: 
+        updateSlideClass(i, 'current');
+        break;
+      case curSlide + 1:
+        updateSlideClass(i, 'next');      
+        break;
+      case curSlide + 2:
+        updateSlideClass(i, 'far-next');      
+        break;
+      default:
+        updateSlideClass(i);
+        break;
+    }
+  }
+
+  triggerLeaveEvent(curSlide - 1);
+  triggerEnterEvent(curSlide);
+
+  window.setTimeout(function() {
+    // Hide after the slide
+    disableSlideFrames(curSlide - 2);
+  }, 301);
+
+  enableSlideFrames(curSlide - 1);
+  enableSlideFrames(curSlide + 2);
+  
+  if (isChromeVoxActive()) {
+    speakAndSyncToNode(slideEls[curSlide]);
+  }  
+
+  updateHash();
+};
+
+function buildNextItem() {
+  var toBuild  = slideEls[curSlide].querySelectorAll('.to-build');
+
+  if (!toBuild.length) {
+    return false;
+  }
+
+  toBuild[0].classList.remove('to-build', '');
+
+  if (isChromeVoxActive()) {
+    speakAndSyncToNode(toBuild[0]);
+  }
+
+  return true;
+};
+
+function prevSlide() {
+  if (curSlide > 0) {
+    curSlide--;
+
+    updateSlides();
+  }
+};
+
+function nextSlide() {
+  if (buildNextItem()) {
+    return;
+  }
+
+  if (curSlide < slideEls.length - 1) {
+    curSlide++;
+
+    updateSlides();
+  }
+};
+
+/* Slide events */
+
+function triggerEnterEvent(no) {
+  var el = getSlideEl(no);
+  if (!el) {
+    return;
+  }
+
+  var onEnter = el.getAttribute('onslideenter');
+  if (onEnter) {
+    new Function(onEnter).call(el);
+  }
+
+  var evt = document.createEvent('Event');
+  evt.initEvent('slideenter', true, true);
+  evt.slideNumber = no + 1; // Make it readable
+
+  el.dispatchEvent(evt);
+};
+
+function triggerLeaveEvent(no) {
+  var el = getSlideEl(no);
+  if (!el) {
+    return;
+  }
+
+  var onLeave = el.getAttribute('onslideleave');
+  if (onLeave) {
+    new Function(onLeave).call(el);
+  }
+
+  var evt = document.createEvent('Event');
+  evt.initEvent('slideleave', true, true);
+  evt.slideNumber = no + 1; // Make it readable
+  
+  el.dispatchEvent(evt);
+};
+
+/* Touch events */
+
+function handleTouchStart(event) {
+  if (event.touches.length == 1) {
+    touchDX = 0;
+    touchDY = 0;
+
+    touchStartX = event.touches[0].pageX;
+    touchStartY = event.touches[0].pageY;
+
+    document.body.addEventListener('touchmove', handleTouchMove, true);
+    document.body.addEventListener('touchend', handleTouchEnd, true);
+  }
+};
+
+function handleTouchMove(event) {
+  if (event.touches.length > 1) {
+    cancelTouch();
+  } else {
+    touchDX = event.touches[0].pageX - touchStartX;
+    touchDY = event.touches[0].pageY - touchStartY;
+  }
+};
+
+function handleTouchEnd(event) {
+  var dx = Math.abs(touchDX);
+  var dy = Math.abs(touchDY);
+
+  if ((dx > PM_TOUCH_SENSITIVITY) && (dy < (dx * 2 / 3))) {
+    if (touchDX > 0) {
+      prevSlide();
+    } else {
+      nextSlide();
+    }
+  }
+  
+  cancelTouch();
+};
+
+function cancelTouch() {
+  document.body.removeEventListener('touchmove', handleTouchMove, true);
+  document.body.removeEventListener('touchend', handleTouchEnd, true);  
+};
+
+/* Preloading frames */
+
+function disableSlideFrames(no) {
+  var el = getSlideEl(no);
+  if (!el) {
+    return;
+  }
+
+  var frames = el.getElementsByTagName('iframe');
+  for (var i = 0, frame; frame = frames[i]; i++) {
+    disableFrame(frame);
+  }
+};
+
+function enableSlideFrames(no) {
+  var el = getSlideEl(no);
+  if (!el) {
+    return;
+  }
+
+  var frames = el.getElementsByTagName('iframe');
+  for (var i = 0, frame; frame = frames[i]; i++) {
+    enableFrame(frame);
+  }
+};
+
+function disableFrame(frame) {
+  frame.src = 'about:blank';
+};
+
+function enableFrame(frame) {
+  var src = frame._src;
+
+  if (frame.src != src && src != 'about:blank') {
+    frame.src = src;
+  }
+};
+
+function setupFrames() {
+  var frames = document.querySelectorAll('iframe');
+  for (var i = 0, frame; frame = frames[i]; i++) {
+    frame._src = frame.src;
+    disableFrame(frame);
+  }
+  
+  enableSlideFrames(curSlide);
+  enableSlideFrames(curSlide + 1);
+  enableSlideFrames(curSlide + 2);  
+};
+
+function setupInteraction() {
+  /* Clicking and tapping */
+  
+  var el = document.createElement('div');
+  el.className = 'slide-area';
+  el.id = 'prev-slide-area';  
+  el.addEventListener('click', prevSlide, false);
+  document.querySelector('section.slides').appendChild(el);
+
+  var el = document.createElement('div');
+  el.className = 'slide-area';
+  el.id = 'next-slide-area';  
+  el.addEventListener('click', nextSlide, false);
+  document.querySelector('section.slides').appendChild(el);  
+  
+  /* Swiping */
+  
+  document.body.addEventListener('touchstart', handleTouchStart, false);
+}
+
+/* ChromeVox support */
+
+function isChromeVoxActive() {
+  if (typeof(cvox) == 'undefined') {
+    return false;
+  } else {
+    return true;
+  }
+};
+
+function speakAndSyncToNode(node) {
+  if (!isChromeVoxActive()) {
+    return;
+  }
+  
+  cvox.ChromeVox.navigationManager.switchToStrategy(
+      cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true);  
+  cvox.ChromeVox.navigationManager.syncToNode(node);
+  cvox.ChromeVoxUserCommands.finishNavCommand('');
+  var target = node;
+  while (target.firstChild) {
+    target = target.firstChild;
+  }
+  cvox.ChromeVox.navigationManager.syncToNode(target);
+};
+
+function speakNextItem() {
+  if (!isChromeVoxActive()) {
+    return;
+  }
+  
+  cvox.ChromeVox.navigationManager.switchToStrategy(
+      cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true);
+  cvox.ChromeVox.navigationManager.next(true);
+  if (!cvox.DomUtil.isDescendantOfNode(
+      cvox.ChromeVox.navigationManager.getCurrentNode(), slideEls[curSlide])){
+    var target = slideEls[curSlide];
+    while (target.firstChild) {
+      target = target.firstChild;
+    }
+    cvox.ChromeVox.navigationManager.syncToNode(target);
+    cvox.ChromeVox.navigationManager.next(true);
+  }
+  cvox.ChromeVoxUserCommands.finishNavCommand('');
+};
+
+function speakPrevItem() {
+  if (!isChromeVoxActive()) {
+    return;
+  }
+  
+  cvox.ChromeVox.navigationManager.switchToStrategy(
+      cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true);
+  cvox.ChromeVox.navigationManager.previous(true);
+  if (!cvox.DomUtil.isDescendantOfNode(
+      cvox.ChromeVox.navigationManager.getCurrentNode(), slideEls[curSlide])){
+    var target = slideEls[curSlide];
+    while (target.lastChild){
+      target = target.lastChild;
+    }
+    cvox.ChromeVox.navigationManager.syncToNode(target);
+    cvox.ChromeVox.navigationManager.previous(true);
+  }
+  cvox.ChromeVoxUserCommands.finishNavCommand('');
+};
+
+/* Hash functions */
+
+function getCurSlideFromHash() {
+  var slideNo = parseInt(location.hash.substr(1));
+
+  if (slideNo) {
+    curSlide = slideNo - 1;
+  } else {
+    curSlide = 0;
+  }
+};
+
+function updateHash() {
+  location.replace('#' + (curSlide + 1));
+};
+
+/* Event listeners */
+
+function handleBodyKeyDown(event) {
+  switch (event.keyCode) {
+    case 39: // right arrow
+    case 13: // Enter
+    case 32: // space
+    case 34: // PgDn
+      nextSlide();
+      event.preventDefault();
+      break;
+
+    case 37: // left arrow
+    case 8: // Backspace
+    case 33: // PgUp
+      prevSlide();
+      event.preventDefault();
+      break;
+
+    case 40: // down arrow
+      if (isChromeVoxActive()) {
+        speakNextItem();
+      } else {
+        nextSlide();
+      }
+      event.preventDefault();
+      break;
+
+    case 38: // up arrow
+      if (isChromeVoxActive()) {
+        speakPrevItem();
+      } else {
+        prevSlide();
+      }
+      event.preventDefault();
+      break;
+  }
+};
+
+function addEventListeners() {
+  document.addEventListener('keydown', handleBodyKeyDown, false);  
+};
+
+/* Initialization */
+/* Disable Google Prettify */ 
+
+// function addPrettify() {
+//   var els = document.querySelectorAll('pre');
+//   for (var i = 0, el; el = els[i]; i++) {
+//     if (!el.classList.contains('noprettyprint')) {
+//       el.classList.add('prettyprint');
+//     }
+//   }
+//   
+//   var el = document.createElement('script');
+//   el.type = 'text/javascript';
+//   el.src = PERMANENT_URL_PREFIX + 'prettify.js';
+//   el.onload = function() {
+//     prettyPrint();
+//   }
+//   document.body.appendChild(el);
+// };
+
+function addFontStyle() {
+  var el = document.createElement('link');
+  el.rel = 'stylesheet';
+  el.type = 'text/css';
+  el.href = 'http://fonts.googleapis.com/css?family=' +
+            'Open+Sans:regular,semibold,italic,italicsemibold|Droid+Sans+Mono';
+
+  document.body.appendChild(el);
+};
+
+function addGeneralStyle() {
+  var el = document.createElement('link');
+  el.rel = 'stylesheet';
+  el.type = 'text/css';
+  el.href = PERMANENT_URL_PREFIX + 'styles.css';
+  document.body.appendChild(el);
+  
+  var el = document.createElement('meta');
+  el.name = 'viewport';
+  el.content = 'width=1100,height=750';
+  document.querySelector('head').appendChild(el);
+  
+  var el = document.createElement('meta');
+  el.name = 'apple-mobile-web-app-capable';
+  el.content = 'yes';
+  document.querySelector('head').appendChild(el);
+};
+
+function makeBuildLists() {
+  for (var i = curSlide, slide; slide = slideEls[i]; i++) {
+    var items = slide.querySelectorAll('.build > *');
+    for (var j = 0, item; item = items[j]; j++) {
+      if (item.classList) {
+        item.classList.add('to-build');
+      }
+    }
+  }
+};
+
+function handleDomLoaded() {
+  slideEls = document.querySelectorAll('section.slides > article');
+
+  setupFrames();
+
+  // addFontStyle();
+  addGeneralStyle();
+  // addPrettify();
+  addEventListeners();
+
+  updateSlides();
+
+  setupInteraction();
+  makeBuildLists();
+
+  document.body.classList.add('loaded');
+};
+
+function initialize() {
+  getCurSlideFromHash();
+
+  if (window['_DEBUG']) {
+    PERMANENT_URL_PREFIX = '../';
+  }
+
+  if (window['_DCL']) {
+    handleDomLoaded();
+  } else {
+    document.addEventListener('DOMContentLoaded', handleDomLoaded, false);
+  }
+}
+
+// If ?debug exists then load the script relative instead of absolute
+if (!window['_DEBUG'] && document.location.href.indexOf('?debug') !== -1) {
+  document.addEventListener('DOMContentLoaded', function() {
+    // Avoid missing the DomContentLoaded event
+    window['_DCL'] = true
+  }, false);
+
+  window['_DEBUG'] = true;
+  var script = document.createElement('script');
+  script.type = 'text/javascript';
+  script.src = '../slides.js';
+  var s = document.getElementsByTagName('script')[0];
+  s.parentNode.insertBefore(script, s);
+
+  // Remove this script
+  s.parentNode.removeChild(s);
+} else {
+  initialize();
+}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
libraries/frameworks/html5slides/default/slides.min.js


+ 612 - 0
libraries/frameworks/html5slides/default/styles.css

@@ -0,0 +1,612 @@
+/*
+  Google HTML5 slides template
+
+  Authors: Luke Mah?? (code)
+           Marcin Wichary (code and design)
+           
+           Dominic Mazzoni (browser compatibility)
+           Charles Chen (ChromeVox support)
+
+  URL: http://code.google.com/p/html5slides/
+*/
+
+/* Framework */
+
+@import url(http://fonts.googleapis.com/css?family=Ubuntu+Mono);
+
+article p{
+    text-align:justify;
+}
+
+html {
+  height: 100%;
+}
+
+body {
+  margin: 0;
+  padding: 0;
+
+  display: block !important;
+
+  height: 100%;
+  min-height: 740px;
+  
+  overflow-x: hidden;
+  overflow-y: auto;
+
+  background: rgb(215, 215, 215);
+  background: -o-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
+  background: -moz-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
+  background: -webkit-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
+  background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 500, from(rgb(240, 240, 240)), to(rgb(190, 190, 190)));
+
+  -webkit-font-smoothing: antialiased;
+}
+
+.slides {
+  width: 100%;
+  height: 100%;
+  left: 0;
+  top: 0;
+  
+  position: absolute;
+
+  -webkit-transform: translate3d(0, 0, 0);
+}
+
+.slides > article {
+  display: block;
+
+  position: absolute;
+  overflow: hidden;
+
+  width: 900px;
+  height: 700px;
+
+  left: 50%;
+  top: 50%;
+
+  margin-left: -450px;
+  margin-top: -350px;
+  
+  padding: 40px 60px;
+
+  box-sizing: border-box;
+  -o-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+
+  border-radius: 10px;
+  -o-border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+
+  background-color: white;
+
+  box-shadow: 0 2px 6px rgba(0, 0, 0, .1);
+  border: 1px solid rgba(0, 0, 0, .3);
+
+  transition: transform .3s ease-out;
+  -o-transition: -o-transform .3s ease-out;
+  -moz-transition: -moz-transform .3s ease-out;
+  -webkit-transition: -webkit-transform .3s ease-out;
+}
+.slides.layout-widescreen > article {
+  margin-left: -550px;
+  width: 1100px;
+}
+.slides.layout-faux-widescreen > article {
+  margin-left: -550px;
+  width: 1100px;
+  
+  padding: 40px 160px;
+}
+
+.slides.template-default > article:not(.nobackground):not(.biglogo) {
+/*  background: url(images/slidify-logo-small.png) 765px 650px no-repeat;   */
+  background-color: white;  
+} 
+
+.slides.template-io2011 > article:not(.nobackground):not(.biglogo) {
+  /*background: url(images/colorbar.png) 0 600px repeat-x,
+                url(images/googleio-logo.png) 640px 625px no-repeat;*/
+
+  background-size: 100%, 225px;  
+
+  background-color: white;  
+}
+.slides.layout-widescreen > article:not(.nobackground):not(.biglogo),
+.slides.layout-faux-widescreen > article:not(.nobackground):not(.biglogo) {
+  background-position-x: 0, 840px;
+}
+
+/* Clickable/tappable areas */
+
+.slide-area {
+  z-index: 1000;
+
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 150px;
+  height: 700px;  
+
+  left: 50%;
+  top: 50%;
+
+  cursor: pointer;  
+  margin-top: -350px;  
+  
+  tap-highlight-color: transparent;
+  -o-tap-highlight-color: transparent;
+  -moz-tap-highlight-color: transparent;
+  -webkit-tap-highlight-color: transparent;
+}
+#prev-slide-area {
+  margin-left: -550px;
+}
+#next-slide-area {
+  margin-left: 400px;
+}
+.slides.layout-widescreen #prev-slide-area,
+.slides.layout-faux-widescreen #prev-slide-area {
+  margin-left: -650px;
+}
+.slides.layout-widescreen #next-slide-area,
+.slides.layout-faux-widescreen #next-slide-area {
+  margin-left: 500px;
+}
+
+/* Slide styles */
+
+.slides.template-default article.biglogo {
+  background: white url(images/slidify-logo.jpg) 50% 50% no-repeat;
+}
+
+.slides.template-io2011 article.biglogo {
+  background: white url(images/googleio-logo.png) 50% 50% no-repeat;
+
+  background-size: 600px;
+}
+
+/* Slides */
+
+.slides > article {
+  display: none;
+}
+.slides > article.far-past {
+  display: block;
+  transform: translate(-2040px);
+  -o-transform: translate(-2040px);
+  -moz-transform: translate(-2040px);
+  -webkit-transform: translate3d(-2040px, 0, 0);
+}
+.slides > article.past {
+  display: block;
+  transform: translate(-1020px);
+  -o-transform: translate(-1020px);
+  -moz-transform: translate(-1020px);
+  -webkit-transform: translate3d(-1020px, 0, 0);
+}
+.slides > article.current {
+  display: block;
+  transform: translate(0);
+  -o-transform: translate(0);
+  -moz-transform: translate(0);
+  -webkit-transform: translate3d(0, 0, 0);
+}
+.slides > article.next {
+  display: block;
+  transform: translate(1020px);
+  -o-transform: translate(1020px);
+  -moz-transform: translate(1020px);
+  -webkit-transform: translate3d(1020px, 0, 0);
+}
+.slides > article.far-next {
+  display: block;
+  transform: translate(2040px);
+  -o-transform: translate(2040px);
+  -moz-transform: translate(2040px);
+  -webkit-transform: translate3d(2040px, 0, 0);
+}
+
+.slides.layout-widescreen > article.far-past,
+.slides.layout-faux-widescreen > article.far-past {
+  display: block;
+  transform: translate(-2260px);
+  -o-transform: translate(-2260px);
+  -moz-transform: translate(-2260px);
+  -webkit-transform: translate3d(-2260px, 0, 0);
+}
+.slides.layout-widescreen > article.past,
+.slides.layout-faux-widescreen > article.past {
+  display: block;
+  transform: translate(-1130px);
+  -o-transform: translate(-1130px);
+  -moz-transform: translate(-1130px);
+  -webkit-transform: translate3d(-1130px, 0, 0);
+}
+.slides.layout-widescreen > article.current,
+.slides.layout-faux-widescreen > article.current {
+  display: block;
+  transform: translate(0);
+  -o-transform: translate(0);
+  -moz-transform: translate(0);
+  -webkit-transform: translate3d(0, 0, 0);
+}
+.slides.layout-widescreen > article.next,
+.slides.layout-faux-widescreen > article.next {
+  display: block;
+  transform: translate(1130px);
+  -o-transform: translate(1130px);
+  -moz-transform: translate(1130px);
+  -webkit-transform: translate3d(1130px, 0, 0);
+}
+.slides.layout-widescreen > article.far-next,
+.slides.layout-faux-widescreen > article.far-next {
+  display: block;
+  transform: translate(2260px);
+  -o-transform: translate(2260px);
+  -moz-transform: translate(2260px);
+  -webkit-transform: translate3d(2260px, 0, 0);
+}
+
+/* Styles for slides */
+
+.slides > article {
+  font-family: 'Open Sans', Arial, sans-serif;
+
+  color: rgb(102, 102, 102);
+ /* text-shadow: 0 1px 1px rgba(0, 0, 0, .1);
+ */
+  font-size: 30px;
+  line-height: 36px;
+
+  letter-spacing: -1px;
+}
+
+b {
+  font-weight: 600;
+}
+
+.blue {
+  color: rgb(0, 102, 204);
+}
+.yellow {
+  color: rgb(255, 211, 25);
+}
+.green {
+  color: rgb(0, 138, 53);
+}
+.red {
+  color: rgb(255, 0, 0);
+}
+.black {
+  color: black;
+}
+.white {
+  color: white;
+}
+
+a {
+  color: rgb(0, 102, 204);
+}
+a:visited {
+  color: rgba(0, 102, 204, .75);
+}
+a:hover {
+  color: black;
+}
+
+p {
+  margin: 0;
+  padding: 0;
+
+  margin-top: 20px;
+}
+p:first-child {
+  margin-top: 0;
+}
+
+h1 {
+  font-size: 60px;
+  line-height: 60px;
+
+  padding: 0;
+  margin: 0;
+  margin-top: 200px;
+  padding-right: 40px;
+
+  font-weight: 600;
+
+  letter-spacing: -3px;
+
+  color: rgb(51, 51, 51);
+}
+
+h2 {
+  font-size: 45px;
+  line-height: 45px;
+
+  position: absolute;
+  bottom: 150px;
+
+  padding: 0;
+  margin: 0;
+  padding-right: 40px;
+
+  font-weight: 600;
+
+  letter-spacing: -2px;
+
+  color: rgb(51, 51, 51);
+}
+
+h3 {
+  font-size: 30px;
+  line-height: 36px;
+
+  padding: 0;
+  margin: 0;
+  padding-right: 40px;
+
+  font-weight: 600;
+
+  letter-spacing: -1px;
+
+  color: rgb(51, 51, 51);
+}
+
+article.fill h3 {
+  background: rgba(255, 255, 255, .75);
+  padding-top: .2em;
+  padding-bottom: .3em;
+  margin-top: -.2em;
+  margin-left: -60px;
+  padding-left: 60px;
+  margin-right: -60px;
+  padding-right: 60px;
+}
+
+ul {
+  list-style: square;
+  margin: 0;
+  padding: 2;
+  margin-top: 40px;
+  margin-left: .75em;
+}
+
+ul:first-child {
+  margin-top: 0;
+}
+
+ul ul {
+  margin-top: .5em;
+}
+
+li {
+  padding: 0;
+  margin: 0;
+  margin-bottom: .5em;
+}
+
+li::before {
+  content: '';
+  width: .75em;
+  margin-left: -.75em;
+  position: absolute;
+}
+
+pre {
+   font-family: "Consolas", Monaco, monospace;
+   font-size: 18px;
+   line-height: 20px;
+  /* padding: 5px 10px;*/
+  /* letter-spacing: -1px;*/
+  /* margin-top: 40px;
+     margin-bottom: 40px;*/
+     color: black;
+  /* background: rgb(240, 240, 240);*/
+  /* border: 1px solid rgb(224, 224, 224);*/
+  /* box-shadow: inset 0 2px 6px rgba(0, 0, 0, .1);*/
+   -webkit-border-radius:6px;
+   -moz-border-radius:6px;
+    border-radius:10px;
+    overflow: hidden;
+}
+
+code {
+  font-size: 1em;
+  font-family: Consolas, monospace;
+  color: black;
+}
+
+iframe {
+  width: 100%;
+  height: 620px;
+  background: white;
+  border: 1px solid rgb(192, 192, 192);
+  margin: -1px;
+  /*box-shadow: inset 0 2px 6px rgba(0, 0, 0, .1);*/
+}
+
+h3 + iframe {
+  margin-top: 40px;
+  height: 540px;
+}
+
+article.fill iframe {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+
+  border: 0;
+  margin: 0;
+
+  border-radius: 10px;
+  -o-border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+
+  z-index: -1;
+}
+
+article.fill img {
+  position: absolute;
+  left: 0;
+  top: 0;
+  min-width: 100%;
+  min-height: 100%;
+
+  border-radius: 10px;
+  -o-border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+
+  z-index: -1;
+}
+
+img.centered {
+  margin: 0 auto;
+  display: block;
+}
+
+table {
+  width: 100%;
+  border-collapse: collapse;
+  margin-top: 40px;
+}
+th {
+  font-weight: 600;
+  text-align: left;
+}
+td,
+th {
+  border: 1px solid rgb(224, 224, 224);
+  padding: 5px 10px;
+  vertical-align: top;
+}
+
+/*.source {
+  position: absolute;
+  left: 60px;
+  top: 644px;
+  padding-right: 175px;
+  
+  font-size: 15px;
+  letter-spacing: 0;  
+  line-height: 18px;
+}*/
+
+q {
+  display: block;
+  font-size: 60px;
+  line-height: 72px;
+  
+  margin-left: 20px;
+  
+  margin-top: 100px;
+  margin-right: 150px;    
+}
+q::before {
+  content: '“';
+  
+  position: absolute;
+  display: inline-block;
+  margin-left: -2.1em;
+  width: 2em;
+  text-align: right;
+  
+  font-size: 90px;
+  color: rgb(192, 192, 192);
+}
+q::after {
+  content: '”';
+
+  position: absolute;  
+  margin-left: .1em;
+
+  font-size: 90px;
+  color: rgb(192, 192, 192);  
+}
+div.author {
+  text-align: right;  
+  font-size: 40px;
+  
+  margin-top: 20px;
+  margin-right: 150px;    
+}
+div.author::before {
+  content: '—';
+}
+
+/* Size variants */
+
+article.smaller p,
+article.smaller ul {
+  font-size: 20px;
+  line-height: 24px;
+  letter-spacing: 0;
+}
+article.smaller table {
+  font-size: 20px;
+  line-height: 24px;
+  letter-spacing: 0;
+}
+article.smaller pre {
+  font-size: 15px;
+  line-height: 20px;
+  letter-spacing: 0;
+}
+article.smaller q {
+  font-size: 40px;
+  line-height: 48px;
+}
+article.smaller q::before,
+article.smaller q::after {
+  font-size: 60px;
+}
+
+/* Builds */
+
+.build > * {
+  transition: opacity 0.5s ease-in-out 0.2s;
+  -o-transition: opacity 0.5s ease-in-out 0.2s;
+  -moz-transition: opacity 0.5s ease-in-out 0.2s;
+  -webkit-transition: opacity 0.5s ease-in-out 0.2s;
+}
+
+.to-build {
+  opacity: 0;
+}
+
+/* Pretty print */
+
+.prettyprint .str, /* string content */
+.prettyprint .atv { /* a markup attribute value */
+  color: rgb(0, 138, 53); 
+}  
+.prettyprint .kwd, /* a keyword */
+.prettyprint .tag { /* a markup tag name */
+  color: rgb(0, 102, 204);
+}
+.prettyprint .com { /* a comment */
+  color: rgb(127, 127, 127); 
+  font-style: italic; 
+}  
+.prettyprint .lit { /* a literal value */
+  color: rgb(127, 0, 0);
+}  
+.prettyprint .pun, /* punctuation, lisp open bracket, lisp close bracket */
+.prettyprint .opn, 
+.prettyprint .clo { 
+  color: rgb(127, 127, 127); 
+}
+.prettyprint .typ, /* a type name */
+.prettyprint .atn, /* a markup attribute name */ 
+.prettyprint .dec, 
+.prettyprint .var { /* a declaration; a variable name */
+  color: rgb(127, 0, 127);
+}

+ 16 - 0
libraries/frameworks/html5slides/layouts/deck.html

@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+	{{> head }}
+  {{{ page.stylesheets }}}  
+</head>
+<body style='display: none'>
+	<section class='slides layout-regular template-regular'>
+     {{{ page.content }}}
+  </section>
+</body>
+  <!-- LOAD JAVASCRIPTS  -->
+	<script src='{{page.url.framework}}/{{page.html5slides.theme}}/slides.js'></script>
+	{{> javascripts }}
+</html>
+

+ 5 - 0
libraries/frameworks/html5slides/layouts/slide.html

@@ -0,0 +1,5 @@
+<article class="{{ slide.class }}" id="{{ slide.id }}" style="background:{{{ slide.bg }}};">
+  <h3>{{{ slide.title }}}</h3>
+  {{{ slide.content }}}
+</article>
+

+ 9 - 0
libraries/frameworks/html5slides/partials/head.html

@@ -0,0 +1,9 @@
+<meta charset='utf-8'>
+<title>{{ page.title }}</title>
+<meta name="description" content="{{ page.title }}">
+<meta name="author" content="{{ page.author }}">
+<meta name="generator" content="slidify" />
+
+<!-- LOAD STYLE SHEETS -->
+<link rel="stylesheet" href="{{page.url.framework}}/{{page.html5slides.theme}}/styles.css">
+<link rel="stylesheet" href="{{page.url.highlighter}}/css/{{page.hitheme}}.css" />

BIN
libraries/frameworks/html5slides/uulm/images/header_sample.jpg


+ 887 - 0
libraries/frameworks/html5slides/uulm/slides.js

@@ -0,0 +1,887 @@
+/*
+  Google HTML5 slides template
+
+  Authors: Luke Mahé (code)
+           Marcin Wichary (code and design)
+
+           Dominic Mazzoni (browser compatibility)
+           Charles Chen (ChromeVox support)
+           
+  URL: http://code.google.com/p/html5slides/
+
+  Contributors:
+           Benjamin Erb (presenter mode, notes, structuring) 
+
+  URL: https://github.com/berb/html5slides-uulm
+ */
+
+var SLIDE_CLASSES = [ 'far-past', 'past', 'current', 'next', 'far-next' ];
+
+var PM_TOUCH_SENSITIVITY = 15;
+
+var curSlide;
+
+var showPresenterNotes = false;
+var isPresenterSlave = false;
+var presenterSlaveWindow = null;
+var doTransitions = true;
+
+/* ---------------------------------------------------------------------- */
+/*
+ * classList polyfill by Eli Grey
+ * (http://purl.eligrey.com/github/classList.js/blob/master/classList.js)
+ */
+
+if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) {
+
+	(function(view) {
+
+		var classListProp = "classList", protoProp = "prototype", elemCtrProto = (view.HTMLElement || view.Element)[protoProp], objCtr = Object
+		strTrim = String[protoProp].trim || function() {
+			return this.replace(/^\s+|\s+$/g, "");
+		}, arrIndexOf = Array[protoProp].indexOf || function(item) {
+			for ( var i = 0, len = this.length; i < len; i++) {
+				if (i in this && this[i] === item) {
+					return i;
+				}
+			}
+			return -1;
+		}
+		// Vendors: please allow content code to instantiate DOMExceptions
+		, DOMEx = function(type, message) {
+			this.name = type;
+			this.code = DOMException[type];
+			this.message = message;
+		}, checkTokenAndGetIndex = function(classList, token) {
+			if (token === "") {
+				throw new DOMEx("SYNTAX_ERR", "An invalid or illegal string was specified");
+			}
+			if (/\s/.test(token)) {
+				throw new DOMEx("INVALID_CHARACTER_ERR", "String contains an invalid character");
+			}
+			return arrIndexOf.call(classList, token);
+		}, ClassList = function(elem) {
+			var trimmedClasses = strTrim.call(elem.className), classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [];
+			for ( var i = 0, len = classes.length; i < len; i++) {
+				this.push(classes[i]);
+			}
+			this._updateClassName = function() {
+				elem.className = this.toString();
+			};
+		}, classListProto = ClassList[protoProp] = [], classListGetter = function() {
+			return new ClassList(this);
+		};
+		// Most DOMException implementations don't allow calling DOMException's
+		// toString()
+		// on non-DOMExceptions. Error's toString() is sufficient here.
+		DOMEx[protoProp] = Error[protoProp];
+		classListProto.item = function(i) {
+			return this[i] || null;
+		};
+		classListProto.contains = function(token) {
+			token += "";
+			return checkTokenAndGetIndex(this, token) !== -1;
+		};
+		classListProto.add = function(token) {
+			token += "";
+			if (checkTokenAndGetIndex(this, token) === -1) {
+				this.push(token);
+				this._updateClassName();
+			}
+		};
+		classListProto.remove = function(token) {
+			token += "";
+			var index = checkTokenAndGetIndex(this, token);
+			if (index !== -1) {
+				this.splice(index, 1);
+				this._updateClassName();
+			}
+		};
+		classListProto.toggle = function(token) {
+			token += "";
+			if (checkTokenAndGetIndex(this, token) === -1) {
+				this.add(token);
+			}
+			else {
+				this.remove(token);
+			}
+		};
+		classListProto.toString = function() {
+			return this.join(" ");
+		};
+
+		if (objCtr.defineProperty) {
+			var classListPropDesc = {
+				get : classListGetter,
+				enumerable : true,
+				configurable : true
+			};
+			try {
+				objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+			}
+			catch (ex) { // IE 8 doesn't support enumerable:true
+				if (ex.number === -0x7FF5EC54) {
+					classListPropDesc.enumerable = false;
+					objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+				}
+			}
+		}
+		else if (objCtr[protoProp].__defineGetter__) {
+			elemCtrProto.__defineGetter__(classListProp, classListGetter);
+		}
+
+	}(self));
+
+}
+/* ---------------------------------------------------------------------- */
+
+/* Slide movement */
+
+function getSlideEl(no) {
+	if ((no < 0) || (no >= slideEls.length)) {
+		return null;
+	}
+	else {
+		return slideEls[no];
+	}
+};
+
+function updateSlideClass(slideNo, className) {
+	var el = getSlideEl(slideNo);
+
+	if (!el) {
+		return;
+	}
+
+	if (className) {
+		el.classList.add(className);
+	}
+
+	for ( var i in SLIDE_CLASSES) {
+		if (className != SLIDE_CLASSES[i]) {
+			el.classList.remove(SLIDE_CLASSES[i]);
+		}
+	}
+};
+
+function updateSlides() {
+	for ( var i = 0; i < slideEls.length; i++) {
+		switch (i) {
+			case curSlide - 2:
+				updateSlideClass(i, 'far-past');
+				break;
+			case curSlide - 1:
+				updateSlideClass(i, 'past');
+				break;
+			case curSlide:
+				updateSlideClass(i, 'current');
+				break;
+			case curSlide + 1:
+				updateSlideClass(i, 'next');
+				break;
+			case curSlide + 2:
+				updateSlideClass(i, 'far-next');
+				break;
+			default:
+				updateSlideClass(i);
+				break;
+		}
+	}
+
+	triggerLeaveEvent(curSlide - 1);
+	triggerEnterEvent(curSlide);
+
+	window.setTimeout(function() {
+		// Hide after the slide
+		disableSlideFrames(curSlide - 2);
+	}, 301);
+
+	enableSlideFrames(curSlide - 1);
+	enableSlideFrames(curSlide + 2);
+
+	if (isChromeVoxActive()) {
+		speakAndSyncToNode(slideEls[curSlide]);
+	}
+
+	updateHash();
+
+	if (presenterSlaveWindow !== null) {
+		presenterSlaveWindow.postMessage("" + curSlide, "*");
+	}
+};
+
+function buildNextItem() {
+	var toBuild = slideEls[curSlide].querySelectorAll('.to-build');
+
+	if (!toBuild.length) {
+		return false;
+	}
+
+	toBuild[0].classList.remove('to-build', '');
+
+	if (isChromeVoxActive()) {
+		speakAndSyncToNode(toBuild[0]);
+	}
+
+	return true;
+};
+
+function prevSlide() {
+	if (curSlide > 0) {
+		curSlide--;
+
+		updateSlides();
+	}
+};
+
+function nextSlide() {
+	if (buildNextItem()) {
+		return;
+	}
+
+	if (curSlide < slideEls.length - 1) {
+		curSlide++;
+
+		updateSlides();
+	}
+};
+
+function goToSlide(target) {
+	if (target >= 0 && target <= slideEls.length) {
+		var steps = target - (curSlide + 1);
+		while (steps !== 0) {
+			if (steps > 0) {
+				curSlide++;
+				steps--;
+			}
+			else if (steps < 0) {
+				curSlide--;
+				steps++;
+			}
+		}
+		updateSlides();
+	}
+};
+
+function togglePresenterNotes() {
+	if (showPresenterNotes === false) {
+		var section = document.querySelector("div.slides");
+		section.classList.add('presenter');
+	}
+	else {
+		var section = document.querySelector("div.slides");
+		section.classList.remove('presenter');
+	}
+	showPresenterNotes = !showPresenterNotes;
+
+};
+
+function toggleTransitions() {
+	if (doTransitions === false) {
+		var section = document.querySelector("div.slides");
+		section.classList.remove('no-trans');
+	}
+	else {
+		var section = document.querySelector("div.slides");
+		section.classList.add('no-trans');
+	}
+	doTransitions = !doTransitions;
+
+};
+
+/* Slide events */
+
+function triggerEnterEvent(no) {
+	var el = getSlideEl(no);
+	if (!el) {
+		return;
+	}
+
+	var onEnter = el.getAttribute('onslideenter');
+	if (onEnter) {
+		new Function(onEnter).call(el);
+	}
+
+	var evt = document.createEvent('Event');
+	evt.initEvent('slideenter', true, true);
+	evt.slideNumber = no + 1; // Make it readable
+
+	el.dispatchEvent(evt);
+};
+
+function triggerLeaveEvent(no) {
+	var el = getSlideEl(no);
+	if (!el) {
+		return;
+	}
+
+	var onLeave = el.getAttribute('onslideleave');
+	if (onLeave) {
+		new Function(onLeave).call(el);
+	}
+
+	var evt = document.createEvent('Event');
+	evt.initEvent('slideleave', true, true);
+	evt.slideNumber = no + 1; // Make it readable
+
+	el.dispatchEvent(evt);
+};
+
+/* Touch events */
+
+function handleTouchStart(event) {
+	if (event.touches.length == 1) {
+		touchDX = 0;
+		touchDY = 0;
+
+		touchStartX = event.touches[0].pageX;
+		touchStartY = event.touches[0].pageY;
+
+		document.body.addEventListener('touchmove', handleTouchMove, true);
+		document.body.addEventListener('touchend', handleTouchEnd, true);
+	}
+};
+
+function handleTouchMove(event) {
+	if (event.touches.length > 1) {
+		cancelTouch();
+	}
+	else {
+		touchDX = event.touches[0].pageX - touchStartX;
+		touchDY = event.touches[0].pageY - touchStartY;
+	}
+};
+
+function handleTouchEnd(event) {
+	var dx = Math.abs(touchDX);
+	var dy = Math.abs(touchDY);
+
+	if ((dx > PM_TOUCH_SENSITIVITY) && (dy < (dx * 2 / 3))) {
+		if (touchDX > 0) {
+			prevSlide();
+		}
+		else {
+			nextSlide();
+		}
+	}
+
+	cancelTouch();
+};
+
+function cancelTouch() {
+	document.body.removeEventListener('touchmove', handleTouchMove, true);
+	document.body.removeEventListener('touchend', handleTouchEnd, true);
+};
+
+/* Fadings */
+
+
+function toggleFade(type){
+
+	var fadeDiv = document.querySelector('#fadeDiv');
+	
+	if(fadeDiv === null){
+		fadeDiv  = document.createElement('div');
+		fadeDiv.id = "fadeDiv";
+		fadeDiv.className = type;
+		document.body.appendChild(fadeDiv);
+	}
+	else if(fadeDiv.className !== type){
+		fadeDiv.className = type;
+	}
+	
+	if(fadeDiv.style.display === "block"){
+		fadeDiv.style.display = "none";
+	}
+	else{
+		fadeDiv.style.display = "block";
+	}
+	
+}
+
+function toggleBlackOut(){
+	toggleFade("blackfade");
+}
+
+
+function toggleWhiteOut(){
+	toggleFade("whitefade");
+}
+
+function processToc(){
+
+	var sections = [];
+	
+	var els = document.querySelectorAll('.slides section');
+	for(var i = 0;i<els.length;i++){
+	
+		var slideSpan = els[i].querySelector('article footer span.slide-nr');
+		var lastSlideSpan = els[i].querySelector('article:last-child footer span.slide-nr');
+		var header = els[i].querySelector('header');
+	
+		if(slideSpan && lastSlideSpan && header){
+			var slideNr = slideSpan.innerHTML;
+			var lastSlideNr = lastSlideSpan.innerHTML;
+			var headerTitle = header.innerHTML;
+			
+			sections.push({
+				slideNr : slideNr,
+				lastSlideNr : lastSlideNr,
+				title : headerTitle
+			});
+						
+		}
+	}
+	
+	for ( var i = 0; i < slideEls.length; i++) {
+		var nav = slideEls[i].querySelector('nav.toc');
+		if(nav){
+			var ol = document.createElement('ol');
+			
+			for(var j = 0;j<sections.length;j++){
+				var liEl = document.createElement('li');
+				
+				
+				var nr = i+1;
+				if(nr < sections[j].slideNr){
+					liEl.className = 'future';
+				}
+				else if(nr > sections[j].lastSlideNr){
+					liEl.className = 'done';
+				}
+				else{
+					liEl.className = 'current';
+				}
+				
+				var aEl = document.createElement('a');
+				aEl.href = '#'+sections[j].slideNr;
+				aEl.innerHTML = sections[j].title;
+				
+				var callback = (function(nr){
+					aEl.addEventListener('click', function(){
+						goToSlide(nr);
+					});
+				})(sections[j].slideNr);
+				
+				liEl.appendChild(aEl);
+				ol.appendChild(liEl);
+				
+			}
+			nav.appendChild(ol);
+		}
+	}
+}
+
+/* Preloading frames */
+
+function disableSlideFrames(no) {
+	var el = getSlideEl(no);
+	if (!el) {
+		return;
+	}
+
+	var frames = el.getElementsByTagName('iframe');
+	for ( var i = 0, frame; frame = frames[i]; i++) {
+		disableFrame(frame);
+	}
+};
+
+function enableSlideFrames(no) {
+	var el = getSlideEl(no);
+	if (!el) {
+		return;
+	}
+
+	var frames = el.getElementsByTagName('iframe');
+	for ( var i = 0, frame; frame = frames[i]; i++) {
+		enableFrame(frame);
+	}
+};
+
+function disableFrame(frame) {
+	frame.src = 'about:blank';
+};
+
+function enableFrame(frame) {
+	var src = frame._src;
+
+	if (frame.src != src && src != 'about:blank') {
+		frame.src = src;
+	}
+};
+
+function setupFrames() {
+	var frames = document.querySelectorAll('iframe');
+	for ( var i = 0, frame; frame = frames[i]; i++) {
+		frame._src = frame.src;
+		disableFrame(frame);
+	}
+
+	enableSlideFrames(curSlide);
+	enableSlideFrames(curSlide + 1);
+	enableSlideFrames(curSlide + 2);
+};
+
+function setupInteraction() {
+	/* Clicking and tapping */
+
+	var el = document.createElement('div');
+	el.className = 'slide-area';
+	el.id = 'prev-slide-area';
+	el.addEventListener('click', prevSlide, false);
+	document.querySelector('div.slides').appendChild(el);
+
+	var el = document.createElement('div');
+	el.className = 'slide-area';
+	el.id = 'next-slide-area';
+	el.addEventListener('click', nextSlide, false);
+	document.querySelector('div.slides').appendChild(el);
+
+	/* Swiping */
+
+	document.body.addEventListener('touchstart', handleTouchStart, false);
+}
+
+/* ChromeVox support */
+
+function isChromeVoxActive() {
+	if (typeof (cvox) == 'undefined') {
+		return false;
+	}
+	else {
+		return true;
+	}
+};
+
+function speakAndSyncToNode(node) {
+	if (!isChromeVoxActive()) {
+		return;
+	}
+
+	cvox.ChromeVox.navigationManager.switchToStrategy(cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true);
+	cvox.ChromeVox.navigationManager.syncToNode(node);
+	cvox.ChromeVoxUserCommands.finishNavCommand('');
+	var target = node;
+	while (target.firstChild) {
+		target = target.firstChild;
+	}
+	cvox.ChromeVox.navigationManager.syncToNode(target);
+};
+
+function speakNextItem() {
+	if (!isChromeVoxActive()) {
+		return;
+	}
+
+	cvox.ChromeVox.navigationManager.switchToStrategy(cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true);
+	cvox.ChromeVox.navigationManager.next(true);
+	if (!cvox.DomUtil.isDescendantOfNode(cvox.ChromeVox.navigationManager.getCurrentNode(), slideEls[curSlide])) {
+		var target = slideEls[curSlide];
+		while (target.firstChild) {
+			target = target.firstChild;
+		}
+		cvox.ChromeVox.navigationManager.syncToNode(target);
+		cvox.ChromeVox.navigationManager.next(true);
+	}
+	cvox.ChromeVoxUserCommands.finishNavCommand('');
+};
+
+function speakPrevItem() {
+	if (!isChromeVoxActive()) {
+		return;
+	}
+
+	cvox.ChromeVox.navigationManager.switchToStrategy(cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true);
+	cvox.ChromeVox.navigationManager.previous(true);
+	if (!cvox.DomUtil.isDescendantOfNode(cvox.ChromeVox.navigationManager.getCurrentNode(), slideEls[curSlide])) {
+		var target = slideEls[curSlide];
+		while (target.lastChild) {
+			target = target.lastChild;
+		}
+		cvox.ChromeVox.navigationManager.syncToNode(target);
+		cvox.ChromeVox.navigationManager.previous(true);
+	}
+	cvox.ChromeVoxUserCommands.finishNavCommand('');
+};
+
+/* Hash functions */
+
+function getCurSlideFromHash() {
+	var slideNo = parseInt(location.hash.substr(1));
+
+	if (slideNo) {
+		curSlide = slideNo - 1;
+	}
+	else {
+		curSlide = 0;
+	}
+};
+
+function updateHash() {
+	location.replace('#' + (curSlide + 1));
+};
+
+/* Event listeners */
+
+function handleBodyKeyDown(event) {
+	switch (event.keyCode) {
+		case 39: // right arrow
+		case 13: // Enter
+		case 32: // space
+		case 34: // PgDn
+			nextSlide();
+			event.preventDefault();
+			break;
+
+		case 37: // left arrow
+		case 8: // Backspace
+		case 33: // PgUp
+			prevSlide();
+			event.preventDefault();
+			break;
+
+		case 40: // down arrow
+			if (isChromeVoxActive()) {
+				speakNextItem();
+			}
+			else {
+				nextSlide();
+			}
+			event.preventDefault();
+			break;
+
+		case 38: // up arrow
+			if (isChromeVoxActive()) {
+				speakPrevItem();
+			}
+			else {
+				prevSlide();
+			}
+			event.preventDefault();
+			break;
+
+		case 71: // g
+		case 103: // G
+			var nr = prompt("Go to slide", (curSlide + 1));
+			goToSlide(parseInt(nr));
+			event.preventDefault();
+			// Fix for (at least) FF: set focus on slide again to get next key
+			// event
+			window.focus();
+			break;
+
+		case 36: // home
+			goToSlide(1);
+			event.preventDefault();
+			break;
+
+		case 35: // end
+			goToSlide(slideEls.length);
+			event.preventDefault();
+			break;
+
+		case 190: // "."
+			if (presenterSlaveWindow !== null) {
+				presenterSlaveWindow.postMessage("forward", "*");
+			}
+			event.preventDefault();
+			break;
+
+		case 188: // ","
+			if (presenterSlaveWindow !== null) {
+				presenterSlaveWindow.postMessage("back", "*");
+			}
+			event.preventDefault();
+			break;
+
+		case 80:
+		case 112:
+			if (!isPresenterSlave && presenterSlaveWindow === null) {
+				presenterSlaveWindow = window.open(window.location.href, "Presenter Notes", "dependent=yes,width=900,height=700");
+				// Wait some time (2 sec.) hoping that the window has been opened
+				setTimeout(function() {
+					if (presenterSlaveWindow !== null) {
+						// you are a slave now!
+						presenterSlaveWindow.postMessage("slave", "*");
+						// goto master's current slide
+						presenterSlaveWindow.postMessage("" + curSlide, "*");
+					}
+				}, 2000);
+				// if master has notes enabled, toggle now
+				if (showPresenterNotes) {
+					togglePresenterNotes();
+				}
+
+			}
+			event.preventDefault();
+			break;
+
+		case 78: // n / N
+		case 110:
+			if (presenterSlaveWindow !== null) {
+				presenterSlaveWindow.postMessage("togglenotes", "*");
+			}
+			else {
+				togglePresenterNotes();
+			}
+			event.preventDefault();
+			break;
+
+		case 84: // t / T
+		case 110:
+			toggleTransitions();
+			event.preventDefault();
+			break;
+
+		case 66: // b 
+			toggleBlackOut();
+			break;
+		case 87: // w 
+			toggleWhiteOut();
+			break;
+
+	}
+};
+
+
+
+var handleTheMessage = function(event) {
+	//only using strings as older Firefox version do not support complex messaging payload
+	if (event.data !== null) {
+		if (event.data === 'slave') {
+			//become a slave
+			isPresenterSlave = true;
+
+			document.title = "Presenter Notes: " + document.title;
+			togglePresenterNotes();
+			// disable transitions
+			var section = document.querySelector("div.slides");
+			section.classList.add('no-trans');
+		}
+		else if (event.data === 'togglenotes') {
+			//"remote" note toggling 
+			togglePresenterNotes();
+		}
+		else if (event.data === 'forward') {
+			//move forward only in presenter screen
+			
+			// off-by-one => +2 instead of +1
+			var target = curSlide + 2;
+			goToSlide(target);
+		}
+		else if (event.data === 'back') {
+			//move back only in presenter screen
+			
+			// off-by-one, not less than 1;
+			goToSlide(curSlide || 1);
+		}
+		else {
+			// optimistic: if none of the above cases, expect a number to be send  
+			goToSlide(parseInt(event.data) + 1);
+		}
+	}
+}
+
+function addEventListeners() {
+	document.addEventListener('keydown', handleBodyKeyDown, false);
+	window.addEventListener("message", handleTheMessage, false);
+};
+
+/* Initialization */
+
+function enumrateSlides() {
+	for ( var i = 0, slide; slide = slideEls[i]; i++) {
+		var el = document.createElement('footer');
+		var span = document.createElement('span');
+		span.className = 'slide-nr';
+		span.innerHTML = "" + (i + 1);
+		el.appendChild(span);
+		slide.appendChild(el); 
+	}
+};
+
+function addPrettify() {
+	var els = document.querySelectorAll('pre');
+	for ( var i = 0, el; el = els[i]; i++) {
+		if (!el.classList.contains('noprettyprint')) {
+			el.classList.add('prettyprint');
+		}
+	}
+
+	var el = document.createElement('script');
+	el.type = 'text/javascript';
+	el.src = 'lib/prettify.js';
+	el.onload = function() {
+		prettyPrint();
+	}
+	document.body.appendChild(el);
+};
+
+function addFontStyle() {
+	var el = document.createElement('link');
+	el.rel = 'stylesheet';
+	el.type = 'text/css';
+	el.href = 'http://fonts.googleapis.com/css?family=' + 'Open+Sans:regular,semibold,italic,italicsemibold|Droid+Sans+Mono';
+
+	document.body.appendChild(el);
+};
+
+function addGeneralStyle() {
+
+	var el = document.createElement('meta');
+	el.name = 'viewport';
+	el.content = 'width=1100,height=750';
+	document.querySelector('head').appendChild(el);
+
+	var el = document.createElement('meta');
+	el.name = 'apple-mobile-web-app-capable';
+	el.content = 'yes';
+	document.querySelector('head').appendChild(el);
+};
+
+function makeBuildLists() {
+	for ( var i = curSlide, slide; slide = slideEls[i]; i++) {
+		var items = slide.querySelectorAll('.build > *');
+		for ( var j = 0, item; item = items[j]; j++) {
+			if (item.classList) {
+				item.classList.add('to-build');
+			}
+		}
+	}
+};
+
+function handleDomLoaded() {
+	slideEls = document.querySelectorAll('div.slides section > article');
+
+	setupFrames();
+
+	enumrateSlides();
+
+	processToc();
+	
+	addFontStyle();
+	addGeneralStyle();
+	addPrettify();
+	addEventListeners();
+
+	updateSlides();
+
+	setupInteraction();
+	makeBuildLists();
+
+
+	document.body.classList.add('loaded');
+};
+
+function initialize() {
+	getCurSlideFromHash();
+
+	if (window['_DCL']) {
+		handleDomLoaded();
+	}
+	else {
+		document.addEventListener('DOMContentLoaded', handleDomLoaded, false);
+	}
+}
+
+initialize();

+ 872 - 0
libraries/frameworks/html5slides/uulm/styles.css

@@ -0,0 +1,872 @@
+/*
+  Google HTML5 slides template
+
+  Authors: Luke Mahé (code)
+           Marcin Wichary (code and design)
+           
+           Dominic Mazzoni (browser compatibility)
+           Charles Chen (ChromeVox support)
+
+  URL: http://code.google.com/p/html5slides/
+*/
+
+/* Framework */
+
+html {
+  height: 100%;
+}
+
+body {
+  margin: 0;
+  padding: 0;
+
+  display: block !important;
+
+  height: 100%;
+  min-height: 740px;
+  
+  overflow-x: hidden;
+  overflow-y: auto;
+
+  background: rgb(215, 215, 215);
+  background: -o-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
+  background: -moz-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
+  background: -webkit-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));
+  background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 500, from(rgb(240, 240, 240)), to(rgb(190, 190, 190)));
+
+  -webkit-font-smoothing: antialiased;
+}
+
+.slides {
+  width: 100%;
+  height: 100%;
+  left: 0;
+  top: 0;
+  
+  position: absolute;
+
+  -webkit-transform: translate3d(0, 0, 0);
+}
+
+.slides section > article{
+  display: block;
+
+  position: absolute;
+  overflow: hidden;
+
+  width: 900px;
+  height: 700px;
+
+  left: 50%;
+  top: 50%;
+
+  margin-left: -450px;
+  margin-top: -350px;
+  
+  padding: 40px 60px;
+
+  box-sizing: border-box;
+  -o-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+
+  border-radius: 10px;
+  -o-border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+
+  background-color: white;
+
+  box-shadow: 0 2px 6px rgba(0, 0, 0, .1);
+  border: 1px solid rgba(0, 0, 0, .3);
+
+  transition: transform .3s ease-out;
+  -o-transition: -o-transform .3s ease-out;
+  -moz-transition: -moz-transform .3s ease-out;
+  -webkit-transition: -webkit-transform .3s ease-out;
+}
+.slides.layout-widescreen section > article {
+  margin-left: -550px;
+  width: 1100px;
+}
+.slides.layout-faux-widescreen section > article {
+  margin-left: -550px;
+  width: 1100px;
+  
+  padding: 40px 160px;
+}
+
+.slides.template-default section > article:not(.nobackground):not(.biglogo) {
+  background: url(images/google-logo-small.png) 710px 625px no-repeat;  
+  
+  background-color: white;  
+} 
+
+.slides.layout-widescreen section > article:not(.nobackground):not(.biglogo),
+.slides.layout-faux-widescreen > article:not(.nobackground):not(.biglogo) {
+  background-position-x: 0, 840px;
+}
+
+/* Clickable/tappable areas */
+
+.slide-area {
+  z-index: 1000;
+
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 150px;
+  height: 700px;  
+
+  left: 50%;
+  top: 50%;
+
+  cursor: pointer;  
+  margin-top: -350px;  
+  
+  tap-highlight-color: transparent;
+  -o-tap-highlight-color: transparent;
+  -moz-tap-highlight-color: transparent;
+  -webkit-tap-highlight-color: transparent;
+}
+#prev-slide-area {
+  margin-left: -550px;
+}
+#next-slide-area {
+  margin-left: 400px;
+}
+.slides.layout-widescreen #prev-slide-area,
+.slides.layout-faux-widescreen #prev-slide-area {
+  margin-left: -650px;
+}
+.slides.layout-widescreen #next-slide-area,
+.slides.layout-faux-widescreen #next-slide-area {
+  margin-left: 500px;
+}
+
+
+/* Slides */
+
+.slides section > article{
+  display: none;
+}
+.slides section > article.far-past {
+  display: block;
+  transform: translate(-2040px);
+  -o-transform: translate(-2040px);
+  -moz-transform: translate(-2040px);
+  -webkit-transform: translate3d(-2040px, 0, 0);
+}
+.slides section> article.past {
+  display: block;
+  transform: translate(-1020px);
+  -o-transform: translate(-1020px);
+  -moz-transform: translate(-1020px);
+  -webkit-transform: translate3d(-1020px, 0, 0);
+}
+.slides section > article.current {
+  display: block;
+  transform: translate(0);
+  -o-transform: translate(0);
+  -moz-transform: translate(0);
+  -webkit-transform: translate3d(0, 0, 0);
+}
+.slides section > article.next {
+  display: block;
+  transform: translate(1020px);
+  -o-transform: translate(1020px);
+  -moz-transform: translate(1020px);
+  -webkit-transform: translate3d(1020px, 0, 0);
+}
+.slides section > article.far-next {
+  display: block;
+  transform: translate(2040px);
+  -o-transform: translate(2040px);
+  -moz-transform: translate(2040px);
+  -webkit-transform: translate3d(2040px, 0, 0);
+}
+
+.slides.layout-widescreen section > article.far-past,
+.slides.layout-faux-widescreen section > article.far-past {
+  display: block;
+  transform: translate(-2260px);
+  -o-transform: translate(-2260px);
+  -moz-transform: translate(-2260px);
+  -webkit-transform: translate3d(-2260px, 0, 0);
+}
+.slides.layout-widescreen section > article.past,
+.slides.layout-faux-widescreen section > article.past {
+  display: block;
+  transform: translate(-1130px);
+  -o-transform: translate(-1130px);
+  -moz-transform: translate(-1130px);
+  -webkit-transform: translate3d(-1130px, 0, 0);
+}
+.slides.layout-widescreen section > article.current,
+.slides.layout-faux-widescreen section > article.current {
+  display: block;
+  transform: translate(0);
+  -o-transform: translate(0);
+  -moz-transform: translate(0);
+  -webkit-transform: translate3d(0, 0, 0);
+}
+.slides.layout-widescreen section > article.next,
+.slides.layout-faux-widescreen section > article.next {
+  display: block;
+  transform: translate(1130px);
+  -o-transform: translate(1130px);
+  -moz-transform: translate(1130px);
+  -webkit-transform: translate3d(1130px, 0, 0);
+}
+.slides.layout-widescreen section > article.far-next,
+.slides.layout-faux-widescreen section > article.far-next {
+  display: block;
+  transform: translate(2260px);
+  -o-transform: translate(2260px);
+  -moz-transform: translate(2260px);
+  -webkit-transform: translate3d(2260px, 0, 0);
+}
+
+/* Styles for slides */
+
+.slides section > article {
+  font-family: 'Open Sans', Arial, sans-serif;
+
+  color: rgb(102, 102, 102);
+  text-shadow: 0 1px 1px rgba(0, 0, 0, .1);
+
+  font-size: 30px;
+  line-height: 36px;
+
+  letter-spacing: -1px;
+}
+
+b {
+  font-weight: 600;
+}
+
+.blue {
+  color: rgb(0, 102, 204);
+}
+.yellow {
+  color: rgb(255, 211, 25);
+}
+.green {
+  color: rgb(0, 138, 53);
+}
+.red {
+  color: rgb(255, 0, 0);
+}
+.black {
+  color: black;
+}
+.white {
+  color: white;
+}
+
+a {
+  color: rgb(0, 102, 204);
+}
+a:visited {
+  color: rgba(0, 102, 204, .75);
+}
+a:hover {
+  color: black;
+}
+
+p {
+  margin: 0;
+  padding: 0;
+
+  margin-top: 20px;
+}
+p:first-child {
+  margin-top: 0;
+}
+
+h1 {
+  font-size: 60px;
+  line-height: 60px;
+
+  padding: 0;
+  margin: 0;
+  margin-top: 200px;
+  padding-right: 40px;
+
+  font-weight: 600;
+
+  letter-spacing: -3px;
+
+  color: rgb(51, 51, 51);
+}
+
+h2 {
+  font-size: 45px;
+  line-height: 45px;
+
+  position: absolute;
+  bottom: 150px;
+
+  padding: 0;
+  margin: 0;
+  padding-right: 40px;
+
+  font-weight: 600;
+
+  letter-spacing: -2px;
+
+  color: rgb(51, 51, 51);
+}
+
+h3 {
+  font-size: 30px;
+  line-height: 36px;
+
+  padding: 0;
+  margin: 0;
+  padding-right: 40px;
+
+  font-weight: 600;
+
+  letter-spacing: -1px;
+
+  color: rgb(51, 51, 51);
+}
+
+article.fill h3 {
+  background: rgba(255, 255, 255, .75);
+  padding-top: .2em;
+  padding-bottom: .3em;
+  margin-top: -.2em;
+  margin-left: -60px;
+  padding-left: 60px;
+  margin-right: -60px;
+  padding-right: 60px;
+}
+
+ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+
+  margin-top: 40px;
+
+  margin-left: .75em;
+}
+ul:first-child {
+  margin-top: 0;
+}
+ul ul {
+  margin-top: .5em;
+}
+li {
+  padding: 0;
+  margin: 0;
+
+  margin-bottom: .5em;
+}
+li::before {
+  content: '·';
+
+  width: .75em;
+  margin-left: -.75em;
+
+  position: absolute;
+}
+
+ol li::before {
+  content: '';
+}
+
+nav.toc ol li.done{
+	opacity: 0.80;
+}
+nav.toc ol li.current{
+	font-weight:bold;
+}
+nav.toc ol li.future{
+	opacity: 0.95;
+}
+
+pre {
+  font-family: 'Droid Sans Mono', 'Courier New', monospace;
+
+  font-size: 20px;
+  line-height: 28px;
+  padding: 5px 10px;
+  
+  letter-spacing: -1px;
+
+  margin-top: 40px;
+  margin-bottom: 40px;
+
+  color: black;
+  background: rgb(240, 240, 240);
+  border: 1px solid rgb(224, 224, 224);
+  box-shadow: inset 0 2px 6px rgba(0, 0, 0, .1);
+  
+  overflow: hidden;
+}
+
+code {
+  font-size: 95%;
+  font-family: 'Droid Sans Mono', 'Courier New', monospace;
+
+  color: black;
+}
+
+iframe {
+  width: 100%;
+
+  height: 620px;
+/*
+  background: white;
+  border: 1px solid rgb(192, 192, 192);
+  margin: -1px;
+*/
+  /*box-shadow: inset 0 2px 6px rgba(0, 0, 0, .1);*/
+}
+
+h3 + iframe {
+  margin-top: 40px;
+  height: 540px;
+}
+
+article.fill iframe {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+
+  border: 0;
+  margin: 0;
+
+  border-radius: 10px;
+  -o-border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+
+  z-index: -1;
+}
+
+article.fill img:not(.nofill) {
+  position: absolute;
+  left: 0;
+  top: 0;
+  min-width: 100%;
+  min-height: 100%;
+
+  border-radius: 10px;
+  -o-border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+
+  z-index: -1;
+}
+img.centered {
+  margin: 0 auto;
+  display: block;
+}
+
+table {
+  width: 100%;
+  border-collapse: collapse;
+  margin-top: 40px;
+}
+th {
+  font-weight: 600;
+  text-align: left;
+}
+td,
+th {
+  border: 1px solid rgb(224, 224, 224);
+  padding: 5px 10px;
+  vertical-align: top;
+}
+
+.source {
+  position: absolute;
+  left: 60px;
+  top: 644px;
+  padding-right: 175px;
+  
+  font-size: 15px;
+  letter-spacing: 0;  
+  line-height: 18px;
+}
+
+q {
+  display: block;
+  font-size: 60px;
+  line-height: 72px;
+  
+  margin-left: 20px;
+  
+  margin-top: 100px;
+  margin-right: 150px;    
+}
+q::before {
+  content: '„';
+  
+  position: absolute;
+  display: inline-block;
+  margin-left: -2.1em;
+  width: 2em;
+  text-align: right;
+  
+  font-size: 90px;
+  color: rgb(192, 192, 192);
+}
+q::after {
+  content: '“';
+
+  position: absolute;  
+  margin-left: .1em;
+
+  font-size: 90px;
+  color: rgb(192, 192, 192);  
+}
+div.author {
+  text-align: right;  
+  font-size: 40px;
+  
+  margin-top: 20px;
+  margin-right: 150px;    
+}
+div.author::before {
+  content: '—';
+}
+
+/* Size variants */
+
+article.smaller p,
+article.smaller ul, article.smaller dl {
+  font-size: 20px;
+  line-height: 24px;
+  letter-spacing: 0;
+}
+article.smaller table {
+  font-size: 20px;
+  line-height: 24px;
+  letter-spacing: 0;
+}
+article.smaller pre {
+  font-size: 15px;
+  line-height: 20px;
+  letter-spacing: 0;
+}
+article.smaller q {
+  font-size: 40px;
+  line-height: 48px;
+}
+article.smaller q::before,
+article.smaller q::after {
+  font-size: 60px;
+}
+
+/* Builds */
+
+.build > * {
+  transition: opacity 0.5s ease-in-out 0.2s;
+  -o-transition: opacity 0.5s ease-in-out 0.2s;
+  -moz-transition: opacity 0.5s ease-in-out 0.2s;
+  -webkit-transition: opacity 0.5s ease-in-out 0.2s;
+}
+
+.to-build {
+  opacity: 0;
+}
+
+/* Pretty print */
+
+.prettyprint .str, /* string content */
+.prettyprint .atv { /* a markup attribute value */
+  color: rgb(0, 138, 53); 
+}  
+.prettyprint .kwd, /* a keyword */
+.prettyprint .tag { /* a markup tag name */
+  color: rgb(0, 102, 204);
+}
+.prettyprint .com { /* a comment */
+  color: rgb(127, 127, 127); 
+  font-style: italic; 
+}  
+.prettyprint .lit { /* a literal value */
+  color: rgb(127, 0, 0);
+}  
+.prettyprint .pun, /* punctuation, lisp open bracket, lisp close bracket */
+.prettyprint .opn, 
+.prettyprint .clo { 
+  color: rgb(127, 127, 127); 
+}
+.prettyprint .typ, /* a type name */
+.prettyprint .atn, /* a markup attribute name */ 
+.prettyprint .dec, 
+.prettyprint .var { /* a declaration; a variable name */
+  color: rgb(127, 0, 127);
+}  
+
+.slide-nr {
+	display:none;
+}
+
+aside{
+	display:none;
+}
+
+.presenter  aside{
+	z-index:10;
+	position: absolute;
+	top:2%;
+	left:35%;
+	display:block;	
+	width:60%;
+	height:96%;
+
+
+	padding:5%;
+	  background: rgba(240, 240, 240, .90);
+
+  box-sizing: border-box;
+  -o-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+
+  border-radius: 10px;
+  -o-border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+  box-shadow: 0 2px 6px rgba(0, 0, 0, .3);
+  border: 1px solid rgba(0, 0, 0, .3);	
+}
+
+.presenter .build > * {
+  transition: opacity 0.5s ease-in-out 0.2s;
+  -o-transition: opacity 0.5s ease-in-out 0.2s;
+  -moz-transition: opacity 0.5s ease-in-out 0.2s;
+  -webkit-transition: opacity 0.5s ease-in-out 0.2s;
+}
+
+.presenter .to-build {
+  opacity: 100;
+}
+
+
+.no-trans.slides section > article{
+  transition: transform;
+  -o-transition: -o-transform;
+  -moz-transition: -moz-transform;
+  -webkit-transition: -webkit-transform;
+}
+
+.blackfade { 
+	display: none; 
+	background: #000;
+	position: fixed; left: 0; top: 0;
+	width: 100%; height: 100%;
+	opacity: .90;
+	z-index: 9999;
+}
+
+.whitefade { 
+	display: none; 
+	background: #FFF;
+	position: fixed; left: 0; top: 0;
+	width: 100%; height: 100%;
+	opacity: .95;
+	z-index: 9999;
+}
+
+section header{
+	display: none; 
+}
+
+.slides.template-uulm-in section > article:not(.fill):not(.title-slide):before{
+  content:"";
+	display:block;
+	border-top:2px solid rgb(163,38,56);
+	position: absolute;
+	width: 100%;
+	height: 2px;
+	min-height: 2px;
+	left: 0;
+	top: 24px;
+}
+
+
+
+.slides.template-uulm-in section > article:not(.fill):not(.title-slide) .slide-nr{
+	display:inline;
+	position: absolute;
+	color: #eee;
+	font-size:18px;
+	line-height: 26px;
+	  font-weight: 600;
+  letter-spacing: -1px;
+	min-width: 26px;
+	left: 0;
+	top: 24px;
+	padding:0px;
+	padding-left:6px;
+	padding-right:6px;
+	margin:0;
+	background: rgb(163,38,56);
+	text-align:center;
+}
+
+
+
+.slides.template-uulm-in section > article.title-slide img {
+  position: absolute;
+  left: 0;
+  top: 20%;
+
+  min-width: 100%;
+  min-height: 50%;
+  width:100%;
+  height:50%;
+
+
+
+  z-index: -1;
+}
+
+.slides.template-uulm-in section > article h1, .slides.template-uulm-in section > article h2, .slides.template-uulm-in section > article h3{
+	color: rgb(163,38,56);
+}
+.slides.template-uulm-in section > article.title-slide #title{
+	font-size: 48px;
+	  position: absolute;
+	  left: 50%;
+	  top: 75%;
+	text-align:left;
+	margin:0;
+	padding:0;
+}
+
+
+.slides.template-uulm-in section > article.title-slide #subtitle{
+	font-size: 28px;
+	  position: absolute;
+	  left: 50%;
+	  bottom: 3%;
+	text-align:left;
+	margin:0;
+	padding:0;
+}
+
+.slides.template-uulm-in section > article.title-slide #author{
+	font-size: 28px;
+	  position: absolute;
+	  left: 5%;
+	  bottom: 3%;
+	text-align:left;
+	margin:0;
+	padding:0;
+}
+
+.slides.template-uulm-in section > article.title-slide #uulm-logo {
+	  position: absolute;
+	  left: 50%;
+	  top: 4%;
+	  z-index: -2;
+	  width: 38%;
+	  min-width: 38%;
+
+
+	min-height: 10%;
+	  height: 10%;	 
+
+}
+
+
+
+.slides.template-uulm-in section > article:not(.fill){
+	padding-top: 100px;
+	padding-left: 80px;
+	padding-right: 80px;
+	padding-bottom: 32px;
+}
+
+.slides.template-uulm-in section > article:not(.nobackground):not(.biglogo) {
+  background-color: white;  
+}
+
+.slides.template-uulm-in li::before {
+	color: rgb(163,38,56);
+}
+
+.slides.template-uulm-in td{
+  background: rgba(169,162,141,0.4);
+  padding: 5px 10px;
+  vertical-align: top;
+}
+
+.slides.template-uulm-in th{
+  background: rgba(169,162,141,0.8);
+  padding: 5px 10px;
+  vertical-align: top;
+  color:#eee;
+}
+
+.slides.template-uulm-in iframe {
+  height: 580px;
+}
+
+.slides.template-uulm-in h3 + iframe {
+  margin-top: 40px;
+  height: 480px;
+}
+
+.slides.template-uulm-in section article.fill iframe {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+
+  border: 0;
+  margin: 0;
+
+  border-radius: 10px;
+  -o-border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+
+  z-index: -1;
+}
+
+
+.uulm-color {
+  color: rgb(125,154,170);
+}
+
+.mawi-color {
+  color: rgb(86,170,28);
+}
+
+.in-color {
+  color: rgb(163,38,56);
+}
+
+.nawi-color {
+  color: rgb(189,96,5);
+}
+
+.med-color {
+  color: rgb(38,84,124);
+}
+
+.accent-color {
+  color: rgb(169,162,141);
+}
+
+.slides.template-uulm-in a{
+	color: rgb(125,154,170);
+}
+
+a{
+	text-decoration: none;
+}
+

+ 187 - 0
libraries/frameworks/html5slides/uulm/uulm.css

@@ -0,0 +1,187 @@
+.slides.template-uulm-in section > article:not(.fill):not(.title-slide):before{
+	content:"";
+	display:block;
+	border-top:2px solid rgb(163,38,56);
+	position: absolute;
+	width: 100%;
+	height: 2px;
+	min-height: 2px;
+	left: 0;
+	top: 24px;
+}
+
+
+
+.slides.template-uulm-in section > article:not(.fill):not(.title-slide) .slide-nr{
+	display:inline;
+	position: absolute;
+	color: #eee;
+	font-size:18px;
+	line-height: 26px;
+	  font-weight: 600;
+  letter-spacing: -1px;
+	min-width: 26px;
+	left: 0;
+	top: 24px;
+	padding:0px;
+	padding-left:6px;
+	padding-right:6px;
+	margin:0;
+	background: rgb(163,38,56);
+	text-align:center;
+}
+
+
+
+.slides.template-uulm-in section > article.title-slide img {
+  position: absolute;
+  left: 0;
+  top: 20%;
+
+  min-width: 100%;
+  min-height: 50%;
+  width:100%;
+  height:50%;
+
+
+
+  z-index: -1;
+}
+
+.slides.template-uulm-in section > article h1, .slides.template-uulm-in section > article h2, .slides.template-uulm-in section > article h3{
+	color: rgb(163,38,56);
+}
+.slides.template-uulm-in section > article.title-slide #title{
+	font-size: 48px;
+	  position: absolute;
+	  left: 50%;
+	  top: 75%;
+	text-align:left;
+	margin:0;
+	padding:0;
+}
+
+
+.slides.template-uulm-in section > article.title-slide #subtitle{
+	font-size: 28px;
+	  position: absolute;
+	  left: 50%;
+	  bottom: 3%;
+	text-align:left;
+	margin:0;
+	padding:0;
+}
+
+.slides.template-uulm-in section > article.title-slide #author{
+	font-size: 28px;
+	  position: absolute;
+	  left: 5%;
+	  bottom: 3%;
+	text-align:left;
+	margin:0;
+	padding:0;
+}
+
+.slides.template-uulm-in section > article.title-slide #uulm-logo {
+	  position: absolute;
+	  left: 50%;
+	  top: 4%;
+	  z-index: -2;
+	  width: 38%;
+	  min-width: 38%;
+
+
+	min-height: 10%;
+	  height: 10%;	 
+
+}
+
+
+
+.slides.template-uulm-in section > article:not(.fill){
+	padding-top: 100px;
+	padding-left: 80px;
+	padding-right: 80px;
+	padding-bottom: 32px;
+}
+
+.slides.template-uulm-in section > article:not(.nobackground):not(.biglogo) {
+  background-color: white;  
+}
+
+.slides.template-uulm-in li::before {
+	color: rgb(163,38,56);
+}
+
+.slides.template-uulm-in td{
+  background: rgba(169,162,141,0.4);
+  padding: 5px 10px;
+  vertical-align: top;
+}
+
+.slides.template-uulm-in th{
+  background: rgba(169,162,141,0.8);
+  padding: 5px 10px;
+  vertical-align: top;
+  color:#eee;
+}
+
+.slides.template-uulm-in iframe {
+  height: 580px;
+}
+
+.slides.template-uulm-in h3 + iframe {
+  margin-top: 40px;
+  height: 480px;
+}
+
+.slides.template-uulm-in section article.fill iframe {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+
+  border: 0;
+  margin: 0;
+
+  border-radius: 10px;
+  -o-border-radius: 10px;
+  -moz-border-radius: 10px;
+  -webkit-border-radius: 10px;
+
+  z-index: -1;
+}
+
+
+.uulm-color {
+  color: rgb(125,154,170);
+}
+
+.mawi-color {
+  color: rgb(86,170,28);
+}
+
+.in-color {
+  color: rgb(163,38,56);
+}
+
+.nawi-color {
+  color: rgb(189,96,5);
+}
+
+.med-color {
+  color: rgb(38,84,124);
+}
+
+.accent-color {
+  color: rgb(169,162,141);
+}
+
+.slides.template-uulm-in a{
+	color: rgb(125,154,170);
+}
+
+a{
+	text-decoration: none;
+}

Разница между файлами не показана из-за своего большого размера
+ 5 - 0
libraries/frameworks/html5slides/uulm/uulm_logo.svg


+ 12 - 0
libraries/frameworks/io2012/README.md

@@ -0,0 +1,12 @@
+## Google IO 2012 HTML5 Slides
+
+Authors: 
+  Eric Bidelman <ebidel@gmail.com>
+  Luke Mahé <lukem@google.com>
+  
+Modified By:
+  Ramnath Vaidyanathan
+
+URL: https://code.google.com/p/io-2012-slides
+
+LICENSE: Apache 2.0

+ 3 - 0
libraries/frameworks/io2012/config.yml

@@ -0,0 +1,3 @@
+io2012:
+  theme: NULL
+layout: default

+ 1503 - 0
libraries/frameworks/io2012/css/default.css

@@ -0,0 +1,1503 @@
+@charset "UTF-8";
+
+/* line 17, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  font: inherit;
+  vertical-align: baseline;
+}
+
+/* line 20, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+body {
+  line-height: 1;
+}
+
+/* line 22, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+
+ol, ul {
+  list-style: none;
+}
+
+
+/* line 24, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+/* line 26, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+caption, th, td {
+  text-align: left;
+  font-weight: normal;
+  vertical-align: middle;
+}
+
+/* line 28, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+q, blockquote {
+  quotes: none;
+}
+/* line 101, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+q:before, q:after, blockquote:before, blockquote:after {
+  content: "";
+  content: none;
+}
+
+/* line 30, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+a img {
+  border: none;
+}
+
+/* line 114, ../../../../../../Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary {
+  display: block;
+}
+
+/**
+ * Base SlideDeck Styles
+ */
+/* line 48, ../scss/_base.scss */
+html {
+  height: 100%;
+  overflow: hidden;
+}
+
+/* line 53, ../scss/_base.scss */
+body {
+  margin: 0;
+  padding: 0;
+  opacity: 0;
+  height: 100%;
+  min-height: 740px;
+  width: 100%;
+  overflow: hidden;
+  color: #fff;
+  -webkit-font-smoothing: antialiased;
+  -moz-font-smoothing: antialiased;
+  -ms-font-smoothing: antialiased;
+  -o-font-smoothing: antialiased;
+  -webkit-transition: opacity 800ms ease-in 100ms;
+  -moz-transition: opacity 800ms ease-in 100ms;
+  -ms-transition: opacity 800ms ease-in 100ms;
+  -o-transition: opacity 800ms ease-in 100ms;
+  transition: opacity 800ms ease-in 100ms;
+}
+/* line 69, ../scss/_base.scss */
+body.loaded {
+  opacity: 1 !important;
+}
+
+/* line 74, ../scss/_base.scss */
+input, button {
+  vertical-align: middle;
+}
+
+/* line 78, ../scss/_base.scss */
+slides > slide[hidden] {
+  display: none !important;
+}
+
+/* line 82, ../scss/_base.scss */
+slides {
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  left: 0;
+  top: 0;
+  -webkit-transform: translate3d(0, 0, 0);
+  -moz-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  -o-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-perspective: 1000;
+  perspective: 1000;
+  -webkit-transform-style: preserve-3d;
+  transform-style: preserve-3d;
+  -webkit-transition: opacity 800ms ease-in 100ms;
+  -moz-transition: opacity 800ms ease-in 100ms;
+  -ms-transition: opacity 800ms ease-in 100ms;
+  -o-transition: opacity 800ms ease-in 100ms;
+  transition: opacity 800ms ease-in 100ms;
+}
+
+/* line 94, ../scss/_base.scss */
+slides > slide {
+  display: block;
+  position: absolute;
+  overflow: hidden;
+  left: 50%;
+  top: 50%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+/* Slide styles */
+/*article.fill iframe {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+
+  border: 0;
+  margin: 0;
+
+  @include border-radius(10px);
+
+  z-index: -1;
+}
+
+slide.fill {
+  background-repeat: no-repeat;
+  @include background-size(cover);
+}
+
+slide.fill img {
+  position: absolute;
+  left: 0;
+  top: 0;
+  min-width: 100%;
+  min-height: 100%;
+
+  z-index: -1;
+}
+*/
+/**
+ * Theme Styles
+ */
+/* line 58, ../scss/default.scss */
+::selection {
+  color: white;
+  background-color: #ffd14d;
+  text-shadow: none;
+}
+
+/* line 64, ../scss/default.scss */
+::-webkit-scrollbar {
+  height: 16px;
+  overflow: visible;
+  width: 16px;
+}
+
+/* line 69, ../scss/default.scss */
+::-webkit-scrollbar-thumb {
+  background-color: rgba(0, 0, 0, 0.1);
+  background-clip: padding-box;
+  border: solid transparent;
+  min-height: 28px;
+  padding: 100px 0 0;
+  -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(0, 0, 0, 0.07);
+  -moz-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(0, 0, 0, 0.07);
+  box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.1), inset 0 -1px 0 rgba(0, 0, 0, 0.07);
+  border-width: 1px 1px 1px 6px;
+}
+
+/* line 78, ../scss/default.scss */
+::-webkit-scrollbar-thumb:hover {
+  background-color: rgba(0, 0, 0, 0.5);
+}
+
+/* line 81, ../scss/default.scss */
+::-webkit-scrollbar-button {
+  height: 0;
+  width: 0;
+}
+
+/* line 85, ../scss/default.scss */
+::-webkit-scrollbar-track {
+  background-clip: padding-box;
+  border: solid transparent;
+  border-width: 0 0 0 4px;
+}
+
+/* line 90, ../scss/default.scss */
+::-webkit-scrollbar-corner {
+  background: transparent;
+}
+
+/* line 94, ../scss/default.scss */
+body {
+  background: black;
+}
+
+/* line 98, ../scss/default.scss */
+slides > slide {
+  display: none;
+  font-family: 'Open Sans', Arial, sans-serif;
+  font-size: 26px;
+  color: #797979;
+  width: 900px;
+  height: 700px;
+  margin-left: -450px;
+  margin-top: -350px;
+  padding: 40px 60px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-transition: all 0.6s ease-in-out;
+  -moz-transition: all 0.6s ease-in-out;
+  -ms-transition: all 0.6s ease-in-out;
+  -o-transition: all 0.6s ease-in-out;
+  transition: all 0.6s ease-in-out;
+}
+/* line 119, ../scss/default.scss */
+slides > slide.far-past {
+  display: none;
+}
+/* line 126, ../scss/default.scss */
+slides > slide.past {
+  display: block;
+  opacity: 0;
+}
+/* line 133, ../scss/default.scss */
+slides > slide.current {
+  display: block;
+  opacity: 1;
+}
+/* line 139, ../scss/default.scss */
+slides > slide.current .auto-fadein {
+  opacity: 1;
+}
+/* line 143, ../scss/default.scss */
+slides > slide.current .gdbar {
+  -webkit-background-size: 100% 100%;
+  -moz-background-size: 100% 100%;
+  -o-background-size: 100% 100%;
+  background-size: 100% 100%;
+}
+/* line 148, ../scss/default.scss */
+slides > slide.next {
+  display: block;
+  opacity: 0;
+  pointer-events: none;
+}
+/* line 156, ../scss/default.scss */
+slides > slide.far-next {
+  display: none;
+}
+/* line 163, ../scss/default.scss */
+slides > slide.dark {
+  background: #515151 !important;
+}
+/* line 171, ../scss/default.scss */
+slides > slide:not(.nobackground):before {
+  font-size: 12pt;
+  content: attr(data-hashtag);
+  position: absolute;
+  bottom: 20px;
+  left: 60px;
+  /* background: url("../images/google_developers_icon_128.png") no-repeat 0 50%; */
+  -webkit-background-size: 30px 30px;
+  -moz-background-size: 30px 30px;
+  -o-background-size: 30px 30px;
+  background-size: 30px 30px;
+  padding-left: 40px;
+  height: 30px;
+  line-height: 1.9;
+}
+
+
+/* line 183, ../scss/default.scss */
+slides > slide:not(.nobackground):after {
+  font-size: 12pt;
+  content: attr(data-slide-num) "/" attr(data-total-slides);
+  position: absolute;
+  bottom: 20px;
+  right: 60px;
+  line-height: 1.9;
+}
+/* line 194, ../scss/default.scss */
+slides > slide.title-slide:after {
+  content: '';
+  /* background: url(../images/io2012_logo.png) no-repeat 100% 50%; */
+  -webkit-background-size: contain;
+  -moz-background-size: contain;
+  -o-background-size: contain;
+  background-size: contain;
+  position: absolute;
+  bottom: 40px;
+  right: 40px;
+  width: 100%;
+  height: 60px;
+}
+/* line 206, ../scss/default.scss */
+slides > slide.backdrop {
+  z-index: -10;
+  display: block !important;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(85%, #ffffff), color-stop(100%, #e6e6e6));
+  background: -webkit-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: -moz-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: -o-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: -ms-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background-color: white;
+}
+/* line 211, ../scss/default.scss */
+slides > slide.backdrop:after, slides > slide.backdrop:before {
+  display: none;
+}
+/* line 216, ../scss/default.scss */
+slides > slide > hgroup + article {
+  margin-top: 45px;
+}
+/* line 220, ../scss/default.scss */
+slides > slide > hgroup + article.flexbox.vcenter, slides > slide > hgroup + article.flexbox.vleft, slides > slide > hgroup + article.flexbox.vright {
+  height: 80%;
+}
+/* line 225, ../scss/default.scss */
+slides > slide > hgroup + article p {
+  margin-bottom: 1em;
+}
+/* line 230, ../scss/default.scss */
+slides > slide > article:only-child {
+  height: 100%;
+}
+/* line 233, ../scss/default.scss */
+slides > slide > article:only-child > iframe {
+  height: 98%;
+}
+
+/* line 239, ../scss/default.scss */
+slides.layout-faux-widescreen > slide {
+  padding: 40px 160px;
+}
+
+/* line 248, ../scss/default.scss */
+slides.layout-widescreen > slide,
+slides.layout-faux-widescreen > slide {
+  margin-left: -550px;
+  width: 1100px;
+}
+/* line 253, ../scss/default.scss */
+slides.layout-widescreen > slide.far-past,
+slides.layout-faux-widescreen > slide.far-past {
+  display: block;
+  display: none;
+  -webkit-transform: translate(-2260px);
+  -moz-transform: translate(-2260px);
+  -ms-transform: translate(-2260px);
+  -o-transform: translate(-2260px);
+  transform: translate(-2260px);
+  -webkit-transform: translate3d(-2260px, 0, 0);
+  -moz-transform: translate3d(-2260px, 0, 0);
+  -ms-transform: translate3d(-2260px, 0, 0);
+  -o-transform: translate3d(-2260px, 0, 0);
+  transform: translate3d(-2260px, 0, 0);
+}
+/* line 260, ../scss/default.scss */
+slides.layout-widescreen > slide.past,
+slides.layout-faux-widescreen > slide.past {
+  display: block;
+  opacity: 0;
+}
+/* line 267, ../scss/default.scss */
+slides.layout-widescreen > slide.current,
+slides.layout-faux-widescreen > slide.current {
+  display: block;
+  opacity: 1;
+}
+/* line 274, ../scss/default.scss */
+slides.layout-widescreen > slide.next,
+slides.layout-faux-widescreen > slide.next {
+  display: block;
+  opacity: 0;
+  pointer-events: none;
+}
+/* line 282, ../scss/default.scss */
+slides.layout-widescreen > slide.far-next,
+slides.layout-faux-widescreen > slide.far-next {
+  display: block;
+  display: none;
+  -webkit-transform: translate(2260px);
+  -moz-transform: translate(2260px);
+  -ms-transform: translate(2260px);
+  -o-transform: translate(2260px);
+  transform: translate(2260px);
+  -webkit-transform: translate3d(2260px, 0, 0);
+  -moz-transform: translate3d(2260px, 0, 0);
+  -ms-transform: translate3d(2260px, 0, 0);
+  -o-transform: translate3d(2260px, 0, 0);
+  transform: translate3d(2260px, 0, 0);
+}
+/* line 289, ../scss/default.scss */
+slides.layout-widescreen #prev-slide-area,
+slides.layout-faux-widescreen #prev-slide-area {
+  margin-left: -650px;
+}
+/* line 293, ../scss/default.scss */
+slides.layout-widescreen #next-slide-area,
+slides.layout-faux-widescreen #next-slide-area {
+  margin-left: 550px;
+}
+
+/* line 298, ../scss/default.scss */
+b {
+  font-weight: 600;
+}
+
+/* line 302, ../scss/default.scss */
+a {
+  color: #2a7cdf;
+  text-decoration: none;
+  border-bottom: 1px solid rgba(42, 124, 223, 0.5);
+}
+/* line 307, ../scss/default.scss */
+a:hover {
+  color: black !important;
+}
+
+/* line 312, ../scss/default.scss */
+h1, h2, h3 {
+  font-weight: 600;
+}
+
+/* line 316, ../scss/default.scss */
+h2 {
+  font-size: 45px;
+  line-height: 45px;
+  letter-spacing: -2px;
+  color: #515151;
+}
+
+/* line 323, ../scss/default.scss */
+h3 {
+  font-size: 30px;
+  letter-spacing: -1px;
+  line-height: 2;
+  font-weight: inherit;
+  color: #797979;
+}
+
+/* line 331, ../scss/default.scss */
+ul {
+  margin-left: 1.2em;
+  margin-bottom: 1em;
+  position: relative;
+}
+/* line 336, ../scss/default.scss */
+ul li {
+  margin-bottom: 0.5em;
+}
+/* line 339, ../scss/default.scss */
+ul li ul {
+  margin-left: 2em;
+  margin-bottom: 0;
+}
+/* line 343, ../scss/default.scss */
+ul li ul li:before {
+  content: '-';
+  font-weight: 600;
+}
+/* line 350, ../scss/default.scss */
+ul > li:before {
+  content: '\00B7';
+  margin-left: -1em;
+  position: absolute;
+  font-weight: 600;
+}
+/* line 357, ../scss/default.scss */
+ul ul {
+  margin-top: .5em;
+}
+
+/* line 364, ../scss/default.scss */
+.highlight-code slide.current pre > * {
+  opacity: 0.25;
+  -webkit-transition: opacity 0.5s ease-in;
+  -moz-transition: opacity 0.5s ease-in;
+  -ms-transition: opacity 0.5s ease-in;
+  -o-transition: opacity 0.5s ease-in;
+  transition: opacity 0.5s ease-in;
+}
+/* line 368, ../scss/default.scss */
+.highlight-code slide.current b {
+  opacity: 1;
+}
+
+/* line 373, ../scss/default.scss */
+pre {
+  font-family: 'Inconsolata', 'Courier New', monospace;
+  font-size: 20px;
+  line-height: 28px;
+  padding: 10px 0 10px 60px;
+  letter-spacing: -1px;
+  margin-bottom: 0px;
+  width: 106%;
+  left: -60px;
+  position: relative;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  /*overflow: hidden;*/
+}
+/* line 387, ../scss/default.scss */
+pre[data-lang]:after {
+  content: attr(data-lang);
+  background-color: #a9a9a9;
+  right: 0;
+  top: 0;
+  position: absolute;
+  font-size: 16pt;
+  color: white;
+  padding: 2px 25px;
+  text-transform: uppercase;
+}
+
+/* line 400, ../scss/default.scss */
+pre[data-lang="go"] {
+  color: #333;
+}
+
+/* line 404, ../scss/default.scss */
+code {
+  font-size: 95%;
+  font-family: 'Inconsolata', 'Courier New', monospace;
+  color: black;
+}
+
+/* line 410, ../scss/default.scss */
+iframe {
+  width: 100%;
+  height: 530px;
+  background: white;
+  border: 1px solid #e6e6e6;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+
+/* line 418, ../scss/default.scss */
+dt {
+  font-weight: bold;
+}
+
+/* line 422, ../scss/default.scss */
+button {
+  display: inline-block;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #f9f9f9), color-stop(70%, #e3e3e3));
+  background: -webkit-linear-gradient(#f9f9f9 40%, #e3e3e3 70%);
+  background: -moz-linear-gradient(#f9f9f9 40%, #e3e3e3 70%);
+  background: -o-linear-gradient(#f9f9f9 40%, #e3e3e3 70%);
+  background: -ms-linear-gradient(#f9f9f9 40%, #e3e3e3 70%);
+  background: linear-gradient(#f9f9f9 40%, #e3e3e3 70%);
+  border: 1px solid #a9a9a9;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  -ms-border-radius: 3px;
+  -o-border-radius: 3px;
+  border-radius: 3px;
+  padding: 5px 8px;
+  outline: none;
+  white-space: nowrap;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  user-select: none;
+  cursor: pointer;
+  text-shadow: 1px 1px white;
+  font-size: 10pt;
+}
+
+/* line 436, ../scss/default.scss */
+button:not(:disabled):hover {
+  border-color: #515151;
+}
+
+/* line 440, ../scss/default.scss */
+button:not(:disabled):active {
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #e3e3e3), color-stop(70%, #f9f9f9));
+  background: -webkit-linear-gradient(#e3e3e3 40%, #f9f9f9 70%);
+  background: -moz-linear-gradient(#e3e3e3 40%, #f9f9f9 70%);
+  background: -o-linear-gradient(#e3e3e3 40%, #f9f9f9 70%);
+  background: -ms-linear-gradient(#e3e3e3 40%, #f9f9f9 70%);
+  background: linear-gradient(#e3e3e3 40%, #f9f9f9 70%);
+}
+
+/* line 444, ../scss/default.scss */
+:disabled {
+  color: #a9a9a9;
+}
+
+/* line 448, ../scss/default.scss */
+.blue {
+  color: #4387fd;
+}
+
+/* line 451, ../scss/default.scss */
+.blue2 {
+  color: #3c8ef3;
+}
+
+/* line 454, ../scss/default.scss */
+.blue3 {
+  color: #2a7cdf;
+}
+
+/* line 457, ../scss/default.scss */
+.yellow {
+  color: #ffd14d;
+}
+
+/* line 460, ../scss/default.scss */
+.yellow2 {
+  color: #f9cc46;
+}
+
+/* line 463, ../scss/default.scss */
+.yellow3 {
+  color: #f6c000;
+}
+
+/* line 466, ../scss/default.scss */
+.green {
+  color: #0da861;
+}
+
+/* line 469, ../scss/default.scss */
+.green2 {
+  color: #00a86d;
+}
+
+/* line 472, ../scss/default.scss */
+.green3 {
+  color: #009f5d;
+}
+
+/* line 475, ../scss/default.scss */
+.red {
+  color: #f44a3f;
+}
+
+/* line 478, ../scss/default.scss */
+.red2 {
+  color: #e0543e;
+}
+
+/* line 481, ../scss/default.scss */
+.red3 {
+  color: #d94d3a;
+}
+
+/* line 484, ../scss/default.scss */
+.gray {
+  color: #e6e6e6;
+}
+
+/* line 487, ../scss/default.scss */
+.gray2 {
+  color: #a9a9a9;
+}
+
+/* line 490, ../scss/default.scss */
+.gray3 {
+  color: #797979;
+}
+
+/* line 493, ../scss/default.scss */
+.gray4 {
+  color: #515151;
+}
+
+/* line 497, ../scss/default.scss */
+.white {
+  color: white !important;
+}
+
+/* line 500, ../scss/default.scss */
+.black {
+  color: black !important;
+}
+
+/* line 504, ../scss/default.scss */
+.columns-2 {
+  -webkit-column-count: 2;
+  -moz-column-count: 2;
+  -o-column-count: 2;
+  column-count: 2;
+}
+
+/* line 508, ../scss/default.scss */
+table {
+  width: 100%;
+  border-collapse: -moz-initial;
+  border-collapse: initial;
+  border-spacing: 2px;
+  border-bottom: 1px solid #797979;
+}
+/* line 515, ../scss/default.scss */
+table tr > td:first-child, table th {
+  font-weight: 600;
+  color: #515151;
+}
+/* line 520, ../scss/default.scss */
+table tr:nth-child(odd) {
+  background-color: #e6e6e6;
+}
+/* line 524, ../scss/default.scss */
+table th {
+  color: white;
+  font-size: 18px;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #4387fd), color-stop(80%, #2a7cdf)) no-repeat;
+  background: -webkit-linear-gradient(top, #4387fd 40%, #2a7cdf 80%) no-repeat;
+  background: -moz-linear-gradient(top, #4387fd 40%, #2a7cdf 80%) no-repeat;
+  background: -o-linear-gradient(top, #4387fd 40%, #2a7cdf 80%) no-repeat;
+  background: -ms-linear-gradient(top, #4387fd 40%, #2a7cdf 80%) no-repeat;
+  background: linear-gradient(top, #4387fd 40%, #2a7cdf 80%) no-repeat;
+}
+/* line 530, ../scss/default.scss */
+table td, table th {
+  font-size: 18px;
+  padding: 1em 0.5em;
+}
+/* line 535, ../scss/default.scss */
+table td.highlight {
+  color: #515151;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #ffd14d), color-stop(80%, #f6c000)) no-repeat;
+  background: -webkit-linear-gradient(top, #ffd14d 40%, #f6c000 80%) no-repeat;
+  background: -moz-linear-gradient(top, #ffd14d 40%, #f6c000 80%) no-repeat;
+  background: -o-linear-gradient(top, #ffd14d 40%, #f6c000 80%) no-repeat;
+  background: -ms-linear-gradient(top, #ffd14d 40%, #f6c000 80%) no-repeat;
+  background: linear-gradient(top, #ffd14d 40%, #f6c000 80%) no-repeat;
+}
+/* line 540, ../scss/default.scss */
+table.rows {
+  border-bottom: none;
+  border-right: 1px solid #797979;
+}
+
+/* line 546, ../scss/default.scss */
+q {
+  font-size: 45px;
+  line-height: 72px;
+}
+/* line 550, ../scss/default.scss */
+q:before {
+  content: '“';
+  position: absolute;
+  margin-left: -0.5em;
+}
+/* line 555, ../scss/default.scss */
+q:after {
+  content: '”';
+  position: absolute;
+  margin-left: 0.1em;
+}
+
+/* line 562, ../scss/default.scss */
+slide.fill {
+  background-repeat: no-repeat;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-background-size: cover;
+  -moz-background-size: cover;
+  -o-background-size: cover;
+  background-size: cover;
+}
+
+/* Size variants */
+/* line 571, ../scss/default.scss */
+article.smaller p, article.smaller ul {
+  font-size: 20px;
+  line-height: 24px;
+  letter-spacing: 0;
+}
+/* line 577, ../scss/default.scss */
+article.smaller table td, article.smaller table th {
+  font-size: 14px;
+}
+/* line 581, ../scss/default.scss */
+article.smaller pre {
+  font-size: 15px;
+  line-height: 20px;
+  letter-spacing: 0;
+}
+/* line 586, ../scss/default.scss */
+article.smaller q {
+  font-size: 40px;
+  line-height: 48px;
+}
+/* line 590, ../scss/default.scss */
+article.smaller q:before, article.smaller q:after {
+  font-size: 60px;
+}
+
+/* Builds */
+/* line 599, ../scss/default.scss */
+.build > * {
+  -webkit-transition: opacity 0.5s ease-in-out 0.2s;
+  -moz-transition: opacity 0.5s ease-in-out 0.2s;
+  -ms-transition: opacity 0.5s ease-in-out 0.2s;
+  -o-transition: opacity 0.5s ease-in-out 0.2s;
+  transition: opacity 0.5s ease-in-out 0.2s;
+}
+/* line 603, ../scss/default.scss */
+.build .to-build {
+  opacity: 0;
+}
+/* line 607, ../scss/default.scss */
+.build .build-fade {
+  opacity: 0.3;
+}
+/* line 610, ../scss/default.scss */
+.build .build-fade:hover {
+  opacity: 1.0;
+}
+
+/* line 617, ../scss/default.scss */
+.popup .next .build .to-build {
+  opacity: 1;
+}
+/* line 621, ../scss/default.scss */
+.popup .next .build .build-fade {
+  opacity: 1;
+}
+
+/* Pretty print */
+/* line 629, ../scss/default.scss */
+.prettyprint .str,
+.prettyprint .atv {
+  /* a markup attribute value */
+  color: #009f5d;
+}
+
+/* line 633, ../scss/default.scss */
+.prettyprint .kwd,
+.prettyprint .tag {
+  /* a markup tag name */
+  color: #0066cc;
+}
+
+/* line 636, ../scss/default.scss */
+.prettyprint .com {
+  /* a comment */
+  color: #797979;
+  font-style: italic;
+}
+
+/* line 640, ../scss/default.scss */
+.prettyprint .lit {
+  /* a literal value */
+  color: #7f0000;
+}
+
+/* line 645, ../scss/default.scss */
+.prettyprint .pun,
+.prettyprint .opn,
+.prettyprint .clo {
+  color: #515151;
+}
+
+/* line 651, ../scss/default.scss */
+.prettyprint .typ,
+.prettyprint .atn,
+.prettyprint .dec,
+.prettyprint .var {
+  /* a declaration; a variable name */
+  color: #d94d3a;
+}
+
+/* line 654, ../scss/default.scss */
+.prettyprint .pln {
+  color: #515151;
+}
+
+/* line 658, ../scss/default.scss */
+.note {
+  position: absolute;
+  z-index: 100;
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  padding: 1em;
+  background: rgba(0, 0, 0, 0.3);
+  opacity: 0;
+  pointer-events: none;
+  display: -webkit-box !important;
+  display: -moz-box !important;
+  display: -ms-box !important;
+  display: -o-box !important;
+  display: box !important;
+  -webkit-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -ms-box-orient: vertical;
+  box-orient: vertical;
+  -webkit-box-align: center;
+  -moz-box-align: center;
+  -ms-box-align: center;
+  box-align: center;
+  -webkit-box-pack: center;
+  -moz-box-pack: center;
+  -ms-box-pack: center;
+  box-pack: center;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transform: translateY(350px);
+  -moz-transform: translateY(350px);
+  -ms-transform: translateY(350px);
+  -o-transform: translateY(350px);
+  transform: translateY(350px);
+  -webkit-transition: all 0.4s ease-in-out;
+  -moz-transition: all 0.4s ease-in-out;
+  -ms-transition: all 0.4s ease-in-out;
+  -o-transition: all 0.4s ease-in-out;
+  transition: all 0.4s ease-in-out;
+}
+/* line 676, ../scss/default.scss */
+.note > section {
+  background: #fff;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  -webkit-box-shadow: 0 0 10px #797979;
+  -moz-box-shadow: 0 0 10px #797979;
+  box-shadow: 0 0 10px #797979;
+  width: 60%;
+  padding: 2em;
+}
+
+/* line 693, ../scss/default.scss */
+.with-notes.popup slides.layout-widescreen slide.next,
+.with-notes.popup slides.layout-faux-widescreen slide.next {
+  -webkit-transform: translate3d(690px, 80px, 0) scale(0.35);
+  -moz-transform: translate3d(690px, 80px, 0) scale(0.35);
+  -ms-transform: translate3d(690px, 80px, 0) scale(0.35);
+  -o-transform: translate3d(690px, 80px, 0) scale(0.35);
+  transform: translate3d(690px, 80px, 0) scale(0.35);
+}
+/* line 696, ../scss/default.scss */
+.with-notes.popup slides.layout-widescreen slide .note,
+.with-notes.popup slides.layout-faux-widescreen slide .note {
+  -webkit-transform: translate3d(300px, 800px, 0) scale(1.5);
+  -moz-transform: translate3d(300px, 800px, 0) scale(1.5);
+  -ms-transform: translate3d(300px, 800px, 0) scale(1.5);
+  -o-transform: translate3d(300px, 800px, 0) scale(1.5);
+  transform: translate3d(300px, 800px, 0) scale(1.5);
+}
+/* line 702, ../scss/default.scss */
+.with-notes.popup slide {
+  overflow: visible;
+  background: white;
+  -webkit-transition: none;
+  -moz-transition: none;
+  -ms-transition: none;
+  -o-transition: none;
+  transition: none;
+  pointer-events: none;
+  -webkit-transform-origin: 0 0;
+  -moz-transform-origin: 0 0;
+  -ms-transform-origin: 0 0;
+  -o-transform-origin: 0 0;
+  transform-origin: 0 0;
+}
+/* line 709, ../scss/default.scss */
+.with-notes.popup slide:not(.backdrop) {
+  -webkit-transform: scale(0.6) translate3d(0.5em, 0.5em, 0);
+  -moz-transform: scale(0.6) translate3d(0.5em, 0.5em, 0);
+  -ms-transform: scale(0.6) translate3d(0.5em, 0.5em, 0);
+  -o-transform: scale(0.6) translate3d(0.5em, 0.5em, 0);
+  transform: scale(0.6) translate3d(0.5em, 0.5em, 0);
+  -webkit-box-shadow: 0 0 10px #797979;
+  -moz-box-shadow: 0 0 10px #797979;
+  box-shadow: 0 0 10px #797979;
+}
+/* line 714, ../scss/default.scss */
+.with-notes.popup slide.backdrop {
+  background-image: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 600, color-stop(0%, #b1dfff), color-stop(100%, #4387fd));
+  background-image: -webkit-radial-gradient(50% 50%, #b1dfff 0%, #4387fd 600px);
+  background-image: -moz-radial-gradient(50% 50%, #b1dfff 0%, #4387fd 600px);
+  background-image: -o-radial-gradient(50% 50%, #b1dfff 0%, #4387fd 600px);
+  background-image: -ms-radial-gradient(50% 50%, #b1dfff 0%, #4387fd 600px);
+  background-image: radial-gradient(50% 50%, #b1dfff 0%, #4387fd 600px);
+}
+/* line 720, ../scss/default.scss */
+.with-notes.popup slide.next {
+  -webkit-transform: translate3d(570px, 80px, 0) scale(0.35);
+  -moz-transform: translate3d(570px, 80px, 0) scale(0.35);
+  -ms-transform: translate3d(570px, 80px, 0) scale(0.35);
+  -o-transform: translate3d(570px, 80px, 0) scale(0.35);
+  transform: translate3d(570px, 80px, 0) scale(0.35);
+  opacity: 1 !important;
+}
+/* line 724, ../scss/default.scss */
+.with-notes.popup slide.next .note {
+  display: none !important;
+}
+/* line 730, ../scss/default.scss */
+.with-notes.popup .note {
+  width: 109%;
+  height: 260px;
+  background: #e6e6e6;
+  padding: 0;
+  -webkit-box-shadow: 0 0 10px #797979;
+  -moz-box-shadow: 0 0 10px #797979;
+  box-shadow: 0 0 10px #797979;
+  -webkit-transform: translate3d(250px, 800px, 0) scale(1.5);
+  -moz-transform: translate3d(250px, 800px, 0) scale(1.5);
+  -ms-transform: translate3d(250px, 800px, 0) scale(1.5);
+  -o-transform: translate3d(250px, 800px, 0) scale(1.5);
+  transform: translate3d(250px, 800px, 0) scale(1.5);
+  -webkit-transition: opacity 400ms ease-in-out;
+  -moz-transition: opacity 400ms ease-in-out;
+  -ms-transition: opacity 400ms ease-in-out;
+  -o-transition: opacity 400ms ease-in-out;
+  transition: opacity 400ms ease-in-out;
+}
+/* line 741, ../scss/default.scss */
+.with-notes.popup .note > section {
+  background: #fff;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  -ms-border-radius: 5px;
+  -o-border-radius: 5px;
+  border-radius: 5px;
+  height: 100%;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+  overflow: auto;
+  padding: 1em;
+}
+/* line 754, ../scss/default.scss */
+.with-notes .note {
+  opacity: 1;
+  -webkit-transform: translateY(0);
+  -moz-transform: translateY(0);
+  -ms-transform: translateY(0);
+  -o-transform: translateY(0);
+  transform: translateY(0);
+  pointer-events: auto;
+}
+
+/* line 761, ../scss/default.scss */
+.source {
+  font-size: 14px;
+  color: #a9a9a9;
+  position: absolute;
+  bottom: 70px;
+  left: 60px;
+}
+
+/* line 769, ../scss/default.scss */
+.centered {
+  text-align: center;
+}
+
+/* line 773, ../scss/default.scss */
+.reflect {
+  -webkit-box-reflect: below 3px -webkit-linear-gradient(rgba(255, 255, 255, 0) 85%, white 150%);
+  -moz-box-reflect: below 3px -moz-linear-gradient(rgba(255, 255, 255, 0) 85%, white 150%);
+  -o-box-reflect: below 3px -o-linear-gradient(rgba(255, 255, 255, 0) 85%, white 150%);
+  -ms-box-reflect: below 3px -ms-linear-gradient(rgba(255, 255, 255, 0) 85%, white 150%);
+  box-reflect: below 3px linear-gradient(rgba(255, 255, 255, 0) 85%, #ffffff 150%);
+}
+
+/* line 781, ../scss/default.scss */
+.flexbox {
+  display: -webkit-box !important;
+  display: -moz-box !important;
+  display: -ms-box !important;
+  display: -o-box !important;
+  display: box !important;
+}
+
+/* line 785, ../scss/default.scss */
+.flexbox.vcenter {
+  -webkit-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -ms-box-orient: vertical;
+  box-orient: vertical;
+  -webkit-box-align: center;
+  -moz-box-align: center;
+  -ms-box-align: center;
+  box-align: center;
+  -webkit-box-pack: center;
+  -moz-box-pack: center;
+  -ms-box-pack: center;
+  box-pack: center;
+  height: 100%;
+  width: 100%;
+}
+
+/* line 791, ../scss/default.scss */
+.flexbox.vleft {
+  -webkit-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -ms-box-orient: vertical;
+  box-orient: vertical;
+  -webkit-box-align: left;
+  -moz-box-align: left;
+  -ms-box-align: left;
+  box-align: left;
+  -webkit-box-pack: center;
+  -moz-box-pack: center;
+  -ms-box-pack: center;
+  box-pack: center;
+  height: 100%;
+  width: 100%;
+}
+
+/* line 797, ../scss/default.scss */
+.flexbox.vright {
+  -webkit-box-orient: vertical;
+  -moz-box-orient: vertical;
+  -ms-box-orient: vertical;
+  box-orient: vertical;
+  -webkit-box-align: end;
+  -moz-box-align: end;
+  -ms-box-align: end;
+  box-align: end;
+  -webkit-box-pack: center;
+  -moz-box-pack: center;
+  -ms-box-pack: center;
+  box-pack: center;
+  height: 100%;
+  width: 100%;
+}
+
+/* line 803, ../scss/default.scss */
+.auto-fadein {
+  -webkit-transition: opacity 0.6s ease-in 1s;
+  -moz-transition: opacity 0.6s ease-in 1s;
+  -ms-transition: opacity 0.6s ease-in 1s;
+  -o-transition: opacity 0.6s ease-in 1s;
+  transition: opacity 0.6s ease-in 1s;
+  opacity: 0;
+}
+
+/* Clickable/tappable areas */
+/* line 809, ../scss/default.scss */
+.slide-area {
+  z-index: 1000;
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100px;
+  height: 700px;
+  left: 50%;
+  top: 50%;
+  cursor: pointer;
+  margin-top: -350px;
+}
+
+/* line 826, ../scss/default.scss */
+#prev-slide-area {
+  margin-left: -550px;
+}
+
+/* line 831, ../scss/default.scss */
+#next-slide-area {
+  margin-left: 450px;
+}
+
+/* ===== SLIDE CONTENT ===== */
+/* line 839, ../scss/default.scss */
+.logoslide img {
+  width: 383px;
+  height: 92px;
+}
+
+/* line 845, ../scss/default.scss */
+.segue {
+  padding: 60px 120px;
+}
+/* line 848, ../scss/default.scss */
+.segue h2 {
+  color: #e6e6e6;
+  font-size: 60px;
+}
+/* line 852, ../scss/default.scss */
+.segue h3 {
+  color: #e6e6e6;
+  line-height: 2.8;
+}
+/* line 856, ../scss/default.scss */
+.segue hgroup {
+  position: absolute;
+  bottom: 225px;
+}
+
+/* line 862, ../scss/default.scss */
+.thank-you-slide {
+  background: #4387fd !important;
+  color: white;
+}
+/* line 866, ../scss/default.scss */
+.thank-you-slide h2 {
+  font-size: 60px;
+  color: inherit;
+}
+/* line 871, ../scss/default.scss */
+.thank-you-slide article > p {
+  margin-top: 2em;
+  font-size: 20pt;
+}
+/* line 876, ../scss/default.scss */
+.thank-you-slide > p {
+  position: absolute;
+  bottom: 80px;
+  font-size: 24pt;
+  line-height: 1.3;
+}
+
+/* line 884, ../scss/default.scss */
+aside.gdbar {
+  height: 97px;
+  width: 215px;
+  position: absolute;
+  left: -1px;
+  top: 125px;
+  -webkit-border-radius: 0 10px 10px 0;
+  -moz-border-radius: 0 10px 10px 0;
+  -ms-border-radius: 0 10px 10px 0;
+  -o-border-radius: 0 10px 10px 0;
+  border-radius: 0 10px 10px 0;
+  background: -webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #e6e6e6), color-stop(100%, #e6e6e6)) no-repeat;
+  background: -webkit-linear-gradient(left, #e6e6e6, #e6e6e6) no-repeat;
+  background: -moz-linear-gradient(left, #e6e6e6, #e6e6e6) no-repeat;
+  background: -o-linear-gradient(left, #e6e6e6, #e6e6e6) no-repeat;
+  background: -ms-linear-gradient(left, #e6e6e6, #e6e6e6) no-repeat;
+  background: linear-gradient(left, #e6e6e6, #e6e6e6) no-repeat;
+  -webkit-background-size: 0% 100%;
+  -moz-background-size: 0% 100%;
+  -o-background-size: 0% 100%;
+  background-size: 0% 100%;
+  -webkit-transition: all 0.5s ease-out 0.5s;
+  -moz-transition: all 0.5s ease-out 0.5s;
+  -ms-transition: all 0.5s ease-out 0.5s;
+  -o-transition: all 0.5s ease-out 0.5s;
+  transition: all 0.5s ease-out 0.5s;
+  /* Better to transition only on background-size, but not sure how to do that with the mixin. */
+}
+/* line 895, ../scss/default.scss */
+aside.gdbar.right {
+  right: 0;
+  left: -moz-initial;
+  left: initial;
+  top: 254px;
+  /* 96 is height of gray icon bar */
+  -webkit-transform: rotateZ(180deg);
+  -moz-transform: rotateZ(180deg);
+  -ms-transform: rotateZ(180deg);
+  -o-transform: rotateZ(180deg);
+  transform: rotateZ(180deg);
+}
+/* line 902, ../scss/default.scss */
+aside.gdbar.right img {
+  -webkit-transform: rotateZ(180deg);
+  -moz-transform: rotateZ(180deg);
+  -ms-transform: rotateZ(180deg);
+  -o-transform: rotateZ(180deg);
+  transform: rotateZ(180deg);
+}
+/* line 907, ../scss/default.scss */
+aside.gdbar.bottom {
+  top: -moz-initial;
+  top: initial;
+  bottom: 60px;
+}
+/* line 913, ../scss/default.scss */
+aside.gdbar img {
+  width: 125px;
+  height: 85px;
+  position: absolute;
+  right: 0;
+  margin: 8px 15px;
+}
+
+/* line 924, ../scss/default.scss */
+.title-slide hgroup {
+  bottom: 100px;
+}
+/* line 927, ../scss/default.scss */
+.title-slide hgroup h1 {
+  font-size: 65px;
+  line-height: 1.4;
+  letter-spacing: -3px;
+  color: #515151;
+}
+/* line 934, ../scss/default.scss */
+.title-slide hgroup h2 {
+  font-size: 34px;
+  color: #a9a9a9;
+  font-weight: inherit;
+}
+/* line 940, ../scss/default.scss */
+.title-slide hgroup p {
+  font-size: 20px;
+  color: #797979;
+  line-height: 1.3;
+  margin-top: 2em;
+}
+
+/* line 949, ../scss/default.scss */
+.quote {
+  color: #e6e6e6;
+}
+/* line 952, ../scss/default.scss */
+.quote .author {
+  font-size: 24px;
+  position: absolute;
+  bottom: 80px;
+  line-height: 1.4;
+}
+
+/* line 961, ../scss/default.scss */
+[data-config-contact] a {
+  color: white;
+  border-bottom: none;
+}
+/* line 965, ../scss/default.scss */
+[data-config-contact] span {
+  width: 115px;
+  display: inline-block;
+}
+
+/* line 974, ../scss/default.scss */
+.overview.popup .note {
+  display: none !important;
+}
+/* line 980, ../scss/default.scss */
+.overview slides slide {
+  display: block;
+  cursor: pointer;
+  opacity: 0.5;
+  pointer-events: auto !important;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(85%, #ffffff), color-stop(100%, #e6e6e6));
+  background: -webkit-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: -moz-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: -o-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: -ms-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background: linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+  background-color: white;
+}
+/* line 981, ../scss/default.scss */
+.overview slides slide.backdrop {
+  display: none !important;
+}
+/* line 996, ../scss/default.scss */
+.overview slides slide.far-past, .overview slides slide.past, .overview slides slide.next, .overview slides slide.far-next, .overview slides slide.far-past {
+  opacity: 0.5;
+  display: block;
+}
+/* line 1001, ../scss/default.scss */
+.overview slides slide.current {
+  opacity: 1;
+}
+/* line 1007, ../scss/default.scss */
+.overview .slide-area {
+  display: none;
+}
+
+@media print {
+  /* line 1014, ../scss/default.scss */
+  slides slide {
+    display: block !important;
+    position: relative;
+    background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(85%, #ffffff), color-stop(100%, #e6e6e6));
+    background: -webkit-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+    background: -moz-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+    background: -o-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+    background: -ms-linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+    background: linear-gradient(#ffffff, #ffffff 85%, #e6e6e6);
+    background-color: white;
+    -webkit-transform: none !important;
+    -moz-transform: none !important;
+    -ms-transform: none !important;
+    -o-transform: none !important;
+    transform: none !important;
+    width: 100%;
+    height: 100%;
+    page-break-after: always;
+    top: auto !important;
+    left: auto !important;
+    margin-top: 0 !important;
+    margin-left: 0 !important;
+    opacity: 1 !important;
+    color: #555;
+  }
+  /* line 1034, ../scss/default.scss */
+  slides slide.far-past, slides slide.past, slides slide.next, slides slide.far-next, slides slide.far-past, slides slide.current {
+    opacity: 1 !important;
+    display: block !important;
+  }
+  /* line 1040, ../scss/default.scss */
+  slides slide .build > * {
+    -webkit-transition: none;
+    -moz-transition: none;
+    -ms-transition: none;
+    -o-transition: none;
+    transition: none;
+  }
+  /* line 1045, ../scss/default.scss */
+  slides slide .build .to-build,
+  slides slide .build .build-fade {
+    opacity: 1;
+  }
+  /* line 1050, ../scss/default.scss */
+  slides slide .auto-fadein {
+    opacity: 1 !important;
+  }
+  /* line 1054, ../scss/default.scss */
+  slides slide.backdrop {
+    display: none !important;
+  }
+  /* line 1058, ../scss/default.scss */
+  slides slide table.rows {
+    border-right: 0;
+  }
+  /* line 1063, ../scss/default.scss */
+  slides slide[hidden] {
+    display: none !important;
+  }
+
+  /* line 1068, ../scss/default.scss */
+  .slide-area {
+    display: none;
+  }
+
+  /* line 1072, ../scss/default.scss */
+  .reflect {
+    -webkit-box-reflect: none;
+    -moz-box-reflect: none;
+    -o-box-reflect: none;
+    -ms-box-reflect: none;
+    box-reflect: none;
+  }
+
+  /* line 1080, ../scss/default.scss */
+  pre, code {
+    font-family: monospace !important;
+  }
+}

+ 24 - 0
libraries/frameworks/io2012/css/fonts.css

@@ -0,0 +1,24 @@
+@font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 400;
+  src: local('Open Sans'), local('OpenSans'), url(../fonts/OpenSans.woff) format('woff');
+}
+@font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 700;
+  src: local('Open Sans Bold'), local('OpenSans-Bold'), url(../fonts/OpenSans-Bold.woff) format('woff');
+}
+@font-face {
+  font-family: 'Open Sans';
+  font-style: italic;
+  font-weight: 700;
+  src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), url(../fonts/OpenSans-BoldItalic.woff) format('woff');
+}
+@font-face {
+  font-family: 'Open Sans';
+  font-style: italic;
+  font-weight: 400;
+  src: local('Open Sans Italic'), local('OpenSans-Italic'), url(../fonts/OpenSans-Italic.woff) format('woff');
+}

+ 27 - 0
libraries/frameworks/io2012/css/phone.css

@@ -0,0 +1,27 @@
+/*Smartphones (portrait and landscape) ----------- */
+/*@media only screen
+and (min-width : 320px)
+and (max-width : 480px) {
+
+}*/
+/* Smartphones (portrait) ----------- */
+/* Styles */
+/* line 17, ../scss/phone.scss */
+slides > slide {
+  /*  width: $slide-width !important;
+    height: $slide-height !important;
+    margin-left: -$slide-width / 2 !important;
+    margin-top: -$slide-height / 2 !important;
+  */
+  -webkit-transition: none !important;
+  -webkit-transition: none !important;
+  -moz-transition: none !important;
+  -ms-transition: none !important;
+  -o-transition: none !important;
+  transition: none !important;
+}
+
+/* iPhone 4 ----------- */
+@media only screen and (-webkit-min-device-pixel-ratio : 1.5), only screen and (min-device-pixel-ratio : 1.5) {
+  /* Styles */
+}

+ 368 - 0
libraries/frameworks/io2012/css/slidify.css

@@ -0,0 +1,368 @@
+@import url(http://fonts.googleapis.com/css?family=Open+Sans+Condensed:700|Source+Code+Pro:500|Open+Sans|Oswald);
+
+/* Styles for Table of Contents */
+#io2012-toc {
+  position: absolute;
+  top:0;
+  left:10px;
+  z-index: 999;
+}
+#io2012-toc a{
+  border-bottom: none;
+}
+
+#io2012-toc .nav-pills > .active > a{
+  background-color: darkslategray;
+  color: yellow;
+}
+#io2012-toc li {
+  margin-bottom: 0em;
+}
+
+#io2012-toc li.current {
+  background-color: yellow;
+}
+
+.license {
+  font-size: 14px;
+  color: #a9a9a9;
+  position: absolute;
+  bottom: 30px;
+  left: 60px;
+}
+
+
+/* Styles for Title Slide */
+.title-slide hgroup > h1{
+  font-family: 'Oswald', sans-serif;
+}
+
+.title-slide hgroup > h2{
+  font-family: 'Oswald', 'Calibri', sans-serif;
+}
+
+/* Fonts and Spacing */
+article p, article li, article li.build, section p, section li{
+  font-family: 'Open Sans','Helvetica', 'Crimson Text', 'Garamond',  'Palatino', sans-serif;
+  text-align: justify;
+  font-size:22px;
+  line-height: 1.5em;
+  color: #444;
+}
+
+slide:not(.segue) h2{
+  font-family: 'Calibri', Arial, sans-serif;
+  font-size: 52px;
+  font-style: normal;
+  font-weight: bold;
+  text-transform: normal;
+  letter-spacing: -2px;
+  line-height: 1.2em;
+/*  color: #193441;*/
+/*  color: #02574D;*/
+  color: #CC2904;
+}
+
+/* Reduce Space between Title and Body */
+slides > slide > hgroup + article {
+  margin-top: 15px;
+}
+
+/* Remove Border, Margins and Padding from iframe */
+iframe {
+  border: none;
+  margin: 0;
+  padding: 0;
+}
+
+/* Knitr Images */
+.rimage.left {
+  text-align: left;
+}
+.rimage.right {
+  text-align: right;
+}
+.rimage.center {
+  text-align: center;
+}
+
+/* Quotes and Shout (for io2012, custom) */
+article q {
+  font-family: 'Crimson Text', sans-serif;
+}
+
+q {
+  display: block;
+  font-size: 44px;
+  line-height: 56px;
+  margin-left: 50px;
+  margin-top: 100px;
+  margin-right: 150px;
+}
+
+q::before {
+  content: '“';
+  position: absolute;
+  display: inline-block;
+  margin-left: -2.1em;
+  width: 2em;
+  text-align: right;
+  font-size: 90px;
+  color: silver;
+}
+
+q::after {
+  content: '”';
+  position: absolute;
+  margin-left: .1em;
+  font-size: 90px;
+  color: silver;
+}
+
+div.author {
+  text-align: right;
+  font-size: 40px;
+  margin-top: 20px;
+  margin-right: 150px;
+}
+
+div.author::before {
+  content: '—';
+}
+
+q.shout:before {
+  content: '';
+  position: absolute;
+  margin-left: -0.5em;
+}
+
+q.shout:after {
+  content: '';
+  position: absolute;
+  margin-left: 0.1em;
+}
+
+/* Tables */
+table caption{
+  margin-top: 20pt;
+  font-weight: normal;
+  font-family: "Trebuchet MS", Garuda, sans-serif;
+}
+
+table th {
+  text-transform: capitalize;
+}
+
+/* Tables */
+
+table {
+  border: none;
+  width: 100%;
+  border-collapse: collapse;
+  font-size: 24px;
+  line-height: 32px;
+  font-family: 'Trebuchet MS';
+  font-weight: bolder;
+  color: rgb(102, 102, 102);
+}
+table thead {
+  border-top: 1px solid #BFBEAD;
+  border-bottom: 1px solid #BFBEAD;
+}
+table th, table td, table caption {
+  margin: 0;
+  padding: 2pt 6pt;
+  text-align: left;
+  vertical-align: top;
+}
+table th {
+  background: #CFCEBD;
+  color: #575400;
+  text-transform: uppercase;
+}
+table td {
+  border-bottom: 1px solid #CFCEBD;
+}
+table tr:nth-child(2n+1) {
+/*  background: #E8F2FF; */
+  background: #EFEEDD;
+}
+
+/* Styling for Ordered Lists (only for io2012) */
+
+ol {
+  margin-left: 1.2em;
+  margin-bottom: 1em;
+  postion: relative;
+}
+
+ol li {
+  margin-bottom: 0.5em;
+  font-family: "Open Sans";
+}
+
+ol li ol {
+  margin-left: 0.5em;
+  margin-bottom: 0;
+}
+
+ol, ul {
+  margin-top: .5em;
+}
+
+ol {
+  list-style-type: decimal;
+}
+
+/*Github Ribbon Test*/
+/* Source: https://github.com/dciccale/css3-github-ribbon */
+/* Define classes for example, definition, problem etc. */
+/* Choose meaningful colors for background and text */
+
+.example {
+  background-color: #121621;
+  top: 1.2em;
+  right: -3.2em;
+  -webkit-transform: rotate(45deg);
+  -moz-transform: rotate(45deg);
+  transform: rotate(45deg);
+  -webkit-box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  -moz-box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  color: #FF0;
+  display: block;
+  padding: .6em 3.5em;
+  position: absolute;
+  font: bold .82em sans-serif;
+  text-align: center;
+  text-decoration: none;
+  text-shadow: 1px -1px 8px rgba(0,0,0,0.60);
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  user-select: none;
+}
+
+.definition {
+  background-color: #a00;
+  top: 1.2em;
+  right: -3.2em;
+  -webkit-transform: rotate(45deg);
+  -moz-transform: rotate(45deg);
+  transform: rotate(45deg);
+  -webkit-box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  -moz-box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  box-shadow: 0 0 0 1px #1d212e inset,0 0 2px 1px #fff inset,0 0 1em #888;
+  color: #FFF;
+  display: block;
+  padding: .6em 3.5em;
+  position: absolute;
+  font: bold .82em sans-serif;
+  text-align: center;
+  text-decoration: none;
+  text-shadow: 1px -1px 8px rgba(0,0,0,0.60);
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  user-select: none;
+}
+
+
+/* Pasted from Custom.css */
+aside.gbar img {
+  width: 175px;
+}
+
+
+div.modal-body pre{
+  width: 95%;
+  left: 0px;
+}
+
+.pagination {
+  position: absolute;
+  bottom: -5px;
+  left:110px;
+}
+
+.pagination ul li:before {
+  content: "";
+}
+
+body {
+  font-family: "Open Sans";
+  color: #444;
+}
+
+p {
+  text-align: justify;
+  line-height: 1.5em;
+}
+/* Place Video on Top Right */
+/* FIXME: Move CSS to css/popcorn.css */
+section.video {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 1000;
+}
+
+
+/* Smaller code fonts in modal popup */
+.modal pre code {
+  font-size: 16px;
+}
+
+img.center {
+  display: block;
+  margin: auto auto;
+}
+
+body {
+  background-color: #000;
+}
+.quiz-option label{
+  display: inline;
+  font-size: 1em;
+}
+slide.segue h2{
+ font-family: "Open Sans Condensed";
+ font-weight: 700;
+}
+slide:not(.segue)  h2{
+ font-family: "Open Sans Condensed";
+ font-weight: 700;
+ color: darkslategray;
+}
+article p {
+  font-family: "Open Sans"
+}
+
+code {
+  font-size: 100%;
+  font-family: "Source Code Pro", monospace;
+  color: darkred;
+}
+pre code {
+  font-weight: 500;
+  -webkit-border-radius: 5px;
+  border-radius: 5px;
+}
+
+#glimmer iframe {
+  width: 100%;
+}
+
+.title-slide {
+  background-color: #CBE7A5; /* #EDE0CF; ; #CA9F9D*/
+  /* background-image:url(http://goo.gl/EpXln); */
+}
+
+.title-slide hgroup > h1{
+ font-family: 'Oswald', 'Helvetica', sanserif; 
+}
+
+.title-slide hgroup > h1, 
+.title-slide hgroup > h2 {
+  color: #535E43 ;  /* ; #EF5150*/
+}
+
+

BIN
libraries/frameworks/io2012/images/google_developers_icon_128.png


BIN
libraries/frameworks/io2012/images/io2012_logo.png


+ 586 - 0
libraries/frameworks/io2012/js/hammer.js

@@ -0,0 +1,586 @@
+/*
+ * Hammer.JS
+ * version 0.4
+ * author: Eight Media
+ * https://github.com/EightMedia/hammer.js
+ */
+function Hammer(element, options, undefined)
+{
+    var self = this;
+
+    var defaults = {
+        // prevent the default event or not... might be buggy when false
+        prevent_default    : false,
+        css_hacks          : true,
+
+        drag               : true,
+        drag_vertical      : true,
+        drag_horizontal    : true,
+        // minimum distance before the drag event starts
+        drag_min_distance  : 20, // pixels
+
+        // pinch zoom and rotation
+        transform          : true,
+        scale_treshold     : 0.1,
+        rotation_treshold  : 15, // degrees
+
+        tap                : true,
+        tap_double         : true,
+        tap_max_interval   : 300,
+        tap_double_distance: 20,
+
+        hold               : true,
+        hold_timeout       : 500
+    };
+    options = mergeObject(defaults, options);
+
+    // some css hacks
+    (function() {
+        if(!options.css_hacks) {
+            return false;
+        }
+
+        var vendors = ['webkit','moz','ms','o',''];
+        var css_props = {
+            "userSelect": "none",
+            "touchCallout": "none",
+            "userDrag": "none",
+            "tapHighlightColor": "rgba(0,0,0,0)"
+        };
+
+        var prop = '';
+        for(var i = 0; i < vendors.length; i++) {
+            for(var p in css_props) {
+                prop = p;
+                if(vendors[i]) {
+                    prop = vendors[i] + prop.substring(0, 1).toUpperCase() + prop.substring(1);
+                }
+                element.style[ prop ] = css_props[p];
+            }
+        }
+    })();
+
+    // holds the distance that has been moved
+    var _distance = 0;
+
+    // holds the exact angle that has been moved
+    var _angle = 0;
+
+    // holds the diraction that has been moved
+    var _direction = 0;
+
+    // holds position movement for sliding
+    var _pos = { };
+
+    // how many fingers are on the screen
+    var _fingers = 0;
+
+    var _first = false;
+
+    var _gesture = null;
+    var _prev_gesture = null;
+
+    var _touch_start_time = null;
+    var _prev_tap_pos = {x: 0, y: 0};
+    var _prev_tap_end_time = null;
+
+    var _hold_timer = null;
+
+    var _offset = {};
+
+    // keep track of the mouse status
+    var _mousedown = false;
+
+    var _event_start;
+    var _event_move;
+    var _event_end;
+
+
+    /**
+     * angle to direction define
+     * @param  float    angle
+     * @return string   direction
+     */
+    this.getDirectionFromAngle = function( angle )
+    {
+        var directions = {
+            down: angle >= 45 && angle < 135, //90
+            left: angle >= 135 || angle <= -135, //180
+            up: angle < -45 && angle > -135, //270
+            right: angle >= -45 && angle <= 45 //0
+        };
+
+        var direction, key;
+        for(key in directions){
+            if(directions[key]){
+                direction = key;
+                break;
+            }
+        }
+        return direction;
+    };
+
+
+    /**
+     * count the number of fingers in the event
+     * when no fingers are detected, one finger is returned (mouse pointer)
+     * @param  event
+     * @return int  fingers
+     */
+    function countFingers( event )
+    {
+        // there is a bug on android (until v4?) that touches is always 1,
+        // so no multitouch is supported, e.g. no, zoom and rotation...
+        return event.touches ? event.touches.length : 1;
+    }
+
+
+    /**
+     * get the x and y positions from the event object
+     * @param  event
+     * @return array  [{ x: int, y: int }]
+     */
+    function getXYfromEvent( event )
+    {
+        event = event || window.event;
+
+        // no touches, use the event pageX and pageY
+        if(!event.touches) {
+            var doc = document,
+                body = doc.body;
+
+            return [{
+                x: event.pageX || event.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && doc.clientLeft || 0 ),
+                y: event.pageY || event.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && doc.clientTop || 0 )
+            }];
+        }
+        // multitouch, return array with positions
+        else {
+            var pos = [], src;
+            for(var t=0, len=event.touches.length; t<len; t++) {
+                src = event.touches[t];
+                pos.push({ x: src.pageX, y: src.pageY });
+            }
+            return pos;
+        }
+    }
+
+
+    /**
+     * calculate the angle between two points
+     * @param object pos1 { x: int, y: int }
+     * @param object pos2 { x: int, y: int }
+     */
+    function getAngle( pos1, pos2 )
+    {
+        return Math.atan2(pos2.y - pos1.y, pos2.x - pos1.x) * 180 / Math.PI;
+    }
+
+    /**
+     * trigger an event/callback by name with params
+     * @param string name
+     * @param array  params
+     */
+    function triggerEvent( eventName, params )
+    {
+        // return touches object
+        params.touches = getXYfromEvent(params.originalEvent);
+        params.type = eventName;
+
+        // trigger callback
+        if(isFunction(self["on"+ eventName])) {
+            self["on"+ eventName].call(self, params);
+        }
+    }
+
+
+    /**
+     * cancel event
+     * @param   object  event
+     * @return  void
+     */
+
+    function cancelEvent(event){
+        event = event || window.event;
+        if(event.preventDefault){
+            event.preventDefault();
+        }else{
+            event.returnValue = false;
+            event.cancelBubble = true;
+        }
+    }
+
+
+    /**
+     * reset the internal vars to the start values
+     */
+    function reset()
+    {
+        _pos = {};
+        _first = false;
+        _fingers = 0;
+        _distance = 0;
+        _angle = 0;
+        _gesture = null;
+    }
+
+
+    var gestures = {
+        // hold gesture
+        // fired on touchstart
+        hold : function(event)
+        {
+            // only when one finger is on the screen
+            if(options.hold) {
+                _gesture = 'hold';
+                clearTimeout(_hold_timer);
+
+                _hold_timer = setTimeout(function() {
+                    if(_gesture == 'hold') {
+                        triggerEvent("hold", {
+                            originalEvent   : event,
+                            position        : _pos.start
+                        });
+                    }
+                }, options.hold_timeout);
+            }
+        },
+
+
+        // drag gesture
+        // fired on mousemove
+        drag : function(event)
+        {
+            // get the distance we moved
+            var _distance_x = _pos.move[0].x - _pos.start[0].x;
+            var _distance_y = _pos.move[0].y - _pos.start[0].y;
+            _distance = Math.sqrt(_distance_x * _distance_x + _distance_y * _distance_y);
+
+            // drag
+            // minimal movement required
+            if(options.drag && (_distance > options.drag_min_distance) || _gesture == 'drag') {
+                // calculate the angle
+                _angle = getAngle(_pos.start[0], _pos.move[0]);
+                _direction = self.getDirectionFromAngle(_angle);
+
+                // check the movement and stop if we go in the wrong direction
+                var is_vertical = (_direction == 'up' || _direction == 'down');
+                if(((is_vertical && !options.drag_vertical) || (!is_vertical && !options.drag_horizontal))
+                    && (_distance > options.drag_min_distance)) {
+                    return;
+                }
+
+                _gesture = 'drag';
+
+                var position = { x: _pos.move[0].x - _offset.left,
+                    y: _pos.move[0].y - _offset.top };
+
+                var event_obj = {
+                    originalEvent   : event,
+                    position        : position,
+                    direction       : _direction,
+                    distance        : _distance,
+                    distanceX       : _distance_x,
+                    distanceY       : _distance_y,
+                    angle           : _angle
+                };
+
+                // on the first time trigger the start event
+                if(_first) {
+                    triggerEvent("dragstart", event_obj);
+
+                    _first = false;
+                }
+
+                // normal slide event
+                triggerEvent("drag", event_obj);
+
+                cancelEvent(event);
+            }
+        },
+
+
+        // transform gesture
+        // fired on touchmove
+        transform : function(event)
+        {
+            if(options.transform) {
+                var scale = event.scale || 1;
+                var rotation = event.rotation || 0;
+
+                if(countFingers(event) != 2) {
+                    return false;
+                }
+
+                if(_gesture != 'drag' &&
+                    (_gesture == 'transform' || Math.abs(1-scale) > options.scale_treshold
+                        || Math.abs(rotation) > options.rotation_treshold)) {
+                    _gesture = 'transform';
+
+                    _pos.center = {  x: ((_pos.move[0].x + _pos.move[1].x) / 2) - _offset.left,
+                        y: ((_pos.move[0].y + _pos.move[1].y) / 2) - _offset.top };
+
+                    var event_obj = {
+                        originalEvent   : event,
+                        position        : _pos.center,
+                        scale           : scale,
+                        rotation        : rotation
+                    };
+
+                    // on the first time trigger the start event
+                    if(_first) {
+                        triggerEvent("transformstart", event_obj);
+                        _first = false;
+                    }
+
+                    triggerEvent("transform", event_obj);
+
+                    cancelEvent(event);
+
+                    return true;
+                }
+            }
+
+            return false;
+        },
+
+
+        // tap and double tap gesture
+        // fired on touchend
+        tap : function(event)
+        {
+            // compare the kind of gesture by time
+            var now = new Date().getTime();
+            var touch_time = now - _touch_start_time;
+
+            // dont fire when hold is fired
+            if(options.hold && !(options.hold && options.hold_timeout > touch_time)) {
+                return;
+            }
+
+            // when previous event was tap and the tap was max_interval ms ago
+            var is_double_tap = (function(){
+                if (_prev_tap_pos && options.tap_double && _prev_gesture == 'tap' && (_touch_start_time - _prev_tap_end_time) < options.tap_max_interval) {
+                    var x_distance = Math.abs(_prev_tap_pos[0].x - _pos.start[0].x);
+                    var y_distance = Math.abs(_prev_tap_pos[0].y - _pos.start[0].y);
+                    return (_prev_tap_pos && _pos.start && Math.max(x_distance, y_distance) < options.tap_double_distance);
+
+                }
+                return false;
+            })();
+
+            if(is_double_tap) {
+                _gesture = 'double_tap';
+                _prev_tap_end_time = null;
+
+                triggerEvent("doubletap", {
+                    originalEvent   : event,
+                    position        : _pos.start
+                });
+                cancelEvent(event);
+            }
+
+            // single tap is single touch
+            else {
+                _gesture = 'tap';
+                _prev_tap_end_time = now;
+                _prev_tap_pos = _pos.start;
+
+                if(options.tap) {
+                    triggerEvent("tap", {
+                        originalEvent   : event,
+                        position        : _pos.start
+                    });
+                    cancelEvent(event);
+                }
+            }
+
+        }
+
+    };
+
+
+    function handleEvents(event)
+    {
+        switch(event.type)
+        {
+            case 'mousedown':
+            case 'touchstart':
+                _pos.start = getXYfromEvent(event);
+                _touch_start_time = new Date().getTime();
+                _fingers = countFingers(event);
+                _first = true;
+                _event_start = event;
+
+                // borrowed from jquery offset https://github.com/jquery/jquery/blob/master/src/offset.js
+                var box = element.getBoundingClientRect();
+                var clientTop  = element.clientTop  || document.body.clientTop  || 0;
+                var clientLeft = element.clientLeft || document.body.clientLeft || 0;
+                var scrollTop  = window.pageYOffset || element.scrollTop  || document.body.scrollTop;
+                var scrollLeft = window.pageXOffset || element.scrollLeft || document.body.scrollLeft;
+
+                _offset = {
+                    top: box.top + scrollTop - clientTop,
+                    left: box.left + scrollLeft - clientLeft
+                };
+
+                _mousedown = true;
+
+                // hold gesture
+                gestures.hold(event);
+
+                if(options.prevent_default) {
+                    cancelEvent(event);
+                }
+                break;
+
+            case 'mousemove':
+            case 'touchmove':
+                if(!_mousedown) {
+                    return false;
+                }
+                _event_move = event;
+                _pos.move = getXYfromEvent(event);
+
+                if(!gestures.transform(event)) {
+                    gestures.drag(event);
+                }
+                break;
+
+            case 'mouseup':
+            case 'mouseout':
+            case 'touchcancel':
+            case 'touchend':
+                if(!_mousedown || (_gesture != 'transform' && event.touches && event.touches.length > 0)) {
+                    return false;
+                }
+
+                _mousedown = false;
+                _event_end = event;
+
+                // drag gesture
+                // dragstart is triggered, so dragend is possible
+                if(_gesture == 'drag') {
+                    triggerEvent("dragend", {
+                        originalEvent   : event,
+                        direction       : _direction,
+                        distance        : _distance,
+                        angle           : _angle
+                    });
+                }
+
+                // transform
+                // transformstart is triggered, so transformed is possible
+                else if(_gesture == 'transform') {
+                    triggerEvent("transformend", {
+                        originalEvent   : event,
+                        position        : _pos.center,
+                        scale           : event.scale,
+                        rotation        : event.rotation
+                    });
+                }
+                else {
+                    gestures.tap(_event_start);
+                }
+
+                _prev_gesture = _gesture;
+
+                // reset vars
+                reset();
+                break;
+        }
+    }
+
+
+    // bind events for touch devices
+    // except for windows phone 7.5, it doesnt support touch events..!
+    if('ontouchstart' in window) {
+        element.addEventListener("touchstart", handleEvents, false);
+        element.addEventListener("touchmove", handleEvents, false);
+        element.addEventListener("touchend", handleEvents, false);
+        element.addEventListener("touchcancel", handleEvents, false);
+    }
+    // for non-touch
+    else {
+
+        if(element.addEventListener){ // prevent old IE errors
+            element.addEventListener("mouseout", function(event) {
+                if(!isInsideHammer(element, event.relatedTarget)) {
+                    handleEvents(event);
+                }
+            }, false);
+            element.addEventListener("mouseup", handleEvents, false);
+            element.addEventListener("mousedown", handleEvents, false);
+            element.addEventListener("mousemove", handleEvents, false);
+
+            // events for older IE
+        }else if(document.attachEvent){
+            element.attachEvent("onmouseout", function(event) {
+                if(!isInsideHammer(element, event.relatedTarget)) {
+                    handleEvents(event);
+                }
+            }, false);
+            element.attachEvent("onmouseup", handleEvents);
+            element.attachEvent("onmousedown", handleEvents);
+            element.attachEvent("onmousemove", handleEvents);
+        }
+    }
+
+
+    /**
+     * find if element is (inside) given parent element
+     * @param   object  element
+     * @param   object  parent
+     * @return  bool    inside
+     */
+    function isInsideHammer(parent, child) {
+        // get related target for IE
+        if(!child && window.event && window.event.toElement){
+            child = window.event.toElement;
+        }
+
+        if(parent === child){
+            return true;
+        }
+
+        // loop over parentNodes of child until we find hammer element
+        if(child){
+            var node = child.parentNode;
+            while(node !== null){
+                if(node === parent){
+                    return true;
+                };
+                node = node.parentNode;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * merge 2 objects into a new object
+     * @param   object  obj1
+     * @param   object  obj2
+     * @return  object  merged object
+     */
+    function mergeObject(obj1, obj2) {
+        var output = {};
+
+        if(!obj2) {
+            return obj1;
+        }
+
+        for (var prop in obj1) {
+            if (prop in obj2) {
+                output[prop] = obj2[prop];
+            } else {
+                output[prop] = obj1[prop];
+            }
+        }
+        return output;
+    }
+
+    function isFunction( obj ){
+        return Object.prototype.toString.call( obj ) == "[object Function]";
+    }
+}

Разница между файлами не показана из-за своего большого размера
+ 3 - 0
libraries/frameworks/io2012/js/modernizr.custom.45394.js


+ 8 - 0
libraries/frameworks/io2012/js/order.js

@@ -0,0 +1,8 @@
+/*
+ RequireJS order 1.0.5 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved.
+ Available via the MIT or new BSD license.
+ see: http://github.com/jrburke/requirejs for details
+*/
+(function(){function k(a){var b=a.currentTarget||a.srcElement,c;if(a.type==="load"||l.test(b.readyState)){a=b.getAttribute("data-requiremodule");j[a]=!0;for(a=0;c=g[a];a++)if(j[c.name])c.req([c.name],c.onLoad);else break;a>0&&g.splice(0,a);setTimeout(function(){b.parentNode.removeChild(b)},15)}}function m(a){var b,c;a.setAttribute("data-orderloaded","loaded");for(a=0;c=h[a];a++)if((b=i[c])&&b.getAttribute("data-orderloaded")==="loaded")delete i[c],require.addScriptToDom(b);else break;a>0&&h.splice(0,
+a)}var f=typeof document!=="undefined"&&typeof window!=="undefined"&&document.createElement("script"),n=f&&(f.async||window.opera&&Object.prototype.toString.call(window.opera)==="[object Opera]"||"MozAppearance"in document.documentElement.style),o=f&&f.readyState==="uninitialized",l=/^(complete|loaded)$/,g=[],j={},i={},h=[],f=null;define({version:"1.0.5",load:function(a,b,c,e){var d;b.nameToUrl?(d=b.nameToUrl(a,null),require.s.skipAsync[d]=!0,n||e.isBuild?b([a],c):o?(e=require.s.contexts._,!e.urlFetched[d]&&
+!e.loaded[a]&&(e.urlFetched[d]=!0,require.resourcesReady(!1),e.scriptCount+=1,d=require.attach(d,e,a,null,null,m),i[a]=d,h.push(a)),b([a],c)):b.specified(a)?b([a],c):(g.push({name:a,req:b,onLoad:c}),require.attach(d,null,a,k,"script/cache"))):b([a],c)}})})();

+ 2 - 0
libraries/frameworks/io2012/js/polyfills/classList.min.js

@@ -0,0 +1,2 @@
+/* @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
+"use strict";if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(a){var f="classList",d="prototype",e=(a.HTMLElement||a.Element)[d],g=Object;strTrim=String[d].trim||function(){return this.replace(/^\s+|\s+$/g,"")},arrIndexOf=Array[d].indexOf||function(k){for(var j=0,h=this.length;j<h;j++){if(j in this&&this[j]===k){return j}}return -1},DOMEx=function(h,i){this.name=h;this.code=DOMException[h];this.message=i},checkTokenAndGetIndex=function(i,h){if(h===""){throw new DOMEx("SYNTAX_ERR","An invalid or illegal string was specified")}if(/\s/.test(h)){throw new DOMEx("INVALID_CHARACTER_ERR","String contains an invalid character")}return arrIndexOf.call(i,h)},ClassList=function(m){var l=strTrim.call(m.className),k=l?l.split(/\s+/):[];for(var j=0,h=k.length;j<h;j++){this.push(k[j])}this._updateClassName=function(){m.className=this.toString()}},classListProto=ClassList[d]=[],classListGetter=function(){return new ClassList(this)};DOMEx[d]=Error[d];classListProto.item=function(h){return this[h]||null};classListProto.contains=function(h){h+="";return checkTokenAndGetIndex(this,h)!==-1};classListProto.add=function(h){h+="";if(checkTokenAndGetIndex(this,h)===-1){this.push(h);this._updateClassName()}};classListProto.remove=function(i){i+="";var h=checkTokenAndGetIndex(this,i);if(h!==-1){this.splice(h,1);this._updateClassName()}};classListProto.toggle=function(h){h+="";if(checkTokenAndGetIndex(this,h)===-1){this.add(h)}else{this.remove(h)}};classListProto.toString=function(){return this.join(" ")};if(g.defineProperty){var c={get:classListGetter,enumerable:true,configurable:true};try{g.defineProperty(e,f,c)}catch(b){if(b.number===-2146823252){c.enumerable=false;g.defineProperty(e,f,c)}}}else{if(g[d].__defineGetter__){e.__defineGetter__(f,classListGetter)}}}(self))};

+ 2 - 0
libraries/frameworks/io2012/js/polyfills/dataset.min.js

@@ -0,0 +1,2 @@
+(function(){function c(){d=!0;this.removeEventListener("DOMAttrModified",c,!1)}function g(b){return b.replace(h,function(b,a){return a.toUpperCase()})}function e(){var b={};i.call(this.attributes,function(a){if(f=a.name.match(j))b[g(f[1])]=a.value});return b}var i=[].forEach,j=/^data-(.+)/,h=/\-([a-z])/ig,a=document.createElement("div"),d=!1,f;a.dataset==void 0&&(a.addEventListener("DOMAttrModified",c,!1),a.setAttribute("foo","bar"),Element.prototype.__defineGetter__("dataset",d?function(){if(!this._datasetCache)this._datasetCache=
+e.call(this);return this._datasetCache}:e),document.addEventListener("DOMAttrModified",function(a){delete a.target._datasetCache},!1))})();

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
libraries/frameworks/io2012/js/polyfills/history.min.js


+ 2 - 0
libraries/frameworks/io2012/js/prettify/lang-apollo.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["com",/^#[^\n\r]*/,null,"#"],["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r Â\xa0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"']],[["kwd",/^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,
+null],["typ",/^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[ES]?BANK=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[!-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["apollo","agc","aea"]);

+ 18 - 0
libraries/frameworks/io2012/js/prettify/lang-clj.js

@@ -0,0 +1,18 @@
+/*
+ Copyright (C) 2011 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+var a=null;
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^[([{]+/,a,"([{"],["clo",/^[)\]}]+/,a,")]}"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a,"\t\n\r \xa0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\b/,a],
+["typ",/^:[\dA-Za-z-]+/]]),["clj"]);

+ 2 - 0
libraries/frameworks/io2012/js/prettify/lang-css.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n"]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com",
+/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]);

+ 1 - 0
libraries/frameworks/io2012/js/prettify/lang-go.js

@@ -0,0 +1 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r Â\xa0"],["pln",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])+(?:'|$)|`[^`]*(?:`|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\n\r]*|\/\*[\S\s]*?\*\/)/],["pln",/^(?:[^"'/`]|\/(?![*/]))+/]]),["go"]);

+ 2 - 0
libraries/frameworks/io2012/js/prettify/lang-hs.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null,"\t\n\r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^\n\f\r'\\]|\\[^&])'?/,null,"'"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^(?:--+[^\n\f\r]*|{-(?:[^-]|-+[^}-])*-})/],["kwd",/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^\d'A-Za-z]|$)/,
+null],["pln",/^(?:[A-Z][\w']*\.)*[A-Za-z][\w']*/],["pun",/^[^\d\t-\r "'A-Za-z]+/]]),["hs"]);

+ 3 - 0
libraries/frameworks/io2012/js/prettify/lang-lisp.js

@@ -0,0 +1,3 @@
+var a=null;
+PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,a,"("],["clo",/^\)+/,a,")"],["com",/^;[^\n\r]*/,a,";"],["pln",/^[\t\n\r \xa0]+/,a,"\t\n\r \xa0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,a],
+["lit",/^[+-]?(?:[#0]x[\da-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[de][+-]?\d+)?)/i],["lit",/^'(?:-*(?:\w|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?)?/],["pln",/^-*(?:[_a-z]|\\[!-~])(?:[\w-]*|\\[!-~])[!=?]?/i],["pun",/^[^\w\t\n\r "'-);\\\xa0]+/]]),["cl","el","lisp","scm"]);

+ 2 - 0
libraries/frameworks/io2012/js/prettify/lang-lua.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r Â\xa0"],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$))/,null,"\"'"]],[["com",/^--(?:\[(=*)\[[\S\s]*?(?:]\1]|$)|[^\n\r]*)/],["str",/^\[(=*)\[[\S\s]*?(?:]\1]|$)/],["kwd",/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],
+["pln",/^[_a-z]\w*/i],["pun",/^[^\w\t\n\r \xa0][^\w\t\n\r "'+=\xa0-]*/]]),["lua"]);

+ 2 - 0
libraries/frameworks/io2012/js/prettify/lang-ml.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r Â\xa0"],["com",/^#(?:if[\t\n\r \xa0]+(?:[$_a-z][\w']*|``[^\t\n\r`]*(?:``|$))|else|endif|light)/i,null,"#"],["str",/^(?:"(?:[^"\\]|\\[\S\s])*(?:"|$)|'(?:[^'\\]|\\[\S\s])(?:'|$))/,null,"\"'"]],[["com",/^(?:\/\/[^\n\r]*|\(\*[\S\s]*?\*\))/],["kwd",/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],
+["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^(?:[_a-z][\w']*[!#?]?|``[^\t\n\r`]*(?:``|$))/i],["pun",/^[^\w\t\n\r "'\xa0]+/]]),["fs","ml"]);

+ 4 - 0
libraries/frameworks/io2012/js/prettify/lang-n.js

@@ -0,0 +1,4 @@
+var a=null;
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^(?:'(?:[^\n\r'\\]|\\.)*'|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,a,'"'],["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,a,"#"],["pln",/^\s+/,a," \r\n\t\xa0"]],[["str",/^@"(?:[^"]|"")*(?:"|$)/,a],["str",/^<#[^#>]*(?:#>|$)/,a],["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,a],["com",/^\/\/[^\n\r]*/,a],["com",/^\/\*[\S\s]*?(?:\*\/|$)/,
+a],["kwd",/^(?:abstract|and|as|base|catch|class|def|delegate|enum|event|extern|false|finally|fun|implements|interface|internal|is|macro|match|matches|module|mutable|namespace|new|null|out|override|params|partial|private|protected|public|ref|sealed|static|struct|syntax|this|throw|true|try|type|typeof|using|variant|virtual|volatile|when|where|with|assert|assert2|async|break|checked|continue|do|else|ensures|for|foreach|if|late|lock|new|nolate|otherwise|regexp|repeat|requires|return|surroundwith|unchecked|unless|using|while|yield)\b/,
+a],["typ",/^(?:array|bool|byte|char|decimal|double|float|int|list|long|object|sbyte|short|string|ulong|uint|ufloat|ulong|ushort|void)\b/,a],["lit",/^@[$_a-z][\w$@]*/i,a],["typ",/^@[A-Z]+[a-z][\w$@]*/,a],["pln",/^'?[$_a-z][\w$@]*/i,a],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,a,"0123456789"],["pun",/^.[^\s\w"-$'./@`]*/,a]]),["n","nemerle"]);

+ 1 - 0
libraries/frameworks/io2012/js/prettify/lang-proto.js

@@ -0,0 +1 @@
+PR.registerLangHandler(PR.sourceDecorator({keywords:"bytes,default,double,enum,extend,extensions,false,group,import,max,message,option,optional,package,repeated,required,returns,rpc,service,syntax,to,true",types:/^(bool|(double|s?fixed|[su]?int)(32|64)|float|string)\b/,cStyleComments:!0}),["proto"]);

+ 2 - 0
libraries/frameworks/io2012/js/prettify/lang-scala.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r Â\xa0"],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],
+["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]);

+ 2 - 0
libraries/frameworks/io2012/js/prettify/lang-sql.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r Â\xa0"],["str",/^(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\n\r]*|\/\*[\S\s]*?(?:\*\/|$))/],["kwd",/^(?:add|all|alter|and|any|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|constraint|contains|containstable|continue|convert|create|cross|current|current_date|current_time|current_timestamp|current_user|cursor|database|dbcc|deallocate|declare|default|delete|deny|desc|disk|distinct|distributed|double|drop|dummy|dump|else|end|errlvl|escape|except|exec|execute|exists|exit|fetch|file|fillfactor|for|foreign|freetext|freetexttable|from|full|function|goto|grant|group|having|holdlock|identity|identitycol|identity_insert|if|in|index|inner|insert|intersect|into|is|join|key|kill|left|like|lineno|load|match|merge|national|nocheck|nonclustered|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|percent|plan|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rule|save|schema|select|session_user|set|setuser|shutdown|some|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|union|unique|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|writetext)(?=[^\w-]|$)/i,
+null],["lit",/^[+-]?(?:0x[\da-f]+|(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?)/i],["pln",/^[_a-z][\w-]*/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'+\xa0-]*/]]),["sql"]);

+ 1 - 0
libraries/frameworks/io2012/js/prettify/lang-tex.js

@@ -0,0 +1 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r Â\xa0"],["com",/^%[^\n\r]*/,null,"%"]],[["kwd",/^\\[@-Za-z]+/],["kwd",/^\\./],["typ",/^[$&]/],["lit",/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],["pun",/^[()=[\]{}]+/]]),["latex","tex"]);

+ 2 - 0
libraries/frameworks/io2012/js/prettify/lang-vb.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0\u2028\u2029]+/,null,"\t\n\r Â\xa0

"],["str",/^(?:["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})(?:["\u201c\u201d]c|$)|["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})*(?:["\u201c\u201d]|$))/i,null,'"“â€�'],["com",/^['\u2018\u2019].*/,null,"'‘’"]],[["kwd",/^(?:addhandler|addressof|alias|and|andalso|ansi|as|assembly|auto|boolean|byref|byte|byval|call|case|catch|cbool|cbyte|cchar|cdate|cdbl|cdec|char|cint|class|clng|cobj|const|cshort|csng|cstr|ctype|date|decimal|declare|default|delegate|dim|directcast|do|double|each|else|elseif|end|endif|enum|erase|error|event|exit|finally|for|friend|function|get|gettype|gosub|goto|handles|if|implements|imports|in|inherits|integer|interface|is|let|lib|like|long|loop|me|mod|module|mustinherit|mustoverride|mybase|myclass|namespace|new|next|not|notinheritable|notoverridable|object|on|option|optional|or|orelse|overloads|overridable|overrides|paramarray|preserve|private|property|protected|public|raiseevent|readonly|redim|removehandler|resume|return|select|set|shadows|shared|short|single|static|step|stop|string|structure|sub|synclock|then|throw|to|try|typeof|unicode|until|variant|wend|when|while|with|withevents|writeonly|xor|endif|gosub|let|variant|wend)\b/i,
+null],["com",/^rem.*/i],["lit",/^(?:true\b|false\b|nothing\b|\d+(?:e[+-]?\d+[dfr]?|[dfilrs])?|(?:&h[\da-f]+|&o[0-7]+)[ils]?|\d*\.\d+(?:e[+-]?\d+)?[dfr]?|#\s+(?:\d+[/-]\d+[/-]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:am|pm))?)?|\d+:\d+(?::\d+)?(\s*(?:am|pm))?)\s+#)/i],["pln",/^(?:(?:[a-z]|_\w)\w*|\[(?:[a-z]|_\w)\w*])/i],["pun",/^[^\w\t\n\r "'[\]\xa0\u2018\u2019\u201c\u201d\u2028\u2029]+/],["pun",/^(?:\[|])/]]),["vb","vbs"]);

+ 3 - 0
libraries/frameworks/io2012/js/prettify/lang-vhdl.js

@@ -0,0 +1,3 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r Â\xa0"]],[["str",/^(?:[box]?"(?:[^"]|"")*"|'.')/i],["com",/^--[^\n\r]*/],["kwd",/^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i,
+null],["typ",/^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i,null],["typ",/^'(?:active|ascending|base|delayed|driving|driving_value|event|high|image|instance_name|last_active|last_event|last_value|left|leftof|length|low|path_name|pos|pred|quiet|range|reverse_range|right|rightof|simple_name|stable|succ|transaction|val|value)(?=[^\w-]|$)/i,null],["lit",/^\d+(?:_\d+)*(?:#[\w.\\]+#(?:[+-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:e[+-]?\d+(?:_\d+)*)?)/i],
+["pln",/^(?:[a-z]\w*|\\[^\\]*\\)/i],["pun",/^[^\w\t\n\r "'\xa0][^\w\t\n\r "'\xa0-]*/]]),["vhdl","vhd"]);

+ 2 - 0
libraries/frameworks/io2012/js/prettify/lang-wiki.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\d\t a-gi-z\xa0]+/,null,"\t Â\xa0abcdefgijklmnopqrstuvwxyz0123456789"],["pun",/^[*=[\]^~]+/,null,"=*~^[]"]],[["lang-wiki.meta",/(?:^^|\r\n?|\n)(#[a-z]+)\b/],["lit",/^[A-Z][a-z][\da-z]+[A-Z][a-z][^\W_]+\b/],["lang-",/^{{{([\S\s]+?)}}}/],["lang-",/^`([^\n\r`]+)`/],["str",/^https?:\/\/[^\s#/?]*(?:\/[^\s#?]*)?(?:\?[^\s#]*)?(?:#\S*)?/i],["pln",/^(?:\r\n|[\S\s])[^\n\r#*=A-[^`h{~]*/]]),["wiki"]);
+PR.registerLangHandler(PR.createSimpleLexer([["kwd",/^#[a-z]+/i,null,"#"]],[]),["wiki.meta"]);

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
libraries/frameworks/io2012/js/prettify/lang-xq.js


+ 2 - 0
libraries/frameworks/io2012/js/prettify/lang-yaml.js

@@ -0,0 +1,2 @@
+var a=null;
+PR.registerLangHandler(PR.createSimpleLexer([["pun",/^[:>?|]+/,a,":|>?"],["dec",/^%(?:YAML|TAG)[^\n\r#]+/,a,"%"],["typ",/^&\S+/,a,"&"],["typ",/^!\S*/,a,"!"],["str",/^"(?:[^"\\]|\\.)*(?:"|$)/,a,'"'],["str",/^'(?:[^']|'')*(?:'|$)/,a,"'"],["com",/^#[^\n\r]*/,a,"#"],["pln",/^\s+/,a," \t\r\n"]],[["dec",/^(?:---|\.\.\.)(?:[\n\r]|$)/],["pun",/^-/],["kwd",/^\w+:[\n\r ]/],["pln",/^\w+/]]),["yaml","yml"]);

+ 1 - 0
libraries/frameworks/io2012/js/prettify/prettify.css

@@ -0,0 +1 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}

+ 28 - 0
libraries/frameworks/io2012/js/prettify/prettify.js

@@ -0,0 +1,28 @@
+var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
+[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
+f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
+(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
+{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
+t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
+"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
+l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
+q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
+q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
+"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
+a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
+for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
+m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
+a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
+j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
+H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
+J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
+I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
+["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
+/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
+["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
+hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
+!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
+250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
+PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();

+ 33 - 0
libraries/frameworks/io2012/js/require-1.0.8.min.js

@@ -0,0 +1,33 @@
+/*
+ RequireJS 1.0.8 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
+ Available via the MIT or new BSD license.
+ see: http://github.com/jrburke/requirejs for details
+*/
+var requirejs,require,define;
+(function(r){function K(a){return O.call(a)==="[object Function]"}function G(a){return O.call(a)==="[object Array]"}function $(a,c,l){for(var j in c)if(!(j in L)&&(!(j in a)||l))a[j]=c[j];return d}function P(a,c,d){a=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+a);if(d)a.originalError=d;return a}function aa(a,c,d){var j,k,t;for(j=0;t=c[j];j++){t=typeof t==="string"?{name:t}:t;k=t.location;if(d&&(!k||k.indexOf("/")!==0&&k.indexOf(":")===-1))k=d+"/"+(k||t.name);a[t.name]={name:t.name,location:k||
+t.name,main:(t.main||"main").replace(fa,"").replace(ba,"")}}}function V(a,c){a.holdReady?a.holdReady(c):c?a.readyWait+=1:a.ready(!0)}function ga(a){function c(b,f){var g,m;if(b&&b.charAt(0)===".")if(f){q.pkgs[f]?f=[f]:(f=f.split("/"),f=f.slice(0,f.length-1));g=b=f.concat(b.split("/"));var a;for(m=0;a=g[m];m++)if(a===".")g.splice(m,1),m-=1;else if(a==="..")if(m===1&&(g[2]===".."||g[0]===".."))break;else m>0&&(g.splice(m-1,2),m-=2);m=q.pkgs[g=b[0]];b=b.join("/");m&&b===g+"/"+m.main&&(b=g)}else b.indexOf("./")===
+0&&(b=b.substring(2));return b}function l(b,f){var g=b?b.indexOf("!"):-1,m=null,a=f?f.name:null,h=b,e,d;g!==-1&&(m=b.substring(0,g),b=b.substring(g+1,b.length));m&&(m=c(m,a));b&&(m?e=(g=n[m])&&g.normalize?g.normalize(b,function(b){return c(b,a)}):c(b,a):(e=c(b,a),d=G[e],d||(d=i.nameToUrl(b,null,f),G[e]=d)));return{prefix:m,name:e,parentMap:f,url:d,originalName:h,fullName:m?m+"!"+(e||""):e}}function j(){var b=!0,f=q.priorityWait,g,a;if(f){for(a=0;g=f[a];a++)if(!s[g]){b=!1;break}b&&delete q.priorityWait}return b}
+function k(b,f,g){return function(){var a=ha.call(arguments,0),c;if(g&&K(c=a[a.length-1]))c.__requireJsBuild=!0;a.push(f);return b.apply(null,a)}}function t(b,f,g){f=k(g||i.require,b,f);$(f,{nameToUrl:k(i.nameToUrl,b),toUrl:k(i.toUrl,b),defined:k(i.requireDefined,b),specified:k(i.requireSpecified,b),isBrowser:d.isBrowser});return f}function p(b){var f,g,a,c=b.callback,h=b.map,e=h.fullName,ca=b.deps;a=b.listeners;var j=q.requireExecCb||d.execCb;if(c&&K(c)){if(q.catchError.define)try{g=j(e,b.callback,
+ca,n[e])}catch(k){f=k}else g=j(e,b.callback,ca,n[e]);if(e)(c=b.cjsModule)&&c.exports!==r&&c.exports!==n[e]?g=n[e]=b.cjsModule.exports:g===r&&b.usingExports?g=n[e]:(n[e]=g,H[e]&&(T[e]=!0))}else e&&(g=n[e]=c,H[e]&&(T[e]=!0));if(x[b.id])delete x[b.id],b.isDone=!0,i.waitCount-=1,i.waitCount===0&&(J=[]);delete M[e];if(d.onResourceLoad&&!b.placeholder)d.onResourceLoad(i,h,b.depArray);if(f)return g=(e?l(e).url:"")||f.fileName||f.sourceURL,a=f.moduleTree,f=P("defineerror",'Error evaluating module "'+e+'" at location "'+
+g+'":\n'+f+"\nfileName:"+g+"\nlineNumber: "+(f.lineNumber||f.line),f),f.moduleName=e,f.moduleTree=a,d.onError(f);for(f=0;c=a[f];f++)c(g);return r}function u(b,f){return function(g){b.depDone[f]||(b.depDone[f]=!0,b.deps[f]=g,b.depCount-=1,b.depCount||p(b))}}function o(b,f){var g=f.map,a=g.fullName,c=g.name,h=N[b]||(N[b]=n[b]),e;if(!f.loading)f.loading=!0,e=function(b){f.callback=function(){return b};p(f);s[f.id]=!0;A()},e.fromText=function(b,f){var g=Q;s[b]=!1;i.scriptCount+=1;i.fake[b]=!0;g&&(Q=!1);
+d.exec(f);g&&(Q=!0);i.completeLoad(b)},a in n?e(n[a]):h.load(c,t(g.parentMap,!0,function(b,a){var c=[],e,m;for(e=0;m=b[e];e++)m=l(m,g.parentMap),b[e]=m.fullName,m.prefix||c.push(b[e]);f.moduleDeps=(f.moduleDeps||[]).concat(c);return i.require(b,a)}),e,q)}function y(b){x[b.id]||(x[b.id]=b,J.push(b),i.waitCount+=1)}function D(b){this.listeners.push(b)}function v(b,f){var g=b.fullName,a=b.prefix,c=a?N[a]||(N[a]=n[a]):null,h,e;g&&(h=M[g]);if(!h&&(e=!0,h={id:(a&&!c?O++ +"__p@:":"")+(g||"__r@"+O++),map:b,
+depCount:0,depDone:[],depCallbacks:[],deps:[],listeners:[],add:D},B[h.id]=!0,g&&(!a||N[a])))M[g]=h;a&&!c?(g=l(a),a in n&&!n[a]&&(delete n[a],delete R[g.url]),a=v(g,!0),a.add(function(){var f=l(b.originalName,b.parentMap),f=v(f,!0);h.placeholder=!0;f.add(function(b){h.callback=function(){return b};p(h)})})):e&&f&&(s[h.id]=!1,i.paused.push(h),y(h));return h}function C(b,f,a,c){var b=l(b,c),d=b.name,h=b.fullName,e=v(b),j=e.id,k=e.deps,o;if(h){if(h in n||s[j]===!0||h==="jquery"&&q.jQuery&&q.jQuery!==
+a().fn.jquery)return;B[j]=!0;s[j]=!0;h==="jquery"&&a&&W(a())}e.depArray=f;e.callback=a;for(a=0;a<f.length;a++)if(j=f[a])j=l(j,d?b:c),o=j.fullName,f[a]=o,o==="require"?k[a]=t(b):o==="exports"?(k[a]=n[h]={},e.usingExports=!0):o==="module"?e.cjsModule=k[a]={id:d,uri:d?i.nameToUrl(d,null,c):r,exports:n[h]}:o in n&&!(o in x)&&(!(h in H)||h in H&&T[o])?k[a]=n[o]:(h in H&&(H[o]=!0,delete n[o],R[j.url]=!1),e.depCount+=1,e.depCallbacks[a]=u(e,a),v(j,!0).add(e.depCallbacks[a]));e.depCount?y(e):p(e)}function w(b){C.apply(null,
+b)}function F(b,f){var a=b.map.fullName,c=b.depArray,d=!0,h,e,i,l;if(b.isDone||!a||!s[a])return l;if(f[a])return b;f[a]=!0;if(c){for(h=0;h<c.length;h++){e=c[h];if(!s[e]&&!ia[e]){d=!1;break}if((i=x[e])&&!i.isDone&&s[e])if(l=F(i,f))break}d||(l=r,delete f[a])}return l}function z(b,a){var g=b.map.fullName,c=b.depArray,d,h,e,i;if(b.isDone||!g||!s[g])return r;if(g){if(a[g])return n[g];a[g]=!0}if(c)for(d=0;d<c.length;d++)if(h=c[d])if((e=l(h).prefix)&&(i=x[e])&&z(i,a),(e=x[h])&&!e.isDone&&s[h])h=z(e,a),b.depCallbacks[d](h);
+return n[g]}function E(){var b=q.waitSeconds*1E3,b=b&&i.startTime+b<(new Date).getTime(),a="",c=!1,l=!1,k=[],h,e;if(i.pausedCount>0)return r;if(q.priorityWait)if(j())A();else return r;for(h in s)if(!(h in L)&&(c=!0,!s[h]))if(b)a+=h+" ";else if(l=!0,h.indexOf("!")===-1){k=[];break}else(e=M[h]&&M[h].moduleDeps)&&k.push.apply(k,e);if(!c&&!i.waitCount)return r;if(b&&a)return b=P("timeout","Load timeout for modules: "+a),b.requireType="timeout",b.requireModules=a,b.contextName=i.contextName,d.onError(b);
+if(l&&k.length)for(a=0;h=x[k[a]];a++)if(h=F(h,{})){z(h,{});break}if(!b&&(l||i.scriptCount)){if((I||da)&&!X)X=setTimeout(function(){X=0;E()},50);return r}if(i.waitCount){for(a=0;h=J[a];a++)z(h,{});i.paused.length&&A();Y<5&&(Y+=1,E())}Y=0;d.checkReadyState();return r}var i,A,q={waitSeconds:7,baseUrl:"./",paths:{},pkgs:{},catchError:{}},S=[],B={require:!0,exports:!0,module:!0},G={},n={},s={},x={},J=[],R={},O=0,M={},N={},H={},T={},Z=0;W=function(b){if(!i.jQuery&&(b=b||(typeof jQuery!=="undefined"?jQuery:
+null))&&!(q.jQuery&&b.fn.jquery!==q.jQuery)&&("holdReady"in b||"readyWait"in b))if(i.jQuery=b,w(["jquery",[],function(){return jQuery}]),i.scriptCount)V(b,!0),i.jQueryIncremented=!0};A=function(){var b,a,c,l,k,h;i.takeGlobalQueue();Z+=1;if(i.scriptCount<=0)i.scriptCount=0;for(;S.length;)if(b=S.shift(),b[0]===null)return d.onError(P("mismatch","Mismatched anonymous define() module: "+b[b.length-1]));else w(b);if(!q.priorityWait||j())for(;i.paused.length;){k=i.paused;i.pausedCount+=k.length;i.paused=
+[];for(l=0;b=k[l];l++)a=b.map,c=a.url,h=a.fullName,a.prefix?o(a.prefix,b):!R[c]&&!s[h]&&((q.requireLoad||d.load)(i,h,c),c.indexOf("empty:")!==0&&(R[c]=!0));i.startTime=(new Date).getTime();i.pausedCount-=k.length}Z===1&&E();Z-=1;return r};i={contextName:a,config:q,defQueue:S,waiting:x,waitCount:0,specified:B,loaded:s,urlMap:G,urlFetched:R,scriptCount:0,defined:n,paused:[],pausedCount:0,plugins:N,needFullExec:H,fake:{},fullExec:T,managerCallbacks:M,makeModuleMap:l,normalize:c,configure:function(b){var a,
+c,d;b.baseUrl&&b.baseUrl.charAt(b.baseUrl.length-1)!=="/"&&(b.baseUrl+="/");a=q.paths;d=q.pkgs;$(q,b,!0);if(b.paths){for(c in b.paths)c in L||(a[c]=b.paths[c]);q.paths=a}if((a=b.packagePaths)||b.packages){if(a)for(c in a)c in L||aa(d,a[c],c);b.packages&&aa(d,b.packages);q.pkgs=d}if(b.priority)c=i.requireWait,i.requireWait=!1,A(),i.require(b.priority),A(),i.requireWait=c,q.priorityWait=b.priority;if(b.deps||b.callback)i.require(b.deps||[],b.callback)},requireDefined:function(b,a){return l(b,a).fullName in
+n},requireSpecified:function(b,a){return l(b,a).fullName in B},require:function(b,c,g){if(typeof b==="string"){if(K(c))return d.onError(P("requireargs","Invalid require call"));if(d.get)return d.get(i,b,c);c=l(b,c);b=c.fullName;return!(b in n)?d.onError(P("notloaded","Module name '"+c.fullName+"' has not been loaded yet for context: "+a)):n[b]}(b&&b.length||c)&&C(null,b,c,g);if(!i.requireWait)for(;!i.scriptCount&&i.paused.length;)A();return i.require},takeGlobalQueue:function(){U.length&&(ja.apply(i.defQueue,
+[i.defQueue.length-1,0].concat(U)),U=[])},completeLoad:function(b){var a;for(i.takeGlobalQueue();S.length;)if(a=S.shift(),a[0]===null){a[0]=b;break}else if(a[0]===b)break;else w(a),a=null;a?w(a):w([b,[],b==="jquery"&&typeof jQuery!=="undefined"?function(){return jQuery}:null]);d.isAsync&&(i.scriptCount-=1);A();d.isAsync||(i.scriptCount-=1)},toUrl:function(b,a){var c=b.lastIndexOf("."),d=null;c!==-1&&(d=b.substring(c,b.length),b=b.substring(0,c));return i.nameToUrl(b,d,a)},nameToUrl:function(b,a,g){var l,
+k,h,e,j=i.config,b=c(b,g&&g.fullName);if(d.jsExtRegExp.test(b))a=b+(a?a:"");else{l=j.paths;k=j.pkgs;g=b.split("/");for(e=g.length;e>0;e--)if(h=g.slice(0,e).join("/"),l[h]){g.splice(0,e,l[h]);break}else if(h=k[h]){b=b===h.name?h.location+"/"+h.main:h.location;g.splice(0,e,b);break}a=g.join("/")+(a||".js");a=(a.charAt(0)==="/"||a.match(/^[\w\+\.\-]+:/)?"":j.baseUrl)+a}return j.urlArgs?a+((a.indexOf("?")===-1?"?":"&")+j.urlArgs):a}};i.jQueryCheck=W;i.resume=A;return i}function ka(){var a,c,d;if(C&&C.readyState===
+"interactive")return C;a=document.getElementsByTagName("script");for(c=a.length-1;c>-1&&(d=a[c]);c--)if(d.readyState==="interactive")return C=d;return null}var la=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,ma=/require\(\s*["']([^'"\s]+)["']\s*\)/g,fa=/^\.\//,ba=/\.js$/,O=Object.prototype.toString,u=Array.prototype,ha=u.slice,ja=u.splice,I=!!(typeof window!=="undefined"&&navigator&&document),da=!I&&typeof importScripts!=="undefined",na=I&&navigator.platform==="PLAYSTATION 3"?/^complete$/:/^(complete|loaded)$/,
+ea=typeof opera!=="undefined"&&opera.toString()==="[object Opera]",L={},D={},U=[],C=null,Y=0,Q=!1,ia={require:!0,module:!0,exports:!0},d,u={},J,y,v,E,o,w,F,B,z,W,X;if(typeof define==="undefined"){if(typeof requirejs!=="undefined")if(K(requirejs))return;else u=requirejs,requirejs=r;typeof require!=="undefined"&&!K(require)&&(u=require,require=r);d=requirejs=function(a,c,d){var j="_",k;!G(a)&&typeof a!=="string"&&(k=a,G(c)?(a=c,c=d):a=[]);if(k&&k.context)j=k.context;d=D[j]||(D[j]=ga(j));k&&d.configure(k);
+return d.require(a,c)};d.config=function(a){return d(a)};require||(require=d);d.toUrl=function(a){return D._.toUrl(a)};d.version="1.0.8";d.jsExtRegExp=/^\/|:|\?|\.js$/;y=d.s={contexts:D,skipAsync:{}};if(d.isAsync=d.isBrowser=I)if(v=y.head=document.getElementsByTagName("head")[0],E=document.getElementsByTagName("base")[0])v=y.head=E.parentNode;d.onError=function(a){throw a;};d.load=function(a,c,l){d.resourcesReady(!1);a.scriptCount+=1;d.attach(l,a,c);if(a.jQuery&&!a.jQueryIncremented)V(a.jQuery,!0),
+a.jQueryIncremented=!0};define=function(a,c,d){var j,k;typeof a!=="string"&&(d=c,c=a,a=null);G(c)||(d=c,c=[]);!c.length&&K(d)&&d.length&&(d.toString().replace(la,"").replace(ma,function(a,d){c.push(d)}),c=(d.length===1?["require"]:["require","exports","module"]).concat(c));if(Q&&(j=J||ka()))a||(a=j.getAttribute("data-requiremodule")),k=D[j.getAttribute("data-requirecontext")];(k?k.defQueue:U).push([a,c,d]);return r};define.amd={multiversion:!0,plugins:!0,jQuery:!0};d.exec=function(a){return eval(a)};
+d.execCb=function(a,c,d,j){return c.apply(j,d)};d.addScriptToDom=function(a){J=a;E?v.insertBefore(a,E):v.appendChild(a);J=null};d.onScriptLoad=function(a){var c=a.currentTarget||a.srcElement,l;if(a.type==="load"||c&&na.test(c.readyState))C=null,a=c.getAttribute("data-requirecontext"),l=c.getAttribute("data-requiremodule"),D[a].completeLoad(l),c.detachEvent&&!ea?c.detachEvent("onreadystatechange",d.onScriptLoad):c.removeEventListener("load",d.onScriptLoad,!1)};d.attach=function(a,c,l,j,k,o){var p;
+if(I)return j=j||d.onScriptLoad,p=c&&c.config&&c.config.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script"),p.type=k||c&&c.config.scriptType||"text/javascript",p.charset="utf-8",p.async=!y.skipAsync[a],c&&p.setAttribute("data-requirecontext",c.contextName),p.setAttribute("data-requiremodule",l),p.attachEvent&&!(p.attachEvent.toString&&p.attachEvent.toString().indexOf("[native code]")<0)&&!ea?(Q=!0,o?p.onreadystatechange=function(){if(p.readyState===
+"loaded")p.onreadystatechange=null,p.attachEvent("onreadystatechange",j),o(p)}:p.attachEvent("onreadystatechange",j)):p.addEventListener("load",j,!1),p.src=a,o||d.addScriptToDom(p),p;else da&&(importScripts(a),c.completeLoad(l));return null};if(I){o=document.getElementsByTagName("script");for(B=o.length-1;B>-1&&(w=o[B]);B--){if(!v)v=w.parentNode;if(F=w.getAttribute("data-main")){if(!u.baseUrl)o=F.split("/"),w=o.pop(),o=o.length?o.join("/")+"/":"./",u.baseUrl=o,F=w.replace(ba,"");u.deps=u.deps?u.deps.concat(F):
+[F];break}}}d.checkReadyState=function(){var a=y.contexts,c;for(c in a)if(!(c in L)&&a[c].waitCount)return;d.resourcesReady(!0)};d.resourcesReady=function(a){var c,l;d.resourcesDone=a;if(d.resourcesDone)for(l in a=y.contexts,a)if(!(l in L)&&(c=a[l],c.jQueryIncremented))V(c.jQuery,!1),c.jQueryIncremented=!1};d.pageLoaded=function(){if(document.readyState!=="complete")document.readyState="complete"};if(I&&document.addEventListener&&!document.readyState)document.readyState="loading",window.addEventListener("load",
+d.pageLoaded,!1);d(u);if(d.isAsync&&typeof setTimeout!=="undefined")z=y.contexts[u.context||"_"],z.requireWait=!0,setTimeout(function(){z.requireWait=!1;z.scriptCount||z.resume();d.checkReadyState()},0)}})();

+ 109 - 0
libraries/frameworks/io2012/js/slide-controller.js

@@ -0,0 +1,109 @@
+(function(window) {
+
+var ORIGIN_ = location.protocol + '//' + location.host;
+
+function SlideController() {
+  this.popup = null;
+  this.isPopup = window.opener;
+
+  if (this.setupDone()) {
+    window.addEventListener('message', this.onMessage_.bind(this), false);
+
+    // Close popups if we reload the main window.
+    window.addEventListener('beforeunload', function(e) {
+      if (this.popup) {
+        this.popup.close();
+      }
+    }.bind(this), false);
+  }
+}
+
+SlideController.PRESENTER_MODE_PARAM = 'presentme';
+
+SlideController.prototype.setupDone = function() {
+  var params = location.search.substring(1).split('&').map(function(el) {
+    return el.split('=');
+  });
+
+  var presentMe = null;
+  for (var i = 0, param; param = params[i]; ++i) {
+    if (param[0].toLowerCase() == SlideController.PRESENTER_MODE_PARAM) {
+      presentMe = param[1] == 'true';
+      break;
+    }
+  }
+
+  if (presentMe !== null) {
+    localStorage.ENABLE_PRESENTOR_MODE = presentMe;
+    // TODO: use window.history.pushState to update URL instead of the redirect.
+    if (window.history.replaceState) {
+      window.history.replaceState({}, '', location.pathname);
+    } else {
+      location.replace(location.pathname);
+      return false;
+    }
+  }
+
+  var enablePresenterMode = localStorage.getItem('ENABLE_PRESENTOR_MODE');
+  if (enablePresenterMode && JSON.parse(enablePresenterMode)) {
+    // Only open popup from main deck. Don't want recursive popup opening!
+    if (!this.isPopup) {
+      var opts = 'menubar=no,location=yes,resizable=yes,scrollbars=no,status=no';
+      this.popup = window.open(location.href, 'mywindow', opts);
+
+      // Loading in the popup? Trigger the hotkey for turning presenter mode on.
+      this.popup.addEventListener('load', function(e) {
+        var evt = this.popup.document.createEvent('Event');
+        evt.initEvent('keydown', true, true);
+        evt.keyCode = 'P'.charCodeAt(0);
+        this.popup.document.dispatchEvent(evt);
+        // this.popup.document.body.classList.add('with-notes');
+        // document.body.classList.add('popup');
+      }.bind(this), false);
+    }
+  }
+
+  return true;
+}
+
+SlideController.prototype.onMessage_ = function(e) {
+  var data = e.data;
+
+  // Restrict messages to being from this origin. Allow local developmet
+  // from file:// though.
+  // TODO: It would be dope if FF implemented location.origin!
+  if (e.origin != ORIGIN_ && ORIGIN_.indexOf('file://') != 0) {
+    alert('Someone tried to postMessage from an unknown origin');
+    return;
+  }
+
+  // if (e.source.location.hostname != 'localhost') {
+  //   alert('Someone tried to postMessage from an unknown origin');
+  //   return;
+  // }
+
+  if ('keyCode' in data) {
+    var evt = document.createEvent('Event');
+    evt.initEvent('keydown', true, true);
+    evt.keyCode = data.keyCode;
+    document.dispatchEvent(evt);
+  }
+};
+
+SlideController.prototype.sendMsg = function(msg) {
+  // // Send message to popup window.
+  // if (this.popup) {
+  //   this.popup.postMessage(msg, ORIGIN_);
+  // }
+
+  // Send message to main window.
+  if (this.isPopup) {
+    // TODO: It would be dope if FF implemented location.origin.
+    window.opener.postMessage(msg, '*');
+  }
+};
+
+window.SlideController = SlideController;
+
+})(window);
+

+ 853 - 0
libraries/frameworks/io2012/js/slide-deck.js

@@ -0,0 +1,853 @@
+/**
+ * @authors Luke Mahe
+ * @authors Eric Bidelman
+ * @fileoverview TODO
+ */
+document.cancelFullScreen = document.webkitCancelFullScreen ||
+                            document.mozCancelFullScreen;
+
+/**
+ * @constructor
+ */
+function SlideDeck(el) {
+  this.curSlide_ = 0;
+  this.prevSlide_ = 0;
+  this.config_ = null;
+  this.container = el || document.querySelector('slides');
+  this.slides = [];
+  this.controller = null;
+  this.timings = [{slide: 1, time: new Date().getTime()}];
+
+  this.getCurrentSlideFromHash_();
+
+  // Call this explicitly. Modernizr.load won't be done until after DOM load.
+  this.onDomLoaded_.bind(this)();
+  
+  // Trigger links from Table of Contents to Slides.
+  this.showContents();
+}
+
+/**
+ * @const
+ * @private
+ */
+SlideDeck.prototype.SLIDE_CLASSES_ = [
+  'far-past', 'past', 'current', 'next', 'far-next'];
+
+/**
+ * @const
+ * @private
+ */
+SlideDeck.prototype.CSS_DIR_ = 'theme/css/';
+
+/**
+ * @private
+ */
+SlideDeck.prototype.getCurrentSlideFromHash_ = function() {
+  var slideNo = parseInt(document.location.hash.substr(1));
+
+  if (slideNo) {
+    this.curSlide_ = slideNo - 1;
+  } else {
+    this.curSlide_ = 0;
+  }
+};
+
+/**
+ * @param {number} slideNo
+ */
+SlideDeck.prototype.loadSlide = function(slideNo) {
+  if (slideNo) {
+    this.curSlide_ = slideNo - 1;
+    this.updateSlides_();
+  }
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.onDomLoaded_ = function(e) {
+  document.body.classList.add('loaded'); // Add loaded class for templates to use.
+
+  this.slides = this.container.querySelectorAll('slide:not([hidden]):not(.backdrop)');
+
+  // If we're on a smartphone, apply special sauce.
+  if (Modernizr.mq('only screen and (max-device-width: 480px)')) {
+    // var style = document.createElement('link');
+    // style.rel = 'stylesheet';
+    // style.type = 'text/css';
+    // style.href = this.CSS_DIR_ + 'phone.css';
+    // document.querySelector('head').appendChild(style);
+
+    // No need for widescreen layout on a phone.
+    this.container.classList.remove('layout-widescreen');
+  }
+
+  this.loadConfig_(SLIDE_CONFIG);
+  this.addEventListeners_();
+  this.updateSlides_();
+
+  // Add slide numbers and total slide count metadata to each slide.
+  var that = this;
+  for (var i = 0, slide; slide = this.slides[i]; ++i) {
+    slide.dataset.slideNum = i + 1;
+    slide.dataset.totalSlides = this.slides.length;
+
+    slide.addEventListener('click', function(e) {
+      if (document.body.classList.contains('overview')) {
+        that.loadSlide(this.dataset.slideNum);
+        e.preventDefault();
+        window.setTimeout(function() {
+          that.toggleOverview();
+        }, 500);
+      }
+    }, false);
+  }
+
+  // Note: this needs to come after addEventListeners_(), which adds a
+  // 'keydown' listener that this controller relies on.
+  // Also, no need to set this up if we're on mobile.
+  if (!Modernizr.touch) {
+    this.controller = new SlideController(this);
+    if (this.controller.isPopup) {
+      document.body.classList.add('popup');
+    }
+  }
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.addEventListeners_ = function() {
+  document.addEventListener('keydown', this.onBodyKeyDown_.bind(this), false);
+  window.addEventListener('popstate', this.onPopState_.bind(this), false);
+
+  // var transEndEventNames = {
+  //   'WebkitTransition': 'webkitTransitionEnd',
+  //   'MozTransition': 'transitionend',
+  //   'OTransition': 'oTransitionEnd',
+  //   'msTransition': 'MSTransitionEnd',
+  //   'transition': 'transitionend'
+  // };
+  // 
+  // // Find the correct transitionEnd vendor prefix.
+  // window.transEndEventName = transEndEventNames[
+  //     Modernizr.prefixed('transition')];
+  // 
+  // // When slides are done transitioning, kickoff loading iframes.
+  // // Note: we're only looking at a single transition (on the slide). This
+  // // doesn't include autobuilds the slides may have. Also, if the slide
+  // // transitions on multiple properties (e.g. not just 'all'), this doesn't
+  // // handle that case.
+  // this.container.addEventListener(transEndEventName, function(e) {
+  //     this.enableSlideFrames_(this.curSlide_);
+  // }.bind(this), false);
+
+  // document.addEventListener('slideenter', function(e) {
+  //   var slide = e.target;
+  //   window.setTimeout(function() {
+  //     this.enableSlideFrames_(e.slideNumber);
+  //     this.enableSlideFrames_(e.slideNumber + 1);
+  //   }.bind(this), 300);
+  // }.bind(this), false);
+};
+
+/**
+ * @private
+ * @param {Event} e The pop event.
+ */
+SlideDeck.prototype.onPopState_ = function(e) {
+  if (e.state != null) {
+    this.curSlide_ = e.state;
+    this.updateSlides_(true);
+  }
+};
+
+/**
+ * @param {Event} e
+ */
+SlideDeck.prototype.onBodyKeyDown_ = function(e) {
+  if (/^(input|textarea)$/i.test(e.target.nodeName) ||
+      e.target.isContentEditable) {
+    return;
+  }
+
+  // Forward keydowns to the main slides if we're the popup.
+  if (this.controller && this.controller.isPopup) {
+    this.controller.sendMsg({keyCode: e.keyCode});
+  }
+
+  switch (e.keyCode) {
+    case 13: // Enter
+      if (document.body.classList.contains('overview')) {
+        this.toggleOverview();
+      }
+      break;
+
+    case 39: // right arrow
+    case 32: // space
+    case 34: // PgDn
+      this.nextSlide();
+      this.recordTimings(false);
+      e.preventDefault();
+      break;
+      
+    case 76: //l
+      this.recordTimings(true);
+      e.preventDefault();
+      break;
+
+    case 37: // left arrow
+    case 8: // Backspace
+    case 33: // PgUp
+      this.prevSlide();
+      e.preventDefault();
+      break;
+
+    case 40: // down arrow
+      this.nextSlide();
+      e.preventDefault();
+      break;
+
+    case 38: // up arrow
+      this.prevSlide();
+      e.preventDefault();
+      break;
+      
+    // inserted to work with popcorn.js 
+    case 71: // G: Go to slide
+      var slideNumber = prompt('Go to slide: ');
+      if (slideNumber != null) {
+        this.gotoSlide(parseInt(slideNumber) - 1);
+      }
+    break;
+    
+    // inserted to display table of contents
+    case 84: // T: Toggle Table of Contents
+       $("#io2012-ptoc").toggle();
+       // $("div#io2012-toc li.dropdown").toggleClass("open");
+       // document.body.classList.toggle('show-comments')
+    break;
+
+    case 72: // H: Toggle code highlighting
+      document.body.classList.toggle('highlight-code');
+      break;
+
+    case 79: // O: Toggle overview
+      this.toggleOverview();
+      break;
+
+    case 80: // P
+      if (this.controller && this.controller.isPopup) {
+        document.body.classList.toggle('with-notes');
+      } else if (this.controller && !this.controller.popup) {
+        document.body.classList.toggle('with-notes');
+      }
+      break;
+
+    case 82: // R
+      // TODO: implement refresh on main slides when popup is refreshed.
+      break;
+
+    case 27: // ESC: Hide notes and highlighting
+      document.body.classList.remove('with-notes');
+      document.body.classList.remove('highlight-code');
+
+      if (document.body.classList.contains('overview')) {
+        this.toggleOverview();
+      }
+      break;
+
+    case 70: // F: Toggle fullscreen
+       // Only respect 'f' on body. Don't want to capture keys from an <input>.
+       // Also, ignore browser's fullscreen shortcut (cmd+shift+f) so we don't
+       // get trapped in fullscreen!
+      if (e.target == document.body && !(e.shiftKey && e.metaKey)) {
+        if (document.mozFullScreen !== undefined && !document.mozFullScreen) {
+          document.body.mozRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
+        } else if (document.webkitIsFullScreen !== undefined && !document.webkitIsFullScreen) {
+          document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
+        } else {
+          document.cancelFullScreen();
+        }
+      }
+      break;
+
+    case 87: // W: Toggle widescreen
+      // Only respect 'w' on body. Don't want to capture keys from an <input>.
+      if (e.target == document.body && !(e.shiftKey && e.metaKey)) {
+        this.container.classList.toggle('layout-widescreen');
+      }
+      break;
+  }
+};
+
+/**
+ *
+ */
+SlideDeck.prototype.focusOverview_ = function() {
+  var overview = document.body.classList.contains('overview');
+
+  for (var i = 0, slide; slide = this.slides[i]; i++) {
+    slide.style[Modernizr.prefixed('transform')] = overview ?
+        'translateZ(-2500px) translate(' + (( i - this.curSlide_ ) * 105) +
+                                       '%, 0%)' : '';
+  }
+};
+
+/**
+ */
+SlideDeck.prototype.toggleOverview = function() {
+  document.body.classList.toggle('overview');
+
+  this.focusOverview_();
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.loadConfig_ = function(config) {
+  if (!config) {
+    return;
+  }
+
+  this.config_ = config;
+
+  var settings = this.config_.settings;
+
+  this.loadTheme_(settings.theme || []);
+
+  /*
+  if (settings.favIcon) {
+    this.addFavIcon_(settings.favIcon);
+  }
+  */
+
+  // Prettyprint. Default to on.
+  if (!!!('usePrettify' in settings) || settings.usePrettify) {
+    prettyPrint();
+  }
+
+  if (settings.analytics) {
+    this.loadAnalytics_();
+  }
+
+  if (settings.fonts) {
+    this.addFonts_(settings.fonts);
+  }
+
+  // Builds. Default to on.
+  if (!!!('useBuilds' in settings) || settings.useBuilds) {
+    this.makeBuildLists_();
+  }
+
+  if (settings.title) {
+    document.title = settings.title.replace(/<br\/?>/, ' ') + ' - Google IO 2012';
+    document.querySelector('[data-config-title]').innerHTML = settings.title;
+  }
+
+  if (settings.subtitle) {
+    document.querySelector('[data-config-subtitle]').innerHTML = settings.subtitle;
+  }
+
+  if (this.config_.presenters) {
+    var presenters = this.config_.presenters;
+    var dataConfigContact = document.querySelector('[data-config-contact]');
+
+    var html = [];
+    if (presenters.length == 1) {
+      var p = presenters[0];
+
+      html = [p.name, p.company].join('<br>');
+
+      var gplus = p.gplus ? '<span>g+</span><a href="' + p.gplus +
+          '">' + p.gplus.replace(/https?:\/\//, '') + '</a>' : '';
+
+      var twitter = p.twitter ? '<span>twitter</span>' +
+          '<a href="http://twitter.com/' + p.twitter + '">' +
+          p.twitter + '</a>' : '';
+
+      var www = p.www ? '<span>www</span><a href="' + p.www +
+                        '">' + p.www.replace(/https?:\/\//, '') + '</a>' : '';
+
+      var github = p.github ? '<span>github</span><a href="' + p.github +
+          '">' + p.github.replace(/https?:\/\//, '') + '</a>' : '';
+
+      var html2 = [gplus, twitter, www, github].join('<br>');
+
+      if (dataConfigContact) {
+        dataConfigContact.innerHTML = html2;
+      }
+    } else {
+      for (var i = 0, p; p = presenters[i]; ++i) {
+        html.push(p.name + ' - ' + p.company);
+      }
+      html = html.join('<br>');
+      if (dataConfigContact) {
+        dataConfigContact.innerHTML = html;
+      }
+    }
+
+    var dataConfigPresenter = document.querySelector('[data-config-presenter]');
+    if (dataConfigPresenter) {
+      document.querySelector('[data-config-presenter]').innerHTML = html;
+    }
+  }
+
+  /* Left/Right tap areas. Default to including. */
+  if (!!!('enableSlideAreas' in settings) || settings.enableSlideAreas) {
+    var el = document.createElement('div');
+    el.classList.add('slide-area');
+    el.id = 'prev-slide-area';
+    el.addEventListener('click', this.prevSlide.bind(this), false);
+    this.container.appendChild(el);
+
+    var el = document.createElement('div');
+    el.classList.add('slide-area');
+    el.id = 'next-slide-area';
+    el.addEventListener('click', this.nextSlide.bind(this), false);
+    this.container.appendChild(el);
+  }
+
+  if (Modernizr.touch && (!!!('enableTouch' in settings) ||
+      settings.enableTouch)) {
+    var self = this;
+
+    // Note: this prevents mobile zoom in/out but prevents iOS from doing
+    // it's crazy scroll over effect and disaligning the slides.
+    window.addEventListener('touchstart', function(e) {
+      e.preventDefault();
+    }, false);
+
+    var hammer = new Hammer(this.container);
+    hammer.ondragend = function(e) {
+      if (e.direction == 'right' || e.direction == 'down') {
+        self.prevSlide();
+      } else if (e.direction == 'left' || e.direction == 'up') {
+        self.nextSlide();
+      }
+    };
+  }
+};
+
+/**
+ * @private
+ * @param {Array.<string>} fonts
+ */
+SlideDeck.prototype.addFonts_ = function(fonts) {
+  var el = document.createElement('link');
+  el.rel = 'stylesheet';
+  el.href = ('https:' == document.location.protocol ? 'https' : 'http') +
+      '://fonts.googleapis.com/css?family=' + fonts.join('|') + '&v2';
+  document.querySelector('head').appendChild(el);
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.buildNextItem_ = function() {
+  var slide = this.slides[this.curSlide_];
+  var toBuild = slide.querySelector('.to-build');
+  var built = slide.querySelector('.build-current');
+
+  if (built) {
+    built.classList.remove('build-current');
+    if (built.classList.contains('fade')) {
+      built.classList.add('build-fade');
+    }
+  }
+
+  if (!toBuild) {
+    var items = slide.querySelectorAll('.build-fade');
+    for (var j = 0, item; item = items[j]; j++) {
+      item.classList.remove('build-fade');
+    }
+    return false;
+  }
+
+  toBuild.classList.remove('to-build');
+  toBuild.classList.add('build-current');
+
+  return true;
+};
+
+/**
+ * @param {boolean=} opt_dontPush
+ */
+SlideDeck.prototype.prevSlide = function(opt_dontPush) {
+  if (this.curSlide_ > 0) {
+    var bodyClassList = document.body.classList;
+    bodyClassList.remove('highlight-code');
+
+    // Toggle off speaker notes if they're showing when we move backwards on the
+    // main slides. If we're the speaker notes popup, leave them up.
+    if (this.controller && !this.controller.isPopup) {
+      bodyClassList.remove('with-notes');
+    } else if (!this.controller) {
+      bodyClassList.remove('with-notes');
+    }
+
+    this.prevSlide_ = this.curSlide_--;
+
+    this.updateSlides_(opt_dontPush);
+  }
+};
+
+/**
+ * @param {boolean=} opt_dontPush
+ */
+SlideDeck.prototype.nextSlide = function(opt_dontPush) {
+  if (!document.body.classList.contains('overview') && this.buildNextItem_()) {
+    return;
+  }
+
+  if (this.curSlide_ < this.slides.length - 1) {
+    var bodyClassList = document.body.classList;
+    bodyClassList.remove('highlight-code');
+
+    // Toggle off speaker notes if they're showing when we advanced on the main
+    // slides. If we're the speaker notes popup, leave them up.
+    if (this.controller && !this.controller.isPopup) {
+      bodyClassList.remove('with-notes');
+    } else if (!this.controller) {
+      bodyClassList.remove('with-notes');
+    }
+
+    this.prevSlide_ = this.curSlide_++;
+
+    this.updateSlides_(opt_dontPush);
+  }
+};
+
+
+/* Slide events */
+
+/**
+ * Triggered when a slide enter/leave event should be dispatched.
+ *
+ * @param {string} type The type of event to trigger
+ *     (e.g. 'slideenter', 'slideleave').
+ * @param {number} slideNo The index of the slide that is being left.
+ */
+SlideDeck.prototype.triggerSlideEvent = function(type, slideNo) {
+  var el = this.getSlideEl_(slideNo);
+  if (!el) {
+    return;
+  }
+
+  // Call onslideenter/onslideleave if the attribute is defined on this slide.
+  var func = el.getAttribute(type);
+  if (func) {
+    new Function(func).call(el); // TODO: Don't use new Function() :(
+  }
+
+  // Dispatch event to listeners setup using addEventListener.
+  var evt = document.createEvent('Event');
+  evt.initEvent(type, true, true);
+  evt.slideNumber = slideNo + 1; // Make it readable
+  evt.slide = el;
+
+  el.dispatchEvent(evt);
+};
+
+
+// Inserted to work with popcorn.js 
+SlideDeck.prototype.gotoSlide = function(curSlide) {
+  if (curSlide < 0) {
+    curSlide = 0;
+  }
+  if (curSlide >= this.slides.length) {
+    curSlide = this.slides.length - 1;
+  }
+  this.curSlide_ = curSlide;
+  this.prevSlide_ = curSlide - 1;
+  this.updateSlides_();
+};
+
+// Record event timings to synchronize with popcorn.js
+// TODO: Make it more general so that events of different types can be captured.
+// For example, it would be useful to capture when p is pressed so that it can
+// be simulated while syncing with the video.
+SlideDeck.prototype.recordTimings = function(pause){
+  var temp = {
+    "time": new Date().getTime() - this.timings[0].time,
+    "slide": this.curSlide_ + 1
+  };
+  if (pause === true){
+    temp.action = 'pause'
+  } else if (temp.slide === this.timings[this.timings.length - 1].slide){
+    temp.action = "nextSlide"
+  } else {
+    temp.action = "gotoSlide"
+  };
+  this.timings.push(temp);
+  console.log(JSON.stringify(this.timings));
+};
+
+SlideDeck.prototype.showContents = function(){
+  var self = this;
+  $('ul.dropdown-menu li a').live('click', function(){
+    var i = $(this).data('slide');
+    self.gotoSlide(i+1);
+  });
+};
+
+SlideDeck.prototype.highlightCurSlide = function(){
+  self = this;
+  var _i = this.curSlide_ - 2;
+  $('ul.dropdown-menu li').removeClass('current');
+  $('ul.dropdown-menu li:eq(' + _i + ')').addClass('current'); 
+  $('div.pagination li').removeClass('active');
+  $('div.pagination li:eq(' + _i + ')').addClass('active'); 
+  $('div.pagination li a').live('click', function(){
+    var i = $(this).data('slide');
+    self.gotoSlide(i + 1); 
+  });
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.updateSlides_ = function(opt_dontPush) {
+  var dontPush = opt_dontPush || false;
+
+  var curSlide = this.curSlide_;
+  for (var i = 0; i < this.slides.length; ++i) {
+    switch (i) {
+      case curSlide - 2:
+        this.updateSlideClass_(i, 'far-past');
+        break;
+      case curSlide - 1:
+        this.updateSlideClass_(i, 'past');
+        break;
+      case curSlide:
+        this.updateSlideClass_(i, 'current');
+        break;
+      case curSlide + 1:
+        this.updateSlideClass_(i, 'next');
+        break;
+      case curSlide + 2:
+        this.updateSlideClass_(i, 'far-next');
+        break;
+      default:
+        this.updateSlideClass_(i);
+        break;
+    }
+  };
+
+  this.triggerSlideEvent('slideleave', this.prevSlide_);
+  this.triggerSlideEvent('slideenter', curSlide);
+
+// window.setTimeout(this.disableSlideFrames_.bind(this, curSlide - 2), 301);
+// 
+// this.enableSlideFrames_(curSlide - 1); // Previous slide.
+// this.enableSlideFrames_(curSlide + 1); // Current slide.
+// this.enableSlideFrames_(curSlide + 2); // Next slide.
+
+   // Enable current slide's iframes (needed for page loat at current slide).
+   this.enableSlideFrames_(curSlide + 1);
+
+   // No way to tell when all slide transitions + auto builds are done.
+   // Give ourselves a good buffer to preload the next slide's iframes.
+   window.setTimeout(this.enableSlideFrames_.bind(this, curSlide + 2), 1000);
+
+  this.updateHash_(dontPush);
+
+  if (document.body.classList.contains('overview')) {
+    this.focusOverview_();
+    return;
+  }
+  
+  // highlight current slide in table of contents
+  this.highlightCurSlide();
+};
+
+/**
+ * @private
+ * @param {number} slideNo
+ */
+SlideDeck.prototype.enableSlideFrames_ = function(slideNo) {
+  var el = this.slides[slideNo - 1];
+  if (!el) {
+    return;
+  }
+
+  var frames = el.querySelectorAll('iframe');
+  for (var i = 0, frame; frame = frames[i]; i++) {
+    this.enableFrame_(frame);
+  }
+};
+
+/**
+ * @private
+ * @param {number} slideNo
+ */
+SlideDeck.prototype.enableFrame_ = function(frame) {
+  var src = frame.dataset.src;
+  if (src && frame.src != src) {
+    frame.src = src;
+  }
+};
+
+/**
+ * @private
+ * @param {number} slideNo
+ */
+SlideDeck.prototype.disableSlideFrames_ = function(slideNo) {
+  var el = this.slides[slideNo - 1];
+  if (!el) {
+    return;
+  }
+
+  var frames = el.querySelectorAll('iframe');
+  for (var i = 0, frame; frame = frames[i]; i++) {
+    this.disableFrame_(frame);
+  }
+};
+
+/**
+ * @private
+ * @param {Node} frame
+ */
+SlideDeck.prototype.disableFrame_ = function(frame) {
+  frame.src = 'about:blank';
+};
+
+/**
+ * @private
+ * @param {number} slideNo
+ */
+SlideDeck.prototype.getSlideEl_ = function(no) {
+  if ((no < 0) || (no >= this.slides.length)) {
+    return null;
+  } else {
+    return this.slides[no];
+  }
+};
+
+/**
+ * @private
+ * @param {number} slideNo
+ * @param {string} className
+ */
+SlideDeck.prototype.updateSlideClass_ = function(slideNo, className) {
+  var el = this.getSlideEl_(slideNo);
+
+  if (!el) {
+    return;
+  }
+
+  if (className) {
+    el.classList.add(className);
+  }
+
+  for (var i = 0, slideClass; slideClass = this.SLIDE_CLASSES_[i]; ++i) {
+    if (className != slideClass) {
+      el.classList.remove(slideClass);
+    }
+  }
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.makeBuildLists_ = function () {
+  for (var i = this.curSlide_, slide; slide = this.slides[i]; ++i) {
+    var items = slide.querySelectorAll('.build > *');
+    for (var j = 0, item; item = items[j]; ++j) {
+      if (item.classList) {
+        item.classList.add('to-build');
+        if (item.parentNode.classList.contains('fade')) {
+          item.classList.add('fade');
+        }
+      }
+    }
+  }
+};
+
+/**
+ * @private
+ * @param {boolean} dontPush
+ */
+SlideDeck.prototype.updateHash_ = function(dontPush) {
+  if (!dontPush) {
+    var slideNo = this.curSlide_ + 1;
+    var hash = '#' + slideNo;
+    if (window.history.pushState) {
+      window.history.pushState(this.curSlide_, 'Slide ' + slideNo, hash);
+    } else {
+      window.location.replace(hash);
+    }
+
+    // Record GA hit on this slide.
+    window['_gaq'] && window['_gaq'].push(['_trackPageview',
+                                          document.location.href]);
+  }
+};
+
+
+/**
+ * @private
+ * @param {string} favIcon
+ */
+SlideDeck.prototype.addFavIcon_ = function(favIcon) {
+  var el = document.createElement('link');
+  el.rel = 'icon';
+  el.type = 'image/png';
+  el.href = favIcon;
+  document.querySelector('head').appendChild(el);
+};
+
+/**
+ * @private
+ * @param {string} theme
+ */
+SlideDeck.prototype.loadTheme_ = function(theme) {
+  var styles = [];
+  if (theme.constructor.name === 'String') {
+    styles.push(theme);
+  } else {
+    styles = theme;
+  }
+
+  for (var i = 0, style; themeUrl = styles[i]; i++) {
+    var style = document.createElement('link');
+    style.rel = 'stylesheet';
+    style.type = 'text/css';
+    if (themeUrl.indexOf('http') == -1) {
+      style.href = this.CSS_DIR_ + themeUrl + '.css';
+    } else {
+      style.href = themeUrl;
+    }
+    document.querySelector('head').appendChild(style);
+  }
+};
+
+/**
+ * @private
+ */
+SlideDeck.prototype.loadAnalytics_ = function() {
+  var _gaq = window['_gaq'] || [];
+  _gaq.push(['_setAccount', this.config_.settings.analytics]);
+  _gaq.push(['_trackPageview']);
+
+  (function() {
+    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+  })();
+};
+
+
+// Polyfill missing APIs (if we need to), then create the slide deck.
+// iOS < 5 needs classList, dataset, and window.matchMedia. Modernizr contains
+// the last one.
+(function() {
+  Modernizr.load({
+    test: !!document.body.classList && !!document.body.dataset,
+    nope: ['js/polyfills/classList.min.js', 'js/polyfills/dataset.min.js'],
+    complete: function() {
+      window.slidedeck = new SlideDeck();
+    }
+  });
+})();

+ 16 - 0
libraries/frameworks/io2012/js/slide_config.js

@@ -0,0 +1,16 @@
+var SLIDE_CONFIG = {
+  // Slide settings
+  settings: {
+    useBuilds: true, // Default: true. False will turn off slide animation builds.
+    usePrettify: false, // Default: true
+    enableSlideAreas: false, // Default: true. False turns off the click areas on either slide of the slides.
+    enableTouch: true, // Default: true. If touch support should enabled. Note: the device must support touch.
+    //analytics: 'UA-XXXXXXXX-1', // TODO: Using this breaks GA for some reason (probably requirejs). Update your tracking code in template.html instead.
+    favIcon: false,
+    fonts: [
+      'Open Sans:regular,semibold,italic,italicsemibold',
+      'Inconsolata'
+    ],
+    //theme: ['mytheme'], // Add your own custom themes or styles in /theme/css. Leave off the .css extension.
+  },
+};

+ 3 - 0
libraries/frameworks/io2012/js/slides.js

@@ -0,0 +1,3 @@
+require(['order!slide_config','order!modernizr.custom.45394', 'order!hammer', 
+  'order!slide-controller', 'order!slide-deck'], function(someModule) {
+});

+ 41 - 0
libraries/frameworks/io2012/layouts/default.html

@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+<head>
+  {{> head }}
+  {{{ page.assets.css }}}
+  
+  <!-- Grab CDN jQuery, fall back to local if offline -->
+  <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.min.js"></script>
+  <script>window.jQuery || document.write('<script src="{{page.url.lib}}/widgets/quiz/js/jquery.js"><\/script>')</script> 
+  <script data-main="{{page.url.framework}}/js/slides" 
+    src="{{page.url.framework}}/js/require-1.0.8.min.js">
+  </script>
+  
+  {{{ page.assets.jshead }}}
+
+</head>
+<body style="opacity: 0">
+  <slides class="layout-widescreen">
+    
+    {{> logoslide }}
+
+    {{> titleslide }}
+    
+
+    <!-- SLIDES -->
+    {{{ page.content }}}
+    <slide class="backdrop"></slide>
+  </slides>
+  {{> pagination }}
+
+  <!--[if IE]>
+    <script 
+      src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js">  
+    </script>
+    <script>CFInstall.check({mode: 'overlay'});</script>
+  <![endif]-->
+</body>
+  <!-- Load Javascripts for Widgets -->
+  {{{ page.assets.js }}}
+  {{> javascripts }}
+</html>

+ 19 - 0
libraries/frameworks/io2012/layouts/slide.html

@@ -0,0 +1,19 @@
+<slide class="{{ slide.class }}" id="{{ slide.id }}" style="background:{{{ slide.bg }}};">
+  {{# slide.header }}
+  <hgroup>
+    {{{ slide.header}}}
+  </hgroup>
+  {{/ slide.header }}
+  <article data-timings="{{ slide.dt }}">
+    {{{ slide.content }}}
+  </article>
+  <!-- Presenter Notes -->
+  {{# slide.pnotes }}
+  <aside class="note" id="{{ id }}">
+    <section>
+      {{{ html }}}
+    </section>
+  </aside>
+  {{/ slide.pnotes }}
+</slide>
+

+ 10 - 0
libraries/frameworks/io2012/layouts/twocol.html

@@ -0,0 +1,10 @@
+---
+layout: slide
+---
+{{{ slide.content }}}
+<div style='float:left;width:48%;' class='centered'>
+  {{{ slide.left.html }}}
+</div>
+<div style='float:right;width:48%;'>
+  {{{ slide.right.html }}}
+</div>

+ 16 - 0
libraries/frameworks/io2012/layouts/vcenter.html

@@ -0,0 +1,16 @@
+<slide class="{{ slide.class }}" id="{{ slide.id }}">
+<hgroup>
+  {{{ slide.header}}}
+</hgroup>
+<article class = 'flexbox vcenter'>
+{{{ slide.content }}}
+</article>
+<!-- Presenter Notes -->
+{{# slide.pnotes}}
+<aside class="note">
+  <section>
+    {{{ html }}}
+  </section>
+</aside>
+{{/ slide.pnotes}}
+</slide>

+ 13 - 0
libraries/frameworks/io2012/partials/head.html

@@ -0,0 +1,13 @@
+<title>{{ page.title }}</title>
+<meta charset="utf-8">
+<meta name="description" content="{{ page.title }}">
+<meta name="author" content="{{ page.author }}">
+<meta name="generator" content="slidify" />
+<meta name="apple-mobile-web-app-capable" content="yes">
+<meta http-equiv="X-UA-Compatible" content="chrome=1">
+<link rel="stylesheet" href="{{page.url.framework}}/css/default.css" media="all" >
+<link rel="stylesheet" href="{{page.url.framework}}/css/phone.css" 
+  media="only screen and (max-device-width: 480px)" >
+<link rel="stylesheet" href="{{page.url.framework}}/css/slidify.css" >
+<link rel="stylesheet" href="{{page.url.highlighter}}/css/{{page.hitheme}}.css" />
+<base target="_blank"> <!-- This amazingness opens all links in a new tab. -->

+ 10 - 0
libraries/frameworks/io2012/partials/logoslide.html

@@ -0,0 +1,10 @@
+<!-- LOGO SLIDE -->
+{{# page.biglogo }}
+  <slide class="nobackground">
+    <article class="flexbox vcenter">
+      <span>
+        <img width='300px' src="{{ page.url.assets }}/img/{{ page.biglogo }}">
+      </span>
+    </article>
+  </slide>
+{{/ page.biglogo }}

+ 12 - 0
libraries/frameworks/io2012/partials/pagination.html

@@ -0,0 +1,12 @@
+<div class="pagination pagination-small" id='io2012-ptoc' style="display:none;">
+  <ul>
+    {{# page.slides }}
+    <li>
+      <a href="#" target="_self" rel='tooltip' 
+        data-slide={{ num }} title='{{{ title }}}'>
+         {{ num }}
+      </a>
+    </li>
+    {{/ page.slides }}
+  </ul>
+</div>

+ 25 - 0
libraries/frameworks/io2012/partials/titleslide.html

@@ -0,0 +1,25 @@
+<slide class="title-slide segue nobackground">
+  {{# page.logo }}
+  <aside class="gdbar">
+    <img src="{{page.url.assets}}/img/{{{ page.logo }}}">
+  </aside>
+  {{/ page.logo }}
+  <hgroup class="auto-fadein">
+    <h1>{{ page.title }}</h1>
+    <h2>{{ page.subtitle }}</h2>
+    <p>{{ page.author }}<br/>{{ page.job }}</p>
+  </hgroup>
+  {{# page.github }}
+    <a href="https://github.com/{{user}}/{{repo}}/zipball/gh-pages" class="example">
+     Download
+    </a>
+  {{/ page.github }}
+  <article></article>  
+  {{# page.license }}    
+  <footer class = 'license'>
+    <a href='http://creativecommons.org/licenses/{{{ page.license }}}/3.0/'>
+    <img width = '80px' src = 'http://mirrors.creativecommons.org/presskit/buttons/88x31/png/{{{ page.license }}}.png'>
+    </a>
+  </footer>
+  {{/ page.license }}
+</slide>

+ 15 - 0
libraries/frameworks/io2012/partials/toc.html

@@ -0,0 +1,15 @@
+<div id='io2012-toc' style='display:none;'>
+  <ul class='nav nav-pills'>
+    <li class="dropdown active" id="menu1">
+      <a class="dropdown-toggle" data-toggle="dropdown" href="#menu1">
+        <b>Contents</b>
+        <b class="caret"></b>
+      </a>
+      <ul class="dropdown-menu">
+        {{# page.slides }}
+        <li><a href="#" target="_self" data-slide={{num}}>{{num}}. {{title}}</a></li>
+        {{/ page.slides }}
+      </ul>
+    </li>
+  </ul>
+</div>

+ 31 - 0
libraries/frameworks/shower/Contributing.md

@@ -0,0 +1,31 @@
+# Contributing to Shower
+
+You're always welcome to contibute! There are three repositories in Shower project:
+
+- [Ribbon](https://github.com/shower/ribbon) theme for Shower
+- [Shower](https://github.com/shower/shower) engine with Ribbon theme
+- [Template](https://github.com/shower) for Shower engine and Ribbon theme
+
+The most important part of the project is the [Shower](https://github.com/shower/shower) repository, containing [shower.js](https://github.com/shower/shower/blob/master/shower.js) file.
+
+## Issues
+
+Before starting to contribute to Shower please read through [Issues](https://github.com/shower/shower/issues?state=open) to see opened bugs and feature requests. If you have any feature to add to Shower, please make sure that you file an issue with your ideas first. If you've found a bug and want to fix it, please file an issue first. It might be a feature!
+
+
+## Process
+
+To contribute to Shower fork needed repository and start making changes. Don't forget to add upstream link to original repository and keep your fork updated. When you finished send pull request back to original repository and supply clear description or link to existing issue.
+
+## Code style
+
+Please keep existing code style while contributing to Shower and be ready for code review by Shower authors and contributors. It's strognly recommended to validate your JavaScript changes using [JSHint](http://jshint.com/).
+
+By historical reasons, Shower project is using tabs instead of spaces for code indentation. It's not a big deal to keep this rule while contributing using you code editor options, even if your code style is 13.4 spaces.
+
+## Language
+
+English is the main language for Shower project. All discussions and commit messages should be in English no matter if it's good or bad. The second language of Shower is Russian. Offical Shower themes are always compatible with Cyrillic and Russian typography. All documentation to Shower is always localized to Russian.
+
+---
+If you have any question please ask [@shower_me](http://twitter.com/shower_me/) or file an [issue](https://github.com/shower/shower/issues?state=open).

+ 9 - 0
libraries/frameworks/shower/License.txt

@@ -0,0 +1,9 @@
+The MIT License
+
+Copyright © 2010–2013 Vadim Makeev, http://pepelsbey.net/
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 45 - 0
libraries/frameworks/shower/Readme.md

@@ -0,0 +1,45 @@
+# Shower
+
+HTML presentation engine. Follow [@shower_me](http://twitter.com/shower_me/) for support and updates.
+
+To see Shower in action:
+
+- Open [shwr.me](http://shwr.me/)
+- Click any slide to enter presentation mode
+- Use arrow keys to navigate
+- Press `Esc` to exit presentation mode
+
+See more details on [using keyboard](shower/wiki/Shortcuts) to control Shower.
+
+## Using Shower
+
+There are two ways of using Shower: you can get full template [ZIP 1.4 MB](http://shwr.me/template.zip) or just an engine [ZIP 650 KB](http://shwr.me/shower.zip). See more details for beginners and advanced techniques in [Quick Start](shower/wiki/Quick-Start) instructions.
+
+## Printing to PDF
+
+You can print your presentation to PDF using Google Chrome “Print to PDF” option in print dialog, [wkhtmltopdf](http://code.google.com/p/wkhtmltopdf) or [Prince](http://princexml.com). Print styles should be supplied to a theme for proper results. Please see [print styles](https://github.com/shower/ribbon/blob/master/styles/print.scss) for the Ribbon theme as example.
+
+Example of Shower template printed by Prince: [PDF 435 KB](https://github.com/shower/template/blob/master/index.pdf?raw=true). See more detais on printing in [documentation](shower/wiki/Print).
+
+## Usage examples
+
+- [Clear and Sharp](http://pepelsbey.net/pres/clear-and-sharp/)
+- [CSS Management](http://pepelsbey.net/pres/css-management/)
+- [Push it!](http://pepelsbey.net/pres/push-it/)
+- [Pre-fixes](http://pepelsbey.net/pres/pre-fixes/)
+- [Web In Curves](http://pepelsbey.net/pres/web-in-curves/)
+- [Sense Coding](http://pepelsbey.net/pres/sense-coding/)
+- [Dynamic Graphics](http://pepelsbey.net/pres/dynamic-graphics/)
+
+## Browser support
+
+Supported desktop browsers: Chrome, Internet Explorer, Firefox, Opera, Safari. Only latest stable versions of mentioned browsers are supported.
+
+## Contributing
+
+You're always welcome to contibute. Fork project, make changes and send it as pull request. But it's better to file an [issue](http://github.com/shower/shower/issues) with your idea first. Read [contributing rules](https://github.com/shower/shower/blob/master/Contributing.md) for more details.
+
+Main contributors: [pepelsbey](http://github.com/pepelsbey), [jahson](http://github.com/jahson), [miripiruni](http://github.com/miripiruni), [kizu](http://github.com/kizu).
+
+---
+Licensed under [MIT License](http://en.wikipedia.org/wiki/MIT_License), see [license page](shower/wiki/MIT-License) for details.

+ 2 - 0
libraries/frameworks/shower/config.yml

@@ -0,0 +1,2 @@
+shower:
+  theme: ribbon

+ 37 - 0
libraries/frameworks/shower/layouts/deck.html

@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html lang="en-US">
+<head>
+	{{> head }}  
+  {{{ page.stylesheets }}}
+	<!--
+		To apply styles to the certain slides
+		use slide ID to get needed elements
+		-->
+	<style>
+		#Cover h2 {
+      margin:65px 0 0;
+			color:#FFF;
+			text-align:center;
+			font-size:70px;
+			}
+		#FitToWidth h2,
+		#FitToHeight h2 {
+			color:#FFF;
+			text-align:center;
+			}
+	</style> 
+</head>
+<body class="list">
+  <header class="caption">
+  	<h1>{{{ page.title }}}</h1>
+	</header>
+  {{{ page.content }}}
+  <div class="progress">
+    <div></div>
+  </div>
+	<script src="{{page.url.framework}}/shower.js"></script>
+	{{> javascripts }}
+	<!-- Copyright © 2010–2012 Vadim Makeev — pepelsbey.net -->
+	<!-- Photos by John Carey — fiftyfootshadows.net -->
+</body>
+</html>

+ 6 - 0
libraries/frameworks/shower/layouts/slide.html

@@ -0,0 +1,6 @@
+<section class="slide {{ slide.class }}" id="{{ slide.id }}">
+  <div>
+    <h2>{{{ slide.title }}}</h2>
+    {{{ slide.content }}}
+  </div>
+</section>

+ 14 - 0
libraries/frameworks/shower/layouts/slide0.html

@@ -0,0 +1,14 @@
+<div class="slide {{ slide.class }}" id = "{{ slide.id }}">
+  <div>
+    <section>
+      {{# slide.header }}
+      <header>
+        <h2>
+          {{{ slide.title }}}
+        </h2>
+      </header>
+      {{/ slide.header}}
+      {{{ slide.content }}}
+    </section>
+  </div>
+</div>

+ 11 - 0
libraries/frameworks/shower/partials/head.html

@@ -0,0 +1,11 @@
+<title>{{ page.title }}</title>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=1274, user-scalable=no">
+<meta name="description" content="{{ page.title }}">
+<meta name="author" content="{{ page.author }}">
+<meta name="generator" content="slidify" />
+<!-- LOAD STYLE SHEETS -->
+<link rel="stylesheet" href="{{page.url.framework}}/themes/{{page.shower.theme}}/styles/screen.css">
+<link rel="stylesheet" media="print"
+  href="{{page.url.framework}}/themes/{{page.shower.theme}}/styles/print.css">
+<link rel="stylesheet" href="{{page.url.highlighter}}/css/{{page.hitheme}}.css">

+ 726 - 0
libraries/frameworks/shower/shower.js

@@ -0,0 +1,726 @@
+/**
+ * Shower HTML presentation engine: github.com/shower/shower
+ * @copyright 2010–2013 Vadim Makeev, pepelsbey.net
+ * @license MIT license: github.com/shower/shower/wiki/MIT-License
+ */
+window.shower = (function(window, document, undefined) {
+	var shower = {},
+		url = window.location,
+		body = document.body,
+		slides = document.querySelectorAll('.slide'),
+		progress = document.querySelector('div.progress div'),
+		slideList = [],
+		timer,
+		isHistoryApiSupported = !!(window.history && history.pushState),
+		l = slides.length, i;
+
+	/**
+	* Get value at named data store for the DOM element.
+	* @private
+	* @param {HTMLElement} element
+	* @param {String} name
+	* @returns {String}
+	*/
+	shower._getData = function(element, name) {
+		return element.dataset ? element.dataset[name] : element.getAttribute('data-' + name);
+	};
+
+	for (i = 0; i < l; i++) {
+		// Slide IDs are optional. In case of missing ID we set it to the
+		// slide number
+		if ( ! slides[i].id) {
+			slides[i].id = i + 1;
+		}
+
+		slideList.push({
+			id: slides[i].id,
+			hasInnerNavigation: null !== slides[i].querySelector('.next'),
+			hasTiming: (shower._getData(slides[i], 'timing') && shower._getData(slides[i], 'timing').indexOf(':') !== -1)
+		});
+	}
+
+	/**
+	* Get slide scale value.
+	* @private
+	* @returns {String}
+	*/
+	shower._getTransform = function() {
+		var denominator = Math.max(
+			body.clientWidth / window.innerWidth,
+			body.clientHeight / window.innerHeight
+		);
+
+		return 'scale(' + (1 / denominator) + ')';
+	};
+
+	/**
+	* Set CSS transform with prefixes to body.
+	* @private
+	* @returns {Boolean}
+	*/
+	shower._applyTransform = function(transform) {
+		body.style.WebkitTransform = transform;
+		body.style.MozTransform = transform;
+		body.style.msTransform = transform;
+		body.style.OTransform = transform;
+		body.style.transform = transform;
+
+		return true;
+	};
+
+	/**
+	* Check if arg is number.
+	* @private
+	* @param {String|Number} arg
+	* @returns {Boolean}
+	*/
+	shower._isNumber = function(arg) {
+		return ! isNaN(parseFloat(arg)) && isFinite(arg);
+	};
+
+	/**
+	* Normalize slide number.
+	* @private
+	* @param {Number} slideNumber slide number (sic!)
+	* @returns {Number}
+	*/
+	shower._normalizeSlideNumber = function(slideNumber) {
+		if ( ! shower._isNumber(slideNumber)) {
+			throw new Error('Gimme slide number as Number, baby!');
+		}
+
+		if (slideNumber < 0) {
+			slideNumber = 0;
+		}
+
+		if (slideNumber >= slideList.length) {
+			slideNumber = slideList.length - 1;
+		}
+
+		return slideNumber;
+	};
+
+	/**
+	* Get slide id from HTML element.
+	* @private
+	* @param {HTMLElement} el
+	* @returns {String}
+	*/
+	shower._getSlideIdByEl = function(el) {
+		while ('BODY' !== el.nodeName && 'HTML' !== el.nodeName) {
+			if (el.classList.contains('slide')) {
+				return el.id;
+			} else {
+				el = el.parentNode;
+			}
+		}
+
+		return '';
+	};
+
+	/**
+	* For touch devices: check if link is clicked.
+	*
+	* @TODO: add support for textareas/inputs/etc.
+	*
+	* @private
+	* @param {HTMLElement} e
+	* @returns {Boolean}
+	*/
+	shower._checkInteractiveElement = function(e) {
+		return 'A' === e.target.nodeName;
+	};
+
+	/**
+	* Get slide number by slideId.
+	* @param {String} slideId (HTML id or position in slideList)
+	* @returns {Number}
+	*/
+	shower.getSlideNumber = function(slideId) {
+		var i = slideList.length - 1,
+			slideNumber;
+
+		if (slideId === '') {
+			slideNumber = 0;
+		}
+
+		// As fast as you can ;-)
+		// http://jsperf.com/for-vs-foreach/46
+		for (; i >= 0; --i) {
+			if (slideId === slideList[i].id) {
+				slideNumber = i;
+				break;
+			}
+		}
+
+		return slideNumber;
+	};
+
+	/**
+	* Go to slide number.
+	* @param {Number} slideNumber slide number (sic!). Attention: starts from zero.
+	* @param {Function} [callback] runs only if you not in List mode.
+	* @returns {Number}
+	*/
+	shower.go = function(slideNumber, callback) {
+		if ( ! shower._isNumber(slideNumber)) {
+			throw new Error('Gimme slide number as Number, baby!');
+		}
+
+		// Also triggers popstate and invoke shower.enter__Mode()
+		url.hash = shower.getSlideHash(slideNumber);
+
+		shower.updateProgress(slideNumber);
+		shower.updateActiveAndVisitedSlides(slideNumber);
+
+		if (shower.isSlideMode()) {
+			shower.showPresenterNotes(slideNumber);
+			shower.runInnerNavigation(slideNumber);
+		}
+
+		if (typeof(callback) === 'function') {
+			callback();
+		}
+
+		return slideNumber;
+	};
+
+	/**
+	* Show next slide or show next Inner navigation item.
+	* Returns false on a last slide, otherwise returns shown slide number.
+	* @param {Function} [callback] runs only if shower.next() is successfully completed.
+	* @returns {Number|Boolean}
+	*/
+	shower.next = function(callback) {
+		var currentSlideNumber = shower.getCurrentSlideNumber(),
+			ret = false;
+
+		// Only go to next slide if current slide have no inner
+		// navigation or inner navigation is fully shown
+		// NOTE: But first of all check if there is no current slide
+		if (
+			(
+				-1 === currentSlideNumber ||
+				! slideList[currentSlideNumber].hasInnerNavigation ||
+				! shower.increaseInnerNavigation(currentSlideNumber)
+			) &&
+			// If exist next slide
+			(currentSlideNumber + 2) <= slideList.length
+		) {
+			shower.go(currentSlideNumber + 1);
+			// Slides starts from 0. So return next slide number.
+			ret = currentSlideNumber + 2;
+		}
+
+		if (shower.isSlideMode()) {
+			shower.runInnerNavigation(currentSlideNumber + 1);
+		}
+
+		if (typeof(callback) === 'function') {
+			callback();
+		}
+
+		return ret;
+	};
+
+	/**
+	* Show previous slide. Returns false on a first slide, otherwise returns shown slide number.
+	* @param {Function} [callback] runs only if shower.previous() is successfully completed.
+	* @returns {Number|Boolean}
+	*/
+	shower.previous = function(callback) {
+		var currentSlideNumber = shower.getCurrentSlideNumber(),
+			ret = false;
+
+		// slides starts from 0
+		if (currentSlideNumber > 0) {
+			ret = currentSlideNumber;
+			shower.go(currentSlideNumber - 1);
+
+			if (typeof(callback) === 'function') {
+				callback();
+			}
+		}
+
+		return ret;
+	};
+
+	/**
+	* Show first slide.
+	* @param {Function} [callback]
+	* @returns {Number}
+	*/
+	shower.first = function(callback) {
+		if (typeof(callback) === 'function') {
+			callback();
+		}
+
+		return shower.go(0);
+	};
+
+	/**
+	* Show last slide.
+	* @param {Function} [callback]
+	* @returns {Number}
+	*/
+	shower.last = function(callback) {
+		if (typeof(callback) === 'function') {
+			callback();
+		}
+		return shower.go(slideList.length - 1);
+	};
+
+	/**
+	* Switch to slide view.
+	* @param {Function} [callback] runs only if shower.enterSlideMode() is successfully completed.
+	* @returns {Boolean}
+	*/
+	shower.enterSlideMode = function(callback) {
+		var currentSlideNumber = shower.getCurrentSlideNumber();
+
+		// Anyway: change body class (@TODO: refactoring)
+		body.classList.remove('list');
+		body.classList.add('full');
+
+		// Preparing URL for shower.go()
+		if (shower.isListMode() && isHistoryApiSupported) {
+			history.pushState(null, null, url.pathname + '?full' + shower.getSlideHash(currentSlideNumber));
+		}
+
+		shower._applyTransform(shower._getTransform());
+
+		if (typeof(callback) === 'function') {
+			callback();
+		}
+
+		return true;
+	};
+
+	/**
+	* Switch to list view.
+	* @param {Function} [callback] runs only if shower.enterListMode() is successfully completed.
+	* @returns {Boolean}
+	*/
+	shower.enterListMode = function(callback) {
+		// Anyway: change body class (@TODO: refactoring)
+		body.classList.remove('full');
+		body.classList.add('list');
+
+		shower.clearPresenterNotes();
+
+		if (shower.isListMode()) {
+			return false;
+		}
+
+		var currentSlideNumber = shower.getCurrentSlideNumber();
+
+		clearTimeout(timer);
+
+		if (shower.isSlideMode() && isHistoryApiSupported) {
+			history.pushState(null, null, url.pathname + shower.getSlideHash(currentSlideNumber));
+		}
+
+		shower.scrollToSlide(currentSlideNumber);
+		shower._applyTransform('none');
+
+		if (typeof(callback) === 'function') {
+			callback();
+		}
+
+		return true;
+	};
+
+	/**
+	* Toggle Mode: Slide and List.
+	* @param {Function} [callback]
+	*/
+	shower.toggleMode = function(callback) {
+		if (shower.isListMode()) {
+			shower.enterSlideMode();
+		} else {
+			shower.enterListMode();
+		}
+
+		if (typeof(callback) === 'function') {
+			callback();
+		}
+
+		return true;
+	};
+
+	/**
+	* Get current slide number. Starts from zero. Warning: when you have
+	* slide number 1 in URL this method will return 0.
+	* If something is wrong return -1.
+	* @returns {Number}
+	*/
+	shower.getCurrentSlideNumber = function() {
+		var i = slideList.length - 1,
+			currentSlideId = url.hash.substr(1);
+
+		// As fast as you can ;-)
+		// http://jsperf.com/for-vs-foreach/46
+		for (; i >= 0; --i) {
+			if (currentSlideId === slideList[i].id) {
+				return i;
+			}
+		}
+
+		return -1;
+	};
+
+	/**
+	* Scroll to slide.
+	* @param {Number} slideNumber slide number (sic!)
+	* @returns {Boolean}
+	*/
+	shower.scrollToSlide = function(slideNumber) {
+		var currentSlide,
+			ret = false;
+
+		if ( ! shower._isNumber(slideNumber)) {
+			throw new Error('Gimme slide number as Number, baby!');
+		}
+
+		if (shower.isSlideMode()) {
+			throw new Error('You can\'t scroll to because you in slide mode. Please, switch to list mode.');
+		}
+
+		// @TODO: WTF?
+		if (-1 === slideNumber) {
+			return ret;
+		}
+
+		if (slideList[slideNumber]) {
+			currentSlide = document.getElementById(slideList[slideNumber].id);
+			window.scrollTo(0, currentSlide.offsetTop);
+			ret = true;
+		} else {
+			throw new Error('There is no slide with number ' + slideNumber);
+		}
+
+		return ret;
+	};
+
+	/**
+	* Check if it's List mode.
+	* @returns {Boolean}
+	*/
+	shower.isListMode = function() {
+		return isHistoryApiSupported ? ! /^full.*/.test(url.search.substr(1)) : body.classList.contains('list');
+	};
+
+	/**
+	* Check if it's Slide mode.
+	* @returns {Boolean}
+	*/
+	shower.isSlideMode = function() {
+		return isHistoryApiSupported ? /^full.*/.test(url.search.substr(1)) : body.classList.contains('full');
+	};
+
+	/**
+	* Update progress bar.
+	* @param {Number} slideNumber slide number (sic!)
+	* @returns {Boolean}
+	*/
+	shower.updateProgress = function(slideNumber) {
+		// if progress bar doesn't exist
+		if (null === progress) {
+			return false;
+		}
+
+		if ( ! shower._isNumber(slideNumber)) {
+			throw new Error('Gimme slide number as Number, baby!');
+		}
+
+		progress.style.width = (100 / (slideList.length - 1) * shower._normalizeSlideNumber(slideNumber)).toFixed(2) + '%';
+
+		return true;
+	};
+
+	/**
+	* Update active and visited slides.
+	* @param {Number} slideNumber slide number (sic!)
+	* @returns {Boolean}
+	*/
+	shower.updateActiveAndVisitedSlides = function(slideNumber) {
+		var i,
+			slide,
+			l = slideList.length;
+
+		slideNumber = shower._normalizeSlideNumber(slideNumber);
+
+		if ( ! shower._isNumber(slideNumber)) {
+			throw new Error('Gimme slide number as Number, baby!');
+		}
+
+		for (i = 0; i < l; ++i) {
+			slide = document.getElementById(slideList[i].id);
+
+			if (i < slideNumber) {
+				slide.classList.remove('active');
+				slide.classList.add('visited');
+			} else if (i > slideNumber) {
+				slide.classList.remove('visited');
+				slide.classList.remove('active');
+			} else {
+				slide.classList.remove('visited');
+				slide.classList.add('active');
+			}
+		}
+
+		return true;
+	};
+
+	/**
+	* Clear presenter notes in console.
+	*/
+	shower.clearPresenterNotes = function() {
+		if (window.console && window.console.clear) {
+			console.clear();
+		}
+	};
+
+	/**
+	* Show presenter notes in console.
+	* @param {Number} slideNumber slide number (sic!). Attention: starts from zero.
+	*/
+	shower.showPresenterNotes = function(slideNumber) {
+		shower.clearPresenterNotes();
+
+		if (window.console) {
+			slideNumber = shower._normalizeSlideNumber(slideNumber);
+
+			var slideId = slideList[slideNumber].id,
+				nextSlideId = slideList[slideNumber + 1] ? slideList[slideNumber + 1].id : null,
+				notes = document.getElementById(slideId).querySelector('footer');
+
+			if (notes && notes.innerHTML) {
+				console.info(notes.innerHTML.replace(/\n\s+/g,'\n'));
+			}
+
+			if (nextSlideId) {
+
+				var next = document.getElementById(nextSlideId).querySelector('h2');
+
+				if (next) {
+					next = next.innerHTML.replace(/^\s+|<[^>]+>/g,'');
+					console.info('NEXT: ' + next);
+				}
+			}
+		}
+	};
+
+	/**
+	* Get slide hash.
+	* @param {Number} slideNumber slide number (sic!). Attention: starts from zero.
+	* @returns {String}
+	*/
+	shower.getSlideHash = function(slideNumber) {
+		if ( ! shower._isNumber(slideNumber)) {
+			throw new Error('Gimme slide number as Number, baby!');
+		}
+
+		slideNumber = shower._normalizeSlideNumber(slideNumber);
+
+		return '#' + slideList[slideNumber].id;
+	};
+
+	/**
+	* Run slide show if presented.
+	* @param {Number} slideNumber
+	* @returns {Boolean}
+	*/
+	shower.runInnerNavigation = function(slideNumber) {
+		if ( ! shower._isNumber(slideNumber)) {
+			throw new Error('Gimme slide number as Number, baby!');
+		}
+
+		slideNumber = shower._normalizeSlideNumber(slideNumber);
+
+		clearTimeout(timer);
+
+		if (slideList[slideNumber].hasTiming) {
+			// Compute number of milliseconds from format "X:Y", where X is
+			// number of minutes, and Y is number of seconds
+			var timing = shower._getData(document.getElementById(slideList[slideNumber].id), 'timing').split(':');
+			timing = parseInt(timing[0], 10) * 60 * 1000 + parseInt(timing[1], 10) * 1000;
+
+			timer = setTimeout(function() {
+					shower.next();
+				},
+				timing);
+		}
+
+		return true;
+	};
+
+	/**
+	* Increases inner navigation by adding 'active' class to next inactive inner navigation item
+	* @param {Number} slideNumber
+	* @returns {Boolean}
+	*/
+	shower.increaseInnerNavigation = function(slideNumber) {
+		var nextNodes,
+			node;
+
+		if ( ! shower._isNumber(slideNumber)) {
+			throw new Error('Gimme slide number as Number, baby!');
+		}
+
+		// If inner navigation in this slide
+		if (slideList[slideNumber].hasInnerNavigation) {
+			nextNodes = document.getElementById(slideList[slideNumber].id).querySelectorAll('.next:not(.active)');
+
+			if (0 !== nextNodes.length) {
+				node = nextNodes[0];
+				node.classList.add('active');
+				return true;
+			}
+		}
+
+		return false;
+	};
+
+	// Event handlers
+
+	window.addEventListener('DOMContentLoaded', function() {
+		if (body.classList.contains('full') || shower.isSlideMode()) {
+			shower.go(shower.getCurrentSlideNumber());
+			shower.enterSlideMode();
+		}
+	}, false);
+
+	window.addEventListener('popstate', function() {
+		if (shower.isListMode()) {
+			shower.enterListMode();
+		} else {
+			shower.enterSlideMode();
+		}
+	}, false);
+
+	window.addEventListener('resize', function() {
+		if (shower.isSlideMode()) {
+			shower._applyTransform(shower._getTransform());
+		}
+	}, false);
+
+	document.addEventListener('keydown', function(e) {
+		// Shortcut for alt, ctrl and meta keys
+		if (e.altKey || e.ctrlKey || e.metaKey) { return; }
+
+		var currentSlideNumber = shower.getCurrentSlideNumber(),
+			isInnerNavCompleted = true;
+
+		switch (e.which) {
+			case 116: // F5
+				e.preventDefault();
+
+				if (shower.isListMode()) {
+					var slideNumber = e.shiftKey ? currentSlideNumber : 0;
+
+					// Warning: go must be before enterSlideMode.
+					// Otherwise there is a bug in Chrome
+					shower.go(slideNumber);
+					shower.enterSlideMode();
+					shower.showPresenterNotes(slideNumber);
+				} else {
+					shower.enterListMode();
+				}
+			break;
+
+			case 13: // Enter
+				if (shower.isListMode() && -1 !== currentSlideNumber) {
+					e.preventDefault();
+					shower.enterSlideMode();
+				}
+			break;
+
+			case 27: // Esc
+				if (shower.isSlideMode()) {
+					e.preventDefault();
+					shower.enterListMode();
+				}
+			break;
+
+			case 33: // PgUp
+			case 38: // Up
+			case 37: // Left
+			case 72: // H
+			case 75: // K
+				e.preventDefault();
+				shower.previous();
+			break;
+
+			case 34: // PgDown
+			case 40: // Down
+			case 39: // Right
+			case 76: // L
+			case 74: // J
+				e.preventDefault();
+				shower.next();
+			break;
+
+			case 36: // Home
+				e.preventDefault();
+				shower.first();
+			break;
+
+			case 35: // End
+				e.preventDefault();
+				shower.last();
+			break;
+
+			case 9: // Tab = +1; Shift + Tab = -1
+			case 32: // Space = +1; Shift + Space = -1
+				e.preventDefault();
+				shower[e.shiftKey ? 'previous' : 'next']();
+			break;
+
+			default:
+				// Behave as usual
+		}
+	}, false);
+
+	document.addEventListener('click', function(e) {
+		var slideNumber = shower.getSlideNumber(shower._getSlideIdByEl(e.target));
+
+		// Click on slide in List mode
+		if (shower.isListMode() && shower._getSlideIdByEl(e.target)) {
+			// Warning: go must be before enterSlideMode.
+			// Otherwise there is a bug in Chrome
+			shower.go(slideNumber);
+			shower.enterSlideMode();
+			shower.showPresenterNotes(slideNumber);
+		}
+	}, false);
+
+	document.addEventListener('touchstart', function(e) {
+		if (shower._getSlideIdByEl(e.target)) {
+			if (shower.isSlideMode() && ! shower._checkInteractiveElement(e)) {
+				var x = e.touches[0].pageX;
+
+				if (x > window.innerWidth / 2) {
+					shower.next();
+				} else {
+					shower.previous();
+				}
+			}
+
+			if (shower.isListMode()) {
+				shower.go(shower.getSlideNumber(shower._getSlideIdByEl(e.target)));
+				shower.enterSlideMode();
+			}
+		}
+
+	}, false);
+
+	document.addEventListener('touchmove', function(e) {
+		if (shower.isSlideMode()) {
+			e.preventDefault();
+		}
+	}, false);
+
+	return shower;
+
+})(this, this.document);

Разница между файлами не показана из-за своего большого размера
+ 5 - 0
libraries/frameworks/shower/shower.min.js


+ 31 - 0
libraries/frameworks/shower/themes/ribbon/Contributing.md

@@ -0,0 +1,31 @@
+# Contributing to Shower
+
+You're always welcome to contibute! There are three repositories in Shower project:
+
+- [Ribbon](https://github.com/shower/ribbon) theme for Shower
+- [Shower](https://github.com/shower/shower) engine with Ribbon theme
+- [Template](https://github.com/shower) for Shower engine and Ribbon theme
+
+The most important part of the project is the [Shower](https://github.com/shower/shower) repository, containing [shower.js](https://github.com/shower/shower/blob/master/shower.js) file.
+
+## Issues
+
+Before starting to contribute to Shower please read through [Issues](https://github.com/shower/shower/issues?state=open) to see opened bugs and feature requests. If you have any feature to add to Shower, please make sure that you file an issue with your ideas first. If you've found a bug and want to fix it, please file an issue first. It might be a feature!
+
+
+## Process
+
+To contribute to Shower fork needed repository and start making changes. Don't forget to add upstream link to original repository and keep your fork updated. When you finished send pull request back to original repository and supply clear description or link to existing issue.
+
+## Code style
+
+Please keep existing code style while contributing to Shower and be ready for code review by Shower authors and contributors. It's strognly recommended to validate your JavaScript changes using [JSHint](http://jshint.com/)
+
+By historical reasons, Shower project is using tabs instead of spaces for code indentation. It's not a big deal to keep this rule while contributing using you code editor options, even if your code style is 13.4 spaces.
+
+## Language
+
+English is the main language for Shower project. All discussions and commit messages should be in English no matter if it's good or bad. The second language of Shower is Russian. Offical Shower themes are always compatible with Cyrillic and Russian typography. All documentation to Shower is always localized to Russian.
+
+---
+If you have any question please ask [@shower_me](http://twitter.com/shower_me/) or file an [issue](https://github.com/shower/shower/issues?state=open).

+ 9 - 0
libraries/frameworks/shower/themes/ribbon/License.txt

@@ -0,0 +1,9 @@
+The MIT License
+
+Copyright © 2010–2013 Vadim Makeev, http://pepelsbey.net/
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 17 - 0
libraries/frameworks/shower/themes/ribbon/Readme.md

@@ -0,0 +1,17 @@
+# Ribbon theme for Shower
+
+Default theme for [shower](https://github.com/shower/shower) engine, part of [template](https://github.com/shower/template).
+
+To see Shower in action:
+
+- Open [shwr.me](http://shwr.me/)
+- Click any slide to enter presentation mode
+- Use arrow keys to navigate
+- Press `Esc` to exit presentation mode
+
+See more details in Shower [readme](https://github.com/shower/shower#readme). Follow [@shower_me](http://twitter.com/shower_me/) for support and updates. Use [Issues](https://github.com/shower/shower/issues) for sharing your ideas, bugs and feature requests.
+
+**Please note** this repository is for development only. To get Shower please use [template](https://github.com/shower/template) or [shower](https://github.com/shower/shower) engine.
+
+---
+Licensed under [MIT License](http://en.wikipedia.org/wiki/MIT_License), see [license page](shower/wiki/MIT-License) for details.

BIN
libraries/frameworks/shower/themes/ribbon/fonts/PTMono.woff


BIN
libraries/frameworks/shower/themes/ribbon/fonts/PTSans.Bold.Italic.woff


BIN
libraries/frameworks/shower/themes/ribbon/fonts/PTSans.Bold.woff


BIN
libraries/frameworks/shower/themes/ribbon/fonts/PTSans.Italic.woff


Некоторые файлы не были показаны из-за большого количества измененных файлов