Browse Source

slides conversations

lucha 6 years ago
parent
commit
c5511826d1
76 changed files with 4247 additions and 12 deletions
  1. BIN
      images/Conversations_1.png
  2. BIN
      images/Conversations_2.png
  3. BIN
      images/Conversations_3.png
  4. BIN
      images/Conversations_4.png
  5. BIN
      images/Conversations_5.png
  6. BIN
      images/Conversations_6.png
  7. BIN
      images/Conversations_7.png
  8. BIN
      images/Conversations_8.png
  9. BIN
      images/Conversations_9.png
  10. BIN
      images/android-alert.png
  11. BIN
      images/android-external-app.png
  12. BIN
      images/conversations_logo.png
  13. BIN
      images/f-droid-conversations-web.png
  14. BIN
      images/f-droid-conversations.png
  15. BIN
      images/gplay.png
  16. BIN
      images/images/emacs-icon.png
  17. BIN
      images/images/google_developers_icon_128.png
  18. BIN
      images/images/google_developers_logo.png
  19. BIN
      images/images/google_developers_logo_white.png
  20. BIN
      images/images/org-icon.png
  21. BIN
      images/images/sky.jpg
  22. 586 0
      js/hammer.js
  23. 1 0
      js/jquery-1.7.1.min.js
  24. 3 0
      js/modernizr.custom.45394.js
  25. 8 0
      js/order.js
  26. 2 0
      js/polyfills/classList.min.js
  27. 2 0
      js/polyfills/dataset.min.js
  28. 0 0
      js/polyfills/history.min.js
  29. 2 0
      js/prettify/lang-apollo.js
  30. 3 0
      js/prettify/lang-basic.js
  31. 18 0
      js/prettify/lang-clj.js
  32. 2 0
      js/prettify/lang-css.js
  33. 3 0
      js/prettify/lang-dart.js
  34. 2 0
      js/prettify/lang-erlang.js
  35. 1 0
      js/prettify/lang-go.js
  36. 2 0
      js/prettify/lang-hs.js
  37. 3 0
      js/prettify/lang-lisp.js
  38. 1 0
      js/prettify/lang-llvm.js
  39. 2 0
      js/prettify/lang-lua.js
  40. 2 0
      js/prettify/lang-matlab.js
  41. 2 0
      js/prettify/lang-ml.js
  42. 2 0
      js/prettify/lang-mumps.js
  43. 4 0
      js/prettify/lang-n.js
  44. 3 0
      js/prettify/lang-pascal.js
  45. 1 0
      js/prettify/lang-proto.js
  46. 2 0
      js/prettify/lang-r.js
  47. 1 0
      js/prettify/lang-rd.js
  48. 2 0
      js/prettify/lang-scala.js
  49. 2 0
      js/prettify/lang-sql.js
  50. 3 0
      js/prettify/lang-tcl.js
  51. 1 0
      js/prettify/lang-tex.js
  52. 2 0
      js/prettify/lang-vb.js
  53. 3 0
      js/prettify/lang-vhdl.js
  54. 2 0
      js/prettify/lang-wiki.js
  55. 1 0
      js/prettify/lang-xq.js
  56. 2 0
      js/prettify/lang-yaml.js
  57. 1 0
      js/prettify/prettify.css
  58. 30 0
      js/prettify/prettify.js
  59. 34 0
      js/prettify/run_prettify.js
  60. 33 0
      js/require-1.0.8.min.js
  61. 109 0
      js/slide-controller.js
  62. 783 0
      js/slide-deck.js
  63. 36 0
      js/slide-elastic.js
  64. 5 0
      js/slides.js
  65. 26 0
      slide_config.js
  66. 825 0
      slides.html
  67. 277 12
      slides.org
  68. 0 0
      theme/css/default.css
  69. 1 0
      theme/css/io2013.css
  70. 1 0
      theme/css/phone.css
  71. 15 0
      theme/css/small-icon.css
  72. 138 0
      theme/scss/_base.scss
  73. 40 0
      theme/scss/_variables.scss
  74. 1131 0
      theme/scss/default.scss
  75. 51 0
      theme/scss/io2013.scss
  76. 35 0
      theme/scss/phone.scss

BIN
images/Conversations_1.png


BIN
images/Conversations_2.png


BIN
images/Conversations_3.png


BIN
images/Conversations_4.png


BIN
images/Conversations_5.png


BIN
images/Conversations_6.png


BIN
images/Conversations_7.png


BIN
images/Conversations_8.png


BIN
images/Conversations_9.png


BIN
images/android-alert.png


BIN
images/android-external-app.png


BIN
images/conversations_logo.png


BIN
images/f-droid-conversations-web.png


BIN
images/f-droid-conversations.png


BIN
images/gplay.png


BIN
images/images/emacs-icon.png


BIN
images/images/google_developers_icon_128.png


BIN
images/images/google_developers_logo.png


BIN
images/images/google_developers_logo_white.png


BIN
images/images/org-icon.png


BIN
images/images/sky.jpg


+ 586 - 0
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]";
+    }
+}

File diff suppressed because it is too large
+ 1 - 0
js/jquery-1.7.1.min.js


File diff suppressed because it is too large
+ 3 - 0
js/modernizr.custom.45394.js


+ 8 - 0
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
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
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))})();

File diff suppressed because it is too large
+ 0 - 0
js/polyfills/history.min.js


+ 2 - 0
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 \u00a0"],["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"]);

+ 3 - 0
js/prettify/lang-basic.js

@@ -0,0 +1,3 @@
+var a=null;
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^"(?:[^\n\r"\\]|\\.)*(?:"|$)/,a,'"'],["pln",/^\s+/,a," \r\n\t\u00a0"]],[["com",/^REM[^\n\r]*/,a],["kwd",/^\b(?:AND|CLOSE|CLR|CMD|CONT|DATA|DEF ?FN|DIM|END|FOR|GET|GOSUB|GOTO|IF|INPUT|LET|LIST|LOAD|NEW|NEXT|NOT|ON|OPEN|OR|POKE|PRINT|READ|RESTORE|RETURN|RUN|SAVE|STEP|STOP|SYS|THEN|TO|VERIFY|WAIT)\b/,a],["pln",/^[a-z][^\W_]?(?:\$|%)?/i,a],["lit",/^(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?/i,a,"0123456789"],["pun",
+/^.[^\s\w"$%.]*/,a]]),["basic","cbm"]);

+ 18 - 0
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 \u00a0"],["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
js/prettify/lang-css.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n\u000c"]],[["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}\b/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"]);

+ 3 - 0
js/prettify/lang-dart.js

@@ -0,0 +1,3 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"]],[["com",/^#!.*/],["kwd",/^\b(?:import|library|part of|part|as|show|hide)\b/i],["com",/^\/\/.*/],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["kwd",/^\b(?:class|interface)\b/i],["kwd",/^\b(?:assert|break|case|catch|continue|default|do|else|finally|for|if|in|is|new|return|super|switch|this|throw|try|while)\b/i],["kwd",/^\b(?:abstract|const|extends|factory|final|get|implements|native|operator|set|static|typedef|var)\b/i],
+["typ",/^\b(?:bool|double|dynamic|int|num|object|string|void)\b/i],["kwd",/^\b(?:false|null|true)\b/i],["str",/^r?'''[\S\s]*?[^\\]'''/],["str",/^r?"""[\S\s]*?[^\\]"""/],["str",/^r?'('|[^\n\f\r]*?[^\\]')/],["str",/^r?"("|[^\n\f\r]*?[^\\]")/],["pln",/^[$_a-z]\w*/i],["pun",/^[!%&*+/:<-?^|~-]/],["lit",/^\b0x[\da-f]+/i],["lit",/^\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i],["lit",/^\b\.\d+(?:e[+-]?\d+)?/i],["pun",/^[(),.;[\]{}]/]]),
+["dart"]);

+ 2 - 0
js/prettify/lang-erlang.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null,"\t\n\u000b\u000c\r "],["str",/^"(?:[^\n\f\r"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["lit",/^[a-z]\w*/],["lit",/^'(?:[^\n\f\r'\\]|\\[^&])+'?/,null,"'"],["lit",/^\?[^\t\n ({]+/,null,"?"],["lit",/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)/i,null,"0123456789"]],[["com",/^%[^\n]*/],["kwd",/^(?:module|attributes|do|let|in|letrec|apply|call|primop|case|of|end|when|fun|try|catch|receive|after|char|integer|float,atom,string,var)\b/],
+["kwd",/^-[_a-z]+/],["typ",/^[A-Z_]\w*/],["pun",/^[,.;]/]]),["erlang","erl"]);

+ 1 - 0
js/prettify/lang-go.js

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

+ 2 - 0
js/prettify/lang-hs.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t-\r ]+/,null,"\t\n\u000b\u000c\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
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 \u00a0"],["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","lsp","scm","ss","rkt"]);

+ 1 - 0
js/prettify/lang-llvm.js

@@ -0,0 +1 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^!?"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["com",/^;[^\n\r]*/,null,";"]],[["pln",/^[!%@](?:[$\-.A-Z_a-z][\w$\-.]*|\d+)/],["kwd",/^[^\W\d]\w*/,null],["lit",/^\d+\.\d+/],["lit",/^(?:\d+|0[Xx][\dA-Fa-f]+)/],["pun",/^[(-*,:<->[\]{}]|\.\.\.$/]]),["llvm","ll"]);

+ 2 - 0
js/prettify/lang-lua.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["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"]);

File diff suppressed because it is too large
+ 2 - 0
js/prettify/lang-matlab.js


+ 2 - 0
js/prettify/lang-ml.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["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"]);

+ 2 - 0
js/prettify/lang-mumps.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:[^"]|\\.)*"/,null,'"']],[["com",/^;[^\n\r]*/,null,";"],["dec",/^\$(?:d|device|ec|ecode|es|estack|et|etrap|h|horolog|i|io|j|job|k|key|p|principal|q|quit|st|stack|s|storage|sy|system|t|test|tl|tlevel|tr|trestart|x|y|z[a-z]*|a|ascii|c|char|d|data|e|extract|f|find|fn|fnumber|g|get|j|justify|l|length|na|name|o|order|p|piece|ql|qlength|qs|qsubscript|q|query|r|random|re|reverse|s|select|st|stack|t|text|tr|translate|nan)\b/i,
+null],["kwd",/^(?:[^$]b|break|c|close|d|do|e|else|f|for|g|goto|h|halt|h|hang|i|if|j|job|k|kill|l|lock|m|merge|n|new|o|open|q|quit|r|read|s|set|tc|tcommit|tre|trestart|tro|trollback|ts|tstart|u|use|v|view|w|write|x|xecute)\b/i,null],["lit",/^[+-]?(?:\.\d+|\d+(?:\.\d*)?)(?:e[+-]?\d+)?/i],["pln",/^[a-z][^\W_]*/i],["pun",/^[^\w\t\n\r"$%;^\xa0]|_/]]),["mumps"]);

+ 4 - 0
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\u00a0"]],[["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"]);

+ 3 - 0
js/prettify/lang-pascal.js

@@ -0,0 +1,3 @@
+var a=null;
+PR.registerLangHandler(PR.createSimpleLexer([["str",/^'(?:[^\n\r'\\]|\\.)*(?:'|$)/,a,"'"],["pln",/^\s+/,a," \r\n\t\u00a0"]],[["com",/^\(\*[\S\s]*?(?:\*\)|$)|^{[\S\s]*?(?:}|$)/,a],["kwd",/^(?:absolute|and|array|asm|assembler|begin|case|const|constructor|destructor|div|do|downto|else|end|external|for|forward|function|goto|if|implementation|in|inline|interface|interrupt|label|mod|not|object|of|or|packed|procedure|program|record|repeat|set|shl|shr|then|to|type|unit|until|uses|var|virtual|while|with|xor)\b/i,a],
+["lit",/^(?:true|false|self|nil)/i,a],["pln",/^[a-z][^\W_]*/i,a],["lit",/^(?:\$[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)/i,a,"0123456789"],["pun",/^.[^\s\w$'./@]*/,a]]),["pascal"]);

+ 1 - 0
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
js/prettify/lang-r.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,null,'"'],["str",/^'(?:[^'\\]|\\[\S\s])*(?:'|$)/,null,"'"]],[["com",/^#.*/],["kwd",/^(?:if|else|for|while|repeat|in|next|break|return|switch|function)(?![\w.])/],["lit",/^0[Xx][\dA-Fa-f]+([Pp]\d+)?[Li]?/],["lit",/^[+-]?(\d+(\.\d+)?|\.\d+)([Ee][+-]?\d+)?[Li]?/],["lit",/^(?:NULL|NA(?:_(?:integer|real|complex|character)_)?|Inf|TRUE|FALSE|NaN|\.\.(?:\.|\d+))(?![\w.])/],
+["pun",/^(?:<<?-|->>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|[!*+/^]|%.*?%|[$=@~]|:{1,3}|[(),;?[\]{}])/],["pln",/^(?:[A-Za-z]+[\w.]*|\.[^\W\d][\w.]*)(?![\w.])/],["str",/^`.+`/]]),["r","s","R","S","Splus"]);

+ 1 - 0
js/prettify/lang-rd.js

@@ -0,0 +1 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["com",/^%[^\n\r]*/,null,"%"]],[["lit",/^\\(?:cr|l?dots|R|tab)\b/],["kwd",/^\\[@-Za-z]+/],["kwd",/^#(?:ifn?def|endif)/],["pln",/^\\[{}]/],["pun",/^[()[\]{}]+/]]),["Rd","rd"]);

+ 2 - 0
js/prettify/lang-scala.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["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
js/prettify/lang-sql.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,null,"\"'"]],[["com",/^(?:--[^\n\r]*|\/\*[\S\s]*?(?:\*\/|$))/],["kwd",/^(?:add|all|alter|and|any|apply|as|asc|authorization|backup|begin|between|break|browse|bulk|by|cascade|case|check|checkpoint|close|clustered|coalesce|collate|column|commit|compute|connect|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|following|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|matched|merge|natural|national|nocheck|nonclustered|nocycle|not|null|nullif|of|off|offsets|on|open|opendatasource|openquery|openrowset|openxml|option|or|order|outer|over|partition|percent|pivot|plan|preceding|precision|primary|print|proc|procedure|public|raiserror|read|readtext|reconfigure|references|replication|restore|restrict|return|revoke|right|rollback|rowcount|rowguidcol|rows?|rule|save|schema|select|session_user|set|setuser|shutdown|some|start|statistics|system_user|table|textsize|then|to|top|tran|transaction|trigger|truncate|tsequal|unbounded|union|unique|unpivot|update|updatetext|use|user|using|values|varying|view|waitfor|when|where|while|with|within|writetext|xml)(?=[^\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"]);

+ 3 - 0
js/prettify/lang-tcl.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 \u00a0"],["str",/^"(?:[^"\\]|\\[\S\s])*(?:"|$)/,a,'"']],[["kwd",/^(?:after|append|apply|array|break|case|catch|continue|error|eval|exec|exit|expr|for|foreach|if|incr|info|proc|return|set|switch|trace|uplevel|upvar|while)\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]+/]]),["tcl"]);

+ 1 - 0
js/prettify/lang-tex.js

@@ -0,0 +1 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["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
js/prettify/lang-vb.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0\u2028\u2029]+/,null,"\t\n\r \u00a0\u2028\u2029"],["str",/^(?:["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})(?:["\u201c\u201d]c|$)|["\u201c\u201d](?:[^"\u201c\u201d]|["\u201c\u201d]{2})*(?:["\u201c\u201d]|$))/i,null,'"\u201c\u201d'],["com",/^['\u2018\u2019](?:_(?:\r\n?|[^\r]?)|[^\n\r_\u2028\u2029])*/,null,"'\u2018\u2019"]],[["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\b.*/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
js/prettify/lang-vhdl.js

@@ -0,0 +1,3 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"]],[["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
js/prettify/lang-wiki.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\d\t a-gi-z\xa0]+/,null,"\t \u00a0abcdefgijklmnopqrstuvwxyz0123456789"],["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"]);

File diff suppressed because it is too large
+ 1 - 0
js/prettify/lang-xq.js


+ 2 - 0
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
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}

+ 30 - 0
js/prettify/prettify.js

@@ -0,0 +1,30 @@
+!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.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),e=[],a=
+b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b[a],c.push(g(h[0])),
+h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1))&&l<=h&&
+(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9,n:10,v:11,
+f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m[j++<<1|1]=
+a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.charAt(0)];
+if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.length;c<i;++c){var r=
+g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
+q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d.push(["com",
+/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+
+s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.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",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b(a,c){var d=
+c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var r=j.createElement("ol");
+r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c,a.i),b=g.a;
+a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType!==1&&(G=x.substring(g,
+t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inline,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"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],
+O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"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"],
+Q=[y,"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"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,
+V=/\S/,X=v({keywords:[M,O,E,"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",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["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"]);p(C([["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"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:R}),
+["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({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:2}),["perl","pl","pm"]);p(v({keywords:Q,
+hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({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,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);
+p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,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",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j:g,c:b,i:1});
+return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f.test(o.tagName)&&
+o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J(d,u,o);r=
+{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code|xmp)$/i,
+h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()

+ 34 - 0
js/prettify/run_prettify.js

@@ -0,0 +1,34 @@
+!function(){var r=null;
+(function(){function X(e){function j(){try{J.doScroll("left")}catch(e){P(j,50);return}w("poll")}function w(j){if(!(j.type=="readystatechange"&&x.readyState!="complete")&&((j.type=="load"?n:x)[z](i+j.type,w,!1),!m&&(m=!0)))e.call(n,j.type||j)}var Y=x.addEventListener,m=!1,C=!0,t=Y?"addEventListener":"attachEvent",z=Y?"removeEventListener":"detachEvent",i=Y?"":"on";if(x.readyState=="complete")e.call(n,"lazy");else{if(x.createEventObject&&J.doScroll){try{C=!n.frameElement}catch(A){}C&&j()}x[t](i+"DOMContentLoaded",
+w,!1);x[t](i+"readystatechange",w,!1);n[t](i+"load",w,!1)}}function Q(){S&&X(function(){var e=K.length;$(e?function(){for(var j=0;j<e;++j)(function(e){P(function(){n.exports[K[e]].apply(n,arguments)},0)})(j)}:void 0)})}for(var n=window,P=n.setTimeout,x=document,J=x.documentElement,L=x.head||x.getElementsByTagName("head")[0]||J,z="",A=x.scripts,m=A.length;--m>=0;){var M=A[m],T=M.src.match(/^[^#?]*\/run_prettify\.js(\?[^#]*)?(?:#.*)?$/);if(T){z=T[1]||"";M.parentNode.removeChild(M);break}}var S=!0,D=
+[],N=[],K=[];z.replace(/[&?]([^&=]+)=([^&]+)/g,function(e,j,w){w=decodeURIComponent(w);j=decodeURIComponent(j);j=="autorun"?S=!/^[0fn]/i.test(w):j=="lang"?D.push(w):j=="skin"?N.push(w):j=="callback"&&K.push(w)});m=0;for(z=D.length;m<z;++m)(function(){var e=x.createElement("script");e.onload=e.onerror=e.onreadystatechange=function(){if(e&&(!e.readyState||/loaded|complete/.test(e.readyState)))e.onerror=e.onload=e.onreadystatechange=r,--R,R||P(Q,0),e.parentNode&&e.parentNode.removeChild(e),e=r};e.type=
+"text/javascript";e.src="https://google-code-prettify.googlecode.com/svn/loader/lang-"+encodeURIComponent(D[m])+".js";L.insertBefore(e,L.firstChild)})(D[m]);for(var R=D.length,A=[],m=0,z=N.length;m<z;++m)A.push("https://google-code-prettify.googlecode.com/svn/loader/skins/"+encodeURIComponent(N[m])+".css");A.push("https://google-code-prettify.googlecode.com/svn/loader/prettify.css");(function(e){function j(m){if(m!==w){var n=x.createElement("link");n.rel="stylesheet";n.type="text/css";if(m+1<w)n.error=
+n.onerror=function(){j(m+1)};n.href=e[m];L.appendChild(n)}}var w=e.length;j(0)})(A);var $=function(){window.PR_SHOULD_USE_CONTINUATION=!0;var e;(function(){function j(a){function d(f){var b=f.charCodeAt(0);if(b!==92)return b;var a=f.charAt(1);return(b=i[a])?b:"0"<=a&&a<="7"?parseInt(f.substring(1),8):a==="u"||a==="x"?parseInt(f.substring(2),16):f.charCodeAt(1)}function h(f){if(f<32)return(f<16?"\\x0":"\\x")+f.toString(16);f=String.fromCharCode(f);return f==="\\"||f==="-"||f==="]"||f==="^"?"\\"+f:
+f}function b(f){var b=f.substring(1,f.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),f=[],a=b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,g=b.length;a<g;++a){var k=b[a];if(/\\[bdsw]/i.test(k))c.push(k);else{var k=d(k),o;a+2<g&&"-"===b[a+1]?(o=d(b[a+2]),a+=2):o=k;f.push([k,o]);o<65||k>122||(o<65||k>90||f.push([Math.max(65,k)|32,Math.min(o,90)|32]),o<97||k>122||f.push([Math.max(97,k)&-33,Math.min(o,122)&-33]))}}f.sort(function(f,a){return f[0]-
+a[0]||a[1]-f[1]});b=[];g=[];for(a=0;a<f.length;++a)k=f[a],k[0]<=g[1]+1?g[1]=Math.max(g[1],k[1]):b.push(g=k);for(a=0;a<b.length;++a)k=b[a],c.push(h(k[0])),k[1]>k[0]&&(k[1]+1>k[0]&&c.push("-"),c.push(h(k[1])));c.push("]");return c.join("")}function e(f){for(var a=f.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],g=0,k=0;g<c;++g){var o=a[g];o==="("?++k:"\\"===o.charAt(0)&&(o=+o.substring(1))&&(o<=k?d[o]=-1:a[g]=h(o))}for(g=
+1;g<d.length;++g)-1===d[g]&&(d[g]=++j);for(k=g=0;g<c;++g)o=a[g],o==="("?(++k,d[k]||(a[g]="(?:")):"\\"===o.charAt(0)&&(o=+o.substring(1))&&o<=k&&(a[g]="\\"+d[o]);for(g=0;g<c;++g)"^"===a[g]&&"^"!==a[g+1]&&(a[g]="");if(f.ignoreCase&&F)for(g=0;g<c;++g)o=a[g],f=o.charAt(0),o.length>=2&&f==="["?a[g]=b(o):f!=="\\"&&(a[g]=o.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var j=0,F=!1,l=!1,I=0,c=a.length;I<c;++I){var p=a[I];if(p.ignoreCase)l=
+!0;else if(/[a-z]/i.test(p.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){F=!0;l=!1;break}}for(var i={b:8,t:9,n:10,v:11,f:12,r:13},q=[],I=0,c=a.length;I<c;++I){p=a[I];if(p.global||p.multiline)throw Error(""+p);q.push("(?:"+e(p)+")")}return RegExp(q.join("|"),l?"gi":"g")}function m(a,d){function h(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)h(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)e[l]="\n",F[l<<1]=j++,F[l++<<1|1]=a}}else if(c==
+3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),e[l]=c,F[l<<1]=j,j+=c.length,F[l++<<1|1]=a)}var b=/(?:^|\s)nocode(?:\s|$)/,e=[],j=0,F=[],l=0;h(a);return{a:e.join("").replace(/\n$/,""),d:F}}function n(a,d,h,b){d&&(a={a:d,e:a},h(a),b.push.apply(b,a.g))}function x(a){for(var d=void 0,h=a.firstChild;h;h=h.nextSibling)var b=h.nodeType,d=b===1?d?a:h:b===3?S.test(h.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function h(a){for(var l=a.e,j=[l,"pln"],c=
+0,p=a.a.match(e)||[],m={},q=0,f=p.length;q<f;++q){var B=p[q],y=m[B],u=void 0,g;if(typeof y==="string")g=!1;else{var k=b[B.charAt(0)];if(k)u=B.match(k[1]),y=k[0];else{for(g=0;g<i;++g)if(k=d[g],u=B.match(k[1])){y=k[0];break}u||(y="pln")}if((g=y.length>=5&&"lang-"===y.substring(0,5))&&!(u&&typeof u[1]==="string"))g=!1,y="src";g||(m[B]=y)}k=c;c+=B.length;if(g){g=u[1];var o=B.indexOf(g),H=o+g.length;u[2]&&(H=B.length-u[2].length,o=H-g.length);y=y.substring(5);n(l+k,B.substring(0,o),h,j);n(l+k+o,g,A(y,
+g),j);n(l+k+H,B.substring(H),h,j)}else j.push(l+k,y)}a.g=j}var b={},e;(function(){for(var h=a.concat(d),l=[],i={},c=0,p=h.length;c<p;++c){var m=h[c],q=m[3];if(q)for(var f=q.length;--f>=0;)b[q.charAt(f)]=m;m=m[1];q=""+m;i.hasOwnProperty(q)||(l.push(m),i[q]=r)}l.push(/[\S\s]/);e=j(l)})();var i=d.length;return h}function t(a){var d=[],h=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,
+r,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,r,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,r,"\"'"]);a.verbatimStrings&&h.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,r]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,r,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,
+r,"#"]),h.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,r])):d.push(["com",/^#[^\n\r]*/,r,"#"]));a.cStyleComments&&(h.push(["com",/^\/\/[^\n\r]*/,r]),h.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,r]));if(b=a.regexLiterals){var e=(b=b>1?"":"\n\r")?".":"[\\S\\s]";h.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+
+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+e+"|\\x5B(?:[^\\x5C\\x5D"+b+"]|\\x5C"+e+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&h.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&h.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),r]);d.push(["pln",/^\s+/,r," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");h.push(["lit",/^@[$_a-z][\w$@]*/i,r],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,r],["pln",/^[$_a-z][\w$@]*/i,r],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,
+r,"0123456789"],["pln",/^\\[\S\s]?/,r],["pun",RegExp(b),r]);return C(d,h)}function z(a,d,h){function b(a){var c=a.nodeType;if(c==1&&!j.test(a.className))if("br"===a.nodeName)e(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&h){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(l.createTextNode(d),a.nextSibling),e(a),c||a.parentNode.removeChild(a)}}
+function e(a){function b(a,c){var d=c?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),h=a.nextSibling;f.appendChild(d);for(var e=h;e;e=h)h=e.nextSibling,f.appendChild(e)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var j=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,l=a.ownerDocument,i=l.createElement("li");a.firstChild;)i.appendChild(a.firstChild);for(var c=[i],p=0;p<c.length;++p)b(c[p]);d===(d|0)&&c[0].setAttribute("value",
+d);var n=l.createElement("ol");n.className="linenums";for(var d=Math.max(0,d-1|0)||0,p=0,q=c.length;p<q;++p)i=c[p],i.className="L"+(p+d)%10,i.firstChild||i.appendChild(l.createTextNode("\u00a0")),n.appendChild(i);a.appendChild(n)}function i(a,d){for(var h=d.length;--h>=0;){var b=d[h];U.hasOwnProperty(b)?V.console&&console.warn("cannot override language handler %s",b):U[b]=a}}function A(a,d){if(!a||!U.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return U[a]}function D(a){var d=
+a.h;try{var h=m(a.c,a.i),b=h.a;a.a=b;a.d=h.d;a.e=0;A(d,b)(a);var e=/\bMSIE\s(\d+)/.exec(navigator.userAgent),e=e&&+e[1]<=8,d=/\n/g,i=a.a,j=i.length,h=0,l=a.d,n=l.length,b=0,c=a.g,p=c.length,t=0;c[p]=j;var q,f;for(f=q=0;f<p;)c[f]!==c[f+2]?(c[q++]=c[f++],c[q++]=c[f++]):f+=2;p=q;for(f=q=0;f<p;){for(var x=c[f],y=c[f+1],u=f+2;u+2<=p&&c[u+1]===y;)u+=2;c[q++]=x;c[q++]=y;f=u}c.length=q;var g=a.c,k;if(g)k=g.style.display,g.style.display="none";try{for(;b<n;){var o=l[b+2]||j,H=c[t+2]||j,u=Math.min(o,H),E=l[b+
+1],W;if(E.nodeType!==1&&(W=i.substring(h,u))){e&&(W=W.replace(d,"\r"));E.nodeValue=W;var Z=E.ownerDocument,s=Z.createElement("span");s.className=c[t+1];var z=E.parentNode;z.replaceChild(s,E);s.appendChild(E);h<o&&(l[b+1]=E=Z.createTextNode(i.substring(u,o)),z.insertBefore(E,s.nextSibling))}h=u;h>=o&&(b+=2);h>=H&&(t+=2)}}finally{if(g)g.style.display=k}}catch(v){V.console&&console.log(v&&v.stack||v)}}var V=window,G=["break,continue,do,else,for,if,return,while"],O=[[G,"auto,case,char,const,default,double,enum,extern,float,goto,inline,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"],J=[O,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],K=[O,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient"],
+L=[K,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],O=[O,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],M=[G,"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"],
+N=[G,"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"],R=[G,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],G=[G,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],Q=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/,
+S=/\S/,T=t({keywords:[J,L,O,"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",M,N,G],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),U={};i(T,["default-code"]);i(C([],[["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"]);i(C([["pln",/^\s+/,r," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,r,"\"'"]],[["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"]);i(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);i(t({keywords:J,hashComments:!0,cStyleComments:!0,types:Q}),["c","cc","cpp","cxx","cyc","m"]);i(t({keywords:"null,true,false"}),["json"]);i(t({keywords:L,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:Q}),
+["cs"]);i(t({keywords:K,cStyleComments:!0}),["java"]);i(t({keywords:G,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);i(t({keywords:M,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);i(t({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:2}),["perl","pl","pm"]);i(t({keywords:N,
+hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);i(t({keywords:O,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);i(t({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,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);i(t({keywords:R,cStyleComments:!0,multilineStrings:!0}),["rc","rs","rust"]);
+i(C([],[["str",/^[\S\s]+/]]),["regex"]);var X=V.PR={createSimpleLexer:C,registerLangHandler:i,sourceDecorator:t,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",prettyPrintOne:function(a,d,e){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;e&&z(b,e,!0);D({h:d,j:e,c:b,i:1});return b.innerHTML},
+prettyPrint:e=e=function(a,d){function e(){for(var b=V.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;p<j.length&&c.now()<b;p++){for(var d=j[p],m=k,l=d;l=l.previousSibling;){var n=l.nodeType,s=(n===7||n===8)&&l.nodeValue;if(s?!/^\??prettify\b/.test(s):n!==3||/\S/.test(l.nodeValue))break;if(s){m={};s.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){m[b]=c});break}}l=d.className;if((m!==k||f.test(l))&&!w.test(l)){n=!1;for(s=d.parentNode;s;s=s.parentNode)if(g.test(s.tagName)&&s.className&&f.test(s.className)){n=
+!0;break}if(!n){d.className+=" prettyprinted";n=m.lang;if(!n){var n=l.match(q),A;if(!n&&(A=x(d))&&u.test(A.tagName))n=A.className.match(q);n&&(n=n[1])}if(y.test(d.tagName))s=1;else var s=d.currentStyle,v=i.defaultView,s=(s=s?s.whiteSpace:v&&v.getComputedStyle?v.getComputedStyle(d,r).getPropertyValue("white-space"):0)&&"pre"===s.substring(0,3);v=m.linenums;if(!(v=v==="true"||+v))v=(v=l.match(/\blinenums\b(?::(\d+))?/))?v[1]&&v[1].length?+v[1]:!0:!1;v&&z(d,v,s);t={h:n,c:d,j:v,i:s};D(t)}}}p<j.length?
+P(e,250):"function"===typeof a&&a()}for(var b=d||document.body,i=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],j=[],m=0;m<b.length;++m)for(var l=0,n=b[m].length;l<n;++l)j.push(b[m][l]);var b=r,c=Date;c.now||(c={now:function(){return+new Date}});var p=0,t,q=/\blang(?:uage)?-([\w.]+)(?!\S)/,f=/\bprettyprint\b/,w=/\bprettyprinted\b/,y=/pre|xmp/i,u=/^code$/i,g=/^(?:pre|code|xmp)$/i,k={};e()}};typeof define==="function"&&define.amd&&
+define("google-code-prettify",[],function(){return X})})();return e}();R||P(Q,0)})();}()

+ 33 - 0
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
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);
+

+ 783 - 0
js/slide-deck.js

@@ -0,0 +1,783 @@
+/**
+ * @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.getCurrentSlideFromHash_();
+
+  // Call this explicitly. Modernizr.load won't be done until after DOM load.
+  this.onDomLoaded_.bind(this)();
+}
+
+/**
+ * @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(.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.
+
+  // Modernizr.touch isn't a sufficient check for devices that support both
+  // touch and mouse. Create the controller in all cases.
+  // // 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();
+      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;
+
+    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\/?>/, ' ');
+    if (settings.eventInfo && settings.eventInfo.title) {
+      document.title +=  ' - ' + settings.eventInfo.title;
+    }
+    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];
+
+      var presenterTitle = [p.name];
+      if (p.company) {
+        presenterTitle.push(p.company);
+      }
+      html = presenterTitle.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) {
+      dataConfigPresenter.innerHTML = html;
+      if (settings.eventInfo) {
+        var date = settings.eventInfo.date;
+        var dateInfo = date ? ' - <time>' + date + '</time>' : '';
+        dataConfigPresenter.innerHTML += settings.eventInfo.title + dateInfo;
+      }
+    }
+  }
+
+  /* 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);
+};
+
+/**
+ * @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;
+  }
+
+};
+
+/**
+ * @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();
+    }
+  });
+})();

+ 36 - 0
js/slide-elastic.js

@@ -0,0 +1,36 @@
+(function(){
+    var slidesEl, minWidth, minHeight;
+
+    var resize = function() {
+        if (window.innerWidth < minWidth || window.innerHeight < minHeight) {
+            var sx = window.innerWidth / minWidth;
+            var sy = window.innerHeight / minHeight;
+            var transform = 'scale(' + Math.min(sx, sy) + ')';
+        } else {
+            var transform = 'none';
+        }
+
+        slidesEl.style.MozTransform = transform;
+        slidesEl.style.WebkitTransform = transform;
+        slidesEl.style.OTransform = transform;
+        slidesEl.style.msTransform = transform;
+        slidesEl.style.transform = transform;
+    }
+
+    var onLoad = function (list) {
+        if (document.readyState === 'complete') {
+            list();
+        } else {
+            window.addEventListener('load', list);
+        }
+    }
+
+    onLoad(function() {
+        slidesEl = document.getElementsByTagName('slides')[0];
+        minWidth = slidesEl.offsetWidth;
+        minHeight = slidesEl.offsetHeight;
+
+        resize();
+        window.addEventListener('resize', resize);
+    })
+})();

+ 5 - 0
js/slides.js

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

+ 26 - 0
slide_config.js

@@ -0,0 +1,26 @@
+var SLIDE_CONFIG = {
+   // Slide Settings
+   settings: {
+     title: 'Conversations', 
+     subtitle: 'chattare sul cellulare usando server autogestiti', 
+     useBuilds: true, // Default: true. False will turn off slide animation builds. 
+     usePrettify: true, // Default: true 
+     enableSlideAreas: true, // 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.
+     favIcon: 'false', 
+     fonts: [
+       'Open Sans:regular,semibold,italic,italicsemibold',
+       'Source Code Pro'
+     ],
+   }, 
+ 
+   // Author information
+   presenters: [{
+     name: 'lucha, nullpointer, i-330', 
+     company: 'HackIt 15-18 Giugno 2017', 
+     gplus: '', 
+     twitter: '', 
+     www: '', 
+     github: '', 
+   }]
+};

+ 825 - 0
slides.html

@@ -0,0 +1,825 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title></title>
+<!-- 2017-06-10 sáb 16:55 -->
+<meta  charset="utf-8" />
+<meta  htto-equiv="X-UA-Compatible" content="chrome=1" />
+<meta  name="generator" content="Org-mode with org-ioslide" />
+<meta  name="author" content="lucha, nullpointer, i-330" />
+
+
+<!--<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">-->
+<!--<meta name="viewport" content="width=device-width, initial-scale=1.0">-->
+<!--This one seems to work all the time, but really small on ipad-->
+<!--<meta name="viewport" content="initial-scale=0.4">-->
+<meta name="apple-mobile-web-app-capable" content="yes" />
+<link rel="stylesheet" media="all" href="theme/css/default.css" />
+<link rel="stylesheet" media="only screen and (max-device-width: 480px)" href="theme/css/phone.css" />
+<link rel="stylesheet" media="all" href="theme/css/small-icon.css" />
+<base target="_blank"> <!-- This amazingness opens all links in a new tab. -->
+<script data-main="js/slides" src="js/require-1.0.8.min.js"></script>
+
+   <script src="js/jquery-1.7.1.min.js" type="text/javascript"></script>
+</head>
+<body style="opacity: 0">
+<slides class="layout-widescreen">
+<slide class="title-slide segue nobackground">
+       <aside class="gdbar"><img src="images/conversations_logo.png"></aside>
+       <!-- The content of this hgroup is replaced programmatically through the slide_config.json. -->
+       <hgroup class="auto-fadein">
+         <h1 data-config-title><!-- populated from slide_config.json --></h1>
+         <h2 data-config-subtitle><!-- populated from slide_config.json --></h2>
+         <p data-config-presenter><!-- populated from slide_config.json --></p>
+       </hgroup>
+    </slide>
+  <slide id="sec-1" class=" segue dark quote nobackground" style="background-image: url(nil)">
+<aside class="gdbar right bottom"><img src="images/conversations_logo.png"></aside><hgroup class="">
+       <h2 class=" ">Che cos'è Conversations</h2>
+       <h3></h3>
+       </hgroup>
+<article class="flexbox vleft auto-fadein" id="text-1">
+
+
+</article>
+
+</slide>
+<slide id="sec-1-1"  >
+<hgroup class="">
+       <h2 class=" ">Che cos'è Conversations?</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-1-1">
+<p>
+Conversations<sup>1</sup> è una applicazione (app) open source (GPLv3) Android (4.0+) per chattare.
+</p>
+
+<p>
+A differenza di altre app (WhatsApp, Messegner, ma anche Signal), <span class="underline"><span class="underline">non</span></span> è
+legata ad un servizio centralizzato.
+</p>
+
+<p>
+Invece, si basa su un protocollo <b><b>federato</b></b> chiamato XMPP (Jabber
+per gli amici).
+</p>
+
+<p>
+Inoltre, ci permette di <b><b>cifrare</b></b> le nostre conversazioni, così come di fare
+chat di gruppo cifrate.
+</p>
+
+<footer class="source">
+<p class="footpara">1.
+<a href="https://conversations.im">https://conversations.im</a>
+</p>
+</footer>
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-1-2"  >
+<hgroup class="">
+       <h2 class=" ">XMPP: un protocollo federato</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-1-2">
+<p>
+Cosa vuol dire che XMPP è un protocollo federato?
+</p>
+
+<p>
+Pensiamo alle email: ognugno di noi ha un email con un diverso
+provider (autistici, riseup, google, poliziadistato.it).
+</p>
+
+<p>
+Se vogliamo mandare un'email a qualcuno che usa, per esempio, riseup.net,
+<span class="underline"><span class="underline">non</span></span> è necessario avere noi stessi una casella di riseup! Possiamo usare la
+nostra email di autistici.
+</p>
+
+<p>
+Il server di autistici parlará con il server di riseup e gli consegnerà la
+nostra email. Allo stesso modo chi ha ricevuto la posta potrà risponderci.
+</p>
+
+<p>
+Questo non è il caso di Facebook Messenger (per esempio): se voglio mandare un
+messaggio ad una mia amica su Messenger, dovró per forza registrarmi su
+Facebook.
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-1-3"  >
+<hgroup class="">
+       <h2 class=" ">Conversations e i server autogestiti</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-1-3">
+<p>
+Questo vuol dire che possiamo utilizzare Conversations con il nostro provider
+alternativo che più ci aggrada.
+</p>
+
+<p>
+Noi oggi parleremo di Autistici/Inventati ma ognuno può scegliere il suo
+preferito: il bello di una rete federata è che non ci dobbiamo tutti fidare di
+uno stesso gestore.
+</p>
+
+<p>
+Se vogliamo, possiamo anche installarci un server in casa ed essere i provider
+di noi stessi!
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-1-4"  >
+<hgroup class="">
+       <h2 class=" ">Conversations.im</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-1-4">
+<blockquote>
+<p>
+Conversations isn’t trying to replace current commercial
+messengers.
+</p>
+
+<p>
+It will simply outlive them.
+</p>
+
+<p>
+<span class='float-right'>&#x2013; Daniel "inputmice" Gultsch</span><br  />
+</p>
+</blockquote>
+
+<article class="flexbox vcenter">
+
+<div class="figure">
+<p><img src="images/conversations.im.png" alt="conversations.im.png" width="700px" />
+</p>
+</div>
+</article>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-1-5"  >
+<hgroup class="">
+       <h2 class=" ">Ok, mi hai convinto, dove devo firmare?</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-1-5">
+<p>
+Quello che vedremo adesso è
+</p>
+
+<ol>
+<li>Come installare Conversations
+</li>
+<li>Come configurare il proprio utente
+</li>
+<li>Aggiungere i contatti e chattare
+</li>
+<li>Fare una chat cifrata di gruppo
+</li>
+<li>foto, audio, video(?)
+</li>
+<li>I rischi che corriamo usando Conversations
+</li>
+</ol>
+
+
+</article>
+
+</slide>
+
+</slide>
+
+</slide>
+<slide id="sec-2" class=" segue dark quote nobackground" style="background-image: url(nil)">
+<aside class="gdbar right bottom"><img src="images/conversations_logo.png"></aside><hgroup class="">
+       <h2 class=" ">Installare Conversations</h2>
+       <h3></h3>
+       </hgroup>
+<article class="flexbox vleft auto-fadein" id="text-2">
+
+
+</article>
+
+</slide>
+<slide id="sec-2-1"  >
+<hgroup class="">
+       <h2 class=" ">Come installare conversations</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-2-1">
+<p>
+Dobbiamo avere uno smartphone con Android versione 4.0 o successive
+</p>
+
+<p>
+Abbiamo due opzioni per installare Conversations
+</p>
+
+<ol>
+<li>via Google Play
+</li>
+<li>via F-Droid
+</li>
+</ol>
+
+
+</article>
+
+</slide>
+
+
+</slide>
+<slide id="sec-2-2"  >
+<hgroup class="">
+       <h2 class=" ">Google Play</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-2-2">
+
+<div class="figure">
+<p><img src="images/gplay.png" alt="gplay.png" class="float-right" width="250px" />
+</p>
+</div>
+
+<p>
+Google Play è comodo (è già installato di default) ma dobbiamo avere
+un account di Google per usarlo
+</p>
+
+<p>
+Anche se Conversations è open source, su Google Play è in vendita per
+una modica somma (2.39€)
+</p>
+
+<p>
+In questo modo si sostiene lo sviluppo di Conversations<sup>1</sup>
+</p>
+
+<footer class="source">
+<p class="footpara">1.
+Daniel Gultsch sviluppa Conversations a tempo pieno.
+</p>
+</footer>
+</article>
+
+</slide>
+
+
+</slide>
+<slide id="sec-2-3"  >
+<hgroup class="">
+       <h2 class=" ">F-Droid</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-2-3">
+<p>
+F-Droid è un repository alternativo a Google Play, dove troviamo solo
+programmi open source
+</p>
+
+<p>
+Conversations è disponibile gratuitamente (ma ricordiamoci di fare una
+donazione, se possiamo, per garantire lo sviluppo!)
+</p>
+
+<p>
+Per utilizzare F-Droid, dobbiamo prima dire al nostro cellulare di
+accettare app non provenienti da Google Play
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-2-4"  >
+<hgroup class="">
+       <h2 class=" ">Impostazioni</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-2-4">
+
+<div class="figure">
+<p><img src="images/android-external-app.png" alt="android-external-app.png" width="450px" class="float-left" />
+</p>
+</div>
+
+
+<div class="figure">
+<p><img src="images/android-alert.png" alt="android-alert.png" width="450px" class="float-right" />
+</p>
+</div>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-2-5"  >
+<hgroup class="">
+       <h2 class=" ">Installare F-Droid</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-2-5">
+<p>
+A questo punto possiamo installare F-Droid da <a href="https://f-droid.org">https://f-droid.org</a>
+</p>
+
+<article class="flexbox vcenter">
+
+<div class="figure">
+<p><img src="images/f-droid.png" alt="f-droid.png" width="700px" />
+</p>
+</div>
+</article>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-2-6"  >
+<hgroup class="">
+       <h2 class=" ">Installare Conversations da F-Droid</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-2-6">
+
+<div class="figure">
+<p><img src="images/f-droid-conversations.png" alt="f-droid-conversations.png" width="250px" class="float-right" />
+</p>
+</div>
+
+<p>
+Apriamo la app di F-Droid e da lì possiamo trovare ed installare Conversations
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+
+</slide>
+<slide id="sec-3" class=" segue dark quote nobackground" style="background-image: url(nil)">
+<aside class="gdbar right bottom"><img src="images/conversations_logo.png"></aside><hgroup class="">
+       <h2 class=" ">Configurare il proprio utente</h2>
+       <h3></h3>
+       </hgroup>
+<article class="flexbox vleft auto-fadein" id="text-3">
+
+
+</article>
+
+</slide>
+<slide id="sec-3-1"  >
+<hgroup class="">
+       <h2 class=" ">Configurazione Base</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-3-1">
+<p>
+<img src="images/Conversations_1.png" alt="Conversations_1.png" width="250px" class="float-right" />
+Una volta installato Conversations, la prima schermata che vedremo
+sarà questa.
+</p>
+
+<p>
+"Create account" ci permetterà di creare un account del tipo
+<i>nomeutente@conversations.im</i> per 8€/anno (+ 6 mesi gratuiti).
+</p>
+
+<p>
+Per utilizzare invece un account che già abbiamo, sceglieremo "Use
+my own provider".
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-3-2"  >
+<hgroup class="">
+       <h2 class=" ">Configurazione Base</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-3-2">
+
+<div class="figure">
+<p><img src="images/Conversations_2.png" alt="Conversations_2.png" width="250px" class="float-right" />
+</p>
+</div>
+
+<p>
+Qui inseriremo il nostro utente <code>nomeutente@autistici.org</code> e la
+nostra password.
+</p>
+
+<p>
+(Se siamo preoccupati di lasciare la password sul cellulare,
+Autistici ha l'opzione di usare OTP e password specifiche per applicazioni)
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+
+
+</slide>
+<slide id="sec-4" class=" segue dark quote nobackground" style="background-image: url(nil)">
+<aside class="gdbar right bottom"><img src="images/conversations_logo.png"></aside><hgroup class="">
+       <h2 class=" ">La prima chat: aggiungere un contatto</h2>
+       <h3></h3>
+       </hgroup>
+<article class="flexbox vleft auto-fadein" id="text-4">
+
+
+</article>
+
+</slide>
+<slide id="sec-4-1"  >
+<hgroup class="">
+       <h2 class=" ">Aggiungere un contatto</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-4-1">
+<p>
+I contatti su Conversations sono identificati dal loro indirizzo
+XMMP, che di solito è uguale all'indirizzo email
+</p>
+
+<p>
+Per esempio, <code>lucha@paranoici.org</code> è il <span class="underline">Jabber ID</span>
+</p>
+
+<p>
+Possiamo aggiungere un contatto alla nostra lista usando il tasto
+"+" che appare in alto a destra,  e poi il tasto "+(sagoma di persona)"
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-4-2"  >
+<hgroup class="">
+       <h2 class=" ">La prima chat cifrata</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-4-2">
+
+<div class="figure">
+<p><img src="images/Conversations_8.png" alt="Conversations_8.png" width="250px" class="float-right" />
+</p>
+</div>
+
+<p>
+Adesso possiamo chattare con il nostro nuovo contatto
+</p>
+
+<p>
+Per abilitare le cifratura, selezioniamo il lucchetto presente in
+alto a destra, e scegliamo <code>OMEMO</code>
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-4-3"  >
+<hgroup class="">
+       <h2 class=" ">La prima chat cifrata</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-4-3">
+
+<div class="figure">
+<p><img src="images/Conversations_9.png" alt="Conversations_9.png" width="250px" class="float-right" />
+</p>
+</div>
+
+<p>
+Ora la nostra conversazione sarà cifrata: il nostro provider XMMP
+non potrà leggere i nostri messaggi!
+</p>
+
+<p>
+La cifratura avviene sul nostro cellulare, prima che il messaggio
+venga trasmesso, e viene decodificato solo una volta che arriva al
+destinatario.
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-4-4"  >
+<hgroup class="">
+       <h2 class=" ">Verificare la chiave di un contatto</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-4-4">
+<p>
+Se vogliamo essere veramente sicuri di stare parlando con la
+persona giusta, possiamo incontrarci con lei e confrontare le
+chiavi OMEMO (o possiamo usare altri canali di comunicazione:
+telefono, email cifrate, etc.)
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+
+</slide>
+<slide id="sec-5" class=" segue dark quote nobackground" style="background-image: url(nil)">
+<aside class="gdbar right bottom"><img src="images/conversations_logo.png"></aside><hgroup class="">
+       <h2 class=" ">Le chat di gruppo</h2>
+       <h3></h3>
+       </hgroup>
+<article class="flexbox vleft auto-fadein" id="text-5">
+
+
+</article>
+
+</slide>
+<slide id="sec-5-1"  >
+<hgroup class="">
+       <h2 class=" ">I gruppi</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-5-1">
+<p>
+Conversations supporta chat tra più persone, e possiamo anche farle
+cifrate!
+</p>
+
+<p>
+Per iniziare una chat di gruppo, selezioniamo lo stesso tasto "+"
+che abbiamo usato per agiungere un contatto, ma selezioniamo la
+scheda "conferences" e clicchiamo sul tasto "+(sagoma di tante persone)"
+</p>
+
+<p>
+Selezioniamo "Create conference" e poi possiamo scegliere i
+partecipanti
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-5-2"  >
+<hgroup class="">
+       <h2 class=" ">I gruppi cifrati</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-5-2">
+<p>
+Purtroppo per fare una chat di gruppo cifrata, è necessario che
+tutti i partecipanti abbiano fatto una chat individuale con tutti
+gli altri
+</p>
+
+<p>
+Questo serve per inizializzare il sistema di cifratura
+</p>
+
+<p>
+Non è molto comodo e facilmente crea confusione, ma una volta
+iniziate le chat di gruppo funzionano abbastanza bene
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+
+</slide>
+<slide id="sec-6" class=" segue dark quote nobackground" style="background-image: url(nil)">
+<aside class="gdbar right bottom"><img src="images/conversations_logo.png"></aside><hgroup class="">
+       <h2 class=" ">Foto, audio, video(?)</h2>
+       <h3></h3>
+       </hgroup>
+<article class="flexbox vleft auto-fadein" id="text-6">
+
+
+</article>
+
+</slide>
+<slide id="sec-6-1"  >
+<hgroup class="">
+       <h2 class=" ">Allegare foto</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-6-1">
+<p>
+Possiamo allegare foto (sia dalla galleria sia dalla fotocamera)
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-6-2"  >
+<hgroup class="">
+       <h2 class=" ">Audio</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-6-2">
+<p>
+Possiamo registrare dell'audio, ma per questo è necessario
+installare un apposito plugin (1.22€ su Google Play, gratis su
+F-Droid)
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-6-3"  >
+<hgroup class="">
+       <h2 class=" ">Video</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-6-3">
+<p>
+Conversations (al contrario di Signal) non supporta chiamate audio
+né video.
+</p>
+
+<p>
+È possibile però condividere file di qualsiasi tipo, quindi anche
+video, pdf, etc.
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+
+</slide>
+<slide id="sec-7" class=" segue dark quote nobackground" style="background-image: url(nil)">
+<aside class="gdbar right bottom"><img src="images/conversations_logo.png"></aside><hgroup class="">
+       <h2 class=" ">Avvertenze: i rischi e la sicurezza</h2>
+       <h3></h3>
+       </hgroup>
+<article class="flexbox vleft auto-fadein" id="text-7">
+
+
+</article>
+
+</slide>
+<slide id="sec-7-1"  >
+<hgroup class="">
+       <h2 class=" ">Che rischi corriamo se usiamo Conversations?</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-7-1">
+<p>
+Nonostante tutto, ci sono dei rischi a cui ci esponiamo quando
+utilizziamo Conversations:
+</p>
+<ul class="build">
+<li>metadati: la lista dei nostri contatti è visibile dal provider che
+usiamo
+</li>
+<li>i provider dei nostri contatti: se parliamo con qualcuno su un altro
+server, quest'ultimo potrebbe loggare tutto il possibile
+</li>
+<li>i messaggi cifrati sono in chiaro sul nostro cellulare: possiamo
+perderlo, od essere infettati da un trojan
+</li>
+<li>il falso senso di sicurezza
+</li>
+</ul>
+
+
+</article>
+
+</slide>
+
+</slide>
+
+</slide>
+<slide id="sec-8" class=" segue dark quote nobackground" style="background-image: url(nil)">
+<aside class="gdbar right bottom"><img src="images/conversations_logo.png"></aside><hgroup class="">
+       <h2 class=" ">Extendend track</h2>
+       <h3></h3>
+       </hgroup>
+<article class="flexbox vleft auto-fadein" id="text-8">
+<p>
+Configurazioni avanzate e dettagli
+</p>
+
+
+</article>
+</slide>
+<slide id="sec-8-1"  >
+<hgroup class="">
+       <h2 class=" ">Configurazione con Hidden Service</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-8-1">
+
+<div class="figure">
+<p><img src="images/Conversations_4.png" alt="Conversations_4.png" width="250px" class="float-right" />
+</p>
+</div>
+
+<p>
+C'è anche l'opzione di collegarsi via Hidden Service TOR, se
+abbiamo l'applicazione <b>Orbot</b> installata.
+</p>
+
+<p>
+Menu -&gt; Expert Settings -&gt; Connect via Tor e Extended Connection Settings
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide id="sec-8-2"  >
+<hgroup class="">
+       <h2 class=" ">Configurazione con Hidden Service</h2>
+       <h3></h3>
+       </hgroup>
+<article class="" id="text-8-2">
+
+<div class="figure">
+<p><img src="images/Conversations_5.png" alt="Conversations_5.png" width="250px" class="float-right" />
+</p>
+</div>
+
+<p>
+Inseriamo <code>wi7qkxyrdpu5cmvr.onion</code> come <i>Hostname</i> e <code>5222</code> come <i>Port</i>
+</p>
+
+
+</article>
+
+</slide>
+
+</slide>
+<slide class="backdrop"></slide>
+</slides>
+<!--[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>
+
+</html>

+ 277 - 12
slides.org

@@ -1,22 +1,34 @@
+* Slide Options                           :noexport:
 #+TITLE: Conversations
 #+SUBTITLE: chattare sul cellulare usando server autogestiti
-#+AUTHOR: lucha, nullpointer, i330
-#+DATE: HackIt 15-18 Giugno 2017
+#+AUTHOR: lucha, nullpointer, i-330
+#+COMPANY: HackIt 15-18 Giugno 2017
 #+LANGUAGE: it
+#+USE_MATHJAX: false
+#+ICON: images/conversations_logo.png
+#+FAVICON: false
+#+EXCLUDE_TAGS: noexport
+#+OPTIONS: toc:nil num:nil
+
 
 * Che cos'è Conversations
+  :PROPERTIES:
+  :SLIDE:    segue dark quote
+  :ASIDE:    right bottom
+  :ARTICLE:  flexbox vleft auto-fadein
+  :END:
 
-** Conversations
-Conversations è una applicazione (app) open source (GPLv3) Android (4.0+) per chattare.
+** Che cos'è Conversations?
+Conversations[fn:2] è una applicazione (app) open source (GPLv3) Android (4.0+) per chattare.
 
 A differenza di altre app (WhatsApp, Messegner, ma anche Signal), __non__ è
-legata ad un servizio centralizzato
+legata ad un servizio centralizzato.
 
-Invece, si basa su un protocollo __federato__ chiamato XMPP (Jabber
-per gli amici)
+Invece, si basa su un protocollo **federato** chiamato XMPP (Jabber
+per gli amici).
 
-Inoltre, ci permette di __cifrare__ le nostre conversazioni, così come di fare
-chat di gruppo cifrate
+Inoltre, ci permette di **cifrare** le nostre conversazioni, così come di fare
+chat di gruppo cifrate.
 
 ** XMPP: un protocollo federato
 
@@ -36,10 +48,10 @@ Questo non è il caso di Facebook Messenger (per esempio): se voglio mandare un
 messaggio ad una mia amica su Messenger, dovró per forza registrarmi su
 Facebook.
 
-** Conversations e i server autogestii
+** Conversations e i server autogestiti
 
 Questo vuol dire che possiamo utilizzare Conversations con il nostro provider
-alternativo che più ci aggrada
+alternativo che più ci aggrada.
 
 Noi oggi parleremo di Autistici/Inventati ma ognuno può scegliere il suo
 preferito: il bello di una rete federata è che non ci dobbiamo tutti fidare di
@@ -48,25 +60,278 @@ uno stesso gestore.
 Se vogliamo, possiamo anche installarci un server in casa ed essere i provider
 di noi stessi!
 
+** Conversations.im
+#+BEGIN_QUOTE
+Conversations isn’t trying to replace current commercial
+messengers.
+
+It will simply outlive them.
+
+-- Daniel "inputmice" Gultsch
+#+END_QUOTE
+
+#+BEGIN_CENTER
+#+ATTR_HTML: :width 700px
+[[file:images/conversations.im.png]]
+#+END_CENTER
+
 ** Ok, mi hai convinto, dove devo firmare?
 
 Quello che vedremo adesso è
+
 1. Come installare Conversations
 2. Come configurare il proprio utente
 3. Aggiungere i contatti e chattare
 4. Fare una chat cifrata di gruppo
 5. foto, audio, video(?)
-6. I rischi che corriamo
+6. I rischi che corriamo usando Conversations
 
 * Installare Conversations
+  :PROPERTIES:
+  :SLIDE:    segue dark quote
+  :ASIDE:    right bottom
+  :ARTICLE:  flexbox vleft auto-fadein
+  :END:
+
+** Come installare conversations
+
+Dobbiamo avere uno smartphone con Android versione 4.0 o successive
+
+Abbiamo due opzioni per installare Conversations
+
+1. via Google Play
+2. via F-Droid
+
+
+** Google Play
+
+#+ATTR_HTML: :width 250px
+#+ATTR_HTML: :class float-right
+[[file:images/gplay.png]]
+
+Google Play è comodo (è già installato di default) ma dobbiamo avere
+un account di Google per usarlo
+
+Anche se Conversations è open source, su Google Play è in vendita per
+una modica somma (2.39€)
+
+In questo modo si sostiene lo sviluppo di Conversations[fn:1]
+
+
+** F-Droid
 
+F-Droid è un repository alternativo a Google Play, dove troviamo solo
+programmi open source
+
+Conversations è disponibile gratuitamente (ma ricordiamoci di fare una
+donazione, se possiamo, per garantire lo sviluppo!)
+
+Per utilizzare F-Droid, dobbiamo prima dire al nostro cellulare di
+accettare app non provenienti da Google Play
+
+** Impostazioni
+
+#+ATTR_HTML: :class float-left
+#+ATTR_HTML: :width 450px
+[[file:images/android-external-app.png]]
+
+#+ATTR_HTML: :class float-right
+#+ATTR_HTML: :width 450px
+[[file:images/android-alert.png]]
+
+** Installare F-Droid
+
+A questo punto possiamo installare F-Droid da https://f-droid.org
+
+#+BEGIN_CENTER
+#+ATTR_HTML: :width 700px
+[[file:images/f-droid.png]]
+#+END_CENTER
+
+** Installare Conversations da F-Droid
+   #+ATTR_HTML: :class float-right
+   #+ATTR_HTML: :width 250px
+   [[file:images/f-droid-conversations.png]]
+
+   Apriamo la app di F-Droid e da lì possiamo trovare ed installare Conversations
 
 * Configurare il proprio utente
+  :PROPERTIES:
+  :SLIDE:    segue dark quote
+  :ASIDE:    right bottom
+  :ARTICLE:  flexbox vleft auto-fadein
+  :END:
+
+** Configurazione Base
+   #+ATTR_HTML: :class float-right
+   #+ATTR_HTML: :width 250px
+   [[file:images/Conversations_1.png]]
+   Una volta installato Conversations, la prima schermata che vedremo
+   sarà questa.
+
+   "Create account" ci permetterà di creare un account del tipo
+   /nomeutente@conversations.im/ per 8€/anno (+ 6 mesi gratuiti).
+
+   Per utilizzare invece un account che già abbiamo, sceglieremo "Use
+   my own provider".
+
+** Configurazione Base
+   #+ATTR_HTML: :class float-right
+   #+ATTR_HTML: :width 250px
+   [[file:images/Conversations_2.png]]
+
+   Qui inseriremo il nostro utente =nomeutente@autistici.org= e la
+   nostra password.
+
+   (Se siamo preoccupati di lasciare la password sul cellulare,
+   Autistici ha l'opzione di usare OTP e password specifiche per applicazioni)
+
 
 * La prima chat: aggiungere un contatto
+  :PROPERTIES:
+  :SLIDE:    segue dark quote
+  :ASIDE:    right bottom
+  :ARTICLE:  flexbox vleft auto-fadein
+  :END:
+
+** Aggiungere un contatto
+
+   I contatti su Conversations sono identificati dal loro indirizzo
+   XMMP, che di solito è uguale all'indirizzo email
+
+   Per esempio, =lucha@paranoici.org= è il _Jabber ID_
+
+   Possiamo aggiungere un contatto alla nostra lista usando il tasto
+   "+" che appare in alto a destra,  e poi il tasto "+(sagoma di persona)"
+
+** La prima chat cifrata
+   #+ATTR_HTML: :class float-right
+   #+ATTR_HTML: :width 250px
+   [[file:images/Conversations_8.png]]
+
+   Adesso possiamo chattare con il nostro nuovo contatto
+
+   Per abilitare le cifratura, selezioniamo il lucchetto presente in
+   alto a destra, e scegliamo =OMEMO=
+
+** La prima chat cifrata
+   #+ATTR_HTML: :class float-right
+   #+ATTR_HTML: :width 250px
+   [[file:images/Conversations_9.png]]
+
+   Ora la nostra conversazione sarà cifrata: il nostro provider XMMP
+   non potrà leggere i nostri messaggi!
+
+   La cifratura avviene sul nostro cellulare, prima che il messaggio
+   venga trasmesso, e viene decodificato solo una volta che arriva al
+   destinatario.
+
+** Verificare la chiave di un contatto
+
+   Se vogliamo essere veramente sicuri di stare parlando con la
+   persona giusta, possiamo incontrarci con lei e confrontare le
+   chiavi OMEMO (o possiamo usare altri canali di comunicazione:
+   telefono, email cifrate, etc.)
 
 * Le chat di gruppo
+  :PROPERTIES:
+  :SLIDE:    segue dark quote
+  :ASIDE:    right bottom
+  :ARTICLE:  flexbox vleft auto-fadein
+  :END:
+
+** I gruppi
+   Conversations supporta chat tra più persone, e possiamo anche farle
+   cifrate!
+
+   Per iniziare una chat di gruppo, selezioniamo lo stesso tasto "+"
+   che abbiamo usato per agiungere un contatto, ma selezioniamo la
+   scheda "conferences" e clicchiamo sul tasto "+(sagoma di tante persone)"
+
+   Selezioniamo "Create conference" e poi possiamo scegliere i
+   partecipanti
+
+** I gruppi cifrati
+
+   Purtroppo per fare una chat di gruppo cifrata, è necessario che
+   tutti i partecipanti abbiano fatto una chat individuale con tutti
+   gli altri
+
+   Questo serve per inizializzare il sistema di cifratura
+
+   Non è molto comodo e facilmente crea confusione, ma una volta
+   iniziate le chat di gruppo funzionano abbastanza bene
 
 * Foto, audio, video(?)
+  :PROPERTIES:
+  :SLIDE:    segue dark quote
+  :ASIDE:    right bottom
+  :ARTICLE:  flexbox vleft auto-fadein
+  :END:
+
+** Allegare foto
+   Possiamo allegare foto (sia dalla galleria sia dalla fotocamera)
+
+** Audio
+   Possiamo registrare dell'audio, ma per questo è necessario
+   installare un apposito plugin (1.22€ su Google Play, gratis su
+   F-Droid)
+
+** Video
+
+   Conversations (al contrario di Signal) non supporta chiamate audio
+   né video.
+
+   È possibile però condividere file di qualsiasi tipo, quindi anche
+   video, pdf, etc.
 
 * Avvertenze: i rischi e la sicurezza
+  :PROPERTIES:
+  :SLIDE:    segue dark quote
+  :ASIDE:    right bottom
+  :ARTICLE:  flexbox vleft auto-fadein
+  :END:
+
+** Che rischi corriamo se usiamo Conversations?
+
+Nonostante tutto, ci sono dei rischi a cui ci esponiamo quando
+utilizziamo Conversations:
+#+ATTR_HTML: :class build
+- metadati: la lista dei nostri contatti è visibile dal provider che
+  usiamo
+- i provider dei nostri contatti: se parliamo con qualcuno su un altro
+  server, quest'ultimo potrebbe loggare tutto il possibile
+- i messaggi cifrati sono in chiaro sul nostro cellulare: possiamo
+  perderlo, od essere infettati da un trojan.
+- il falso senso di sicurezza
+
+* Extendend track
+  :PROPERTIES:
+  :SLIDE:    segue dark quote
+  :ASIDE:    right bottom
+  :ARTICLE:  flexbox vleft auto-fadein
+  :END:
+  Configurazioni avanzate e dettagli
+** Configurazione con Hidden Service
+   #+ATTR_HTML: :class float-right
+   #+ATTR_HTML: :width 250px
+   [[file:images/Conversations_4.png]]
+
+   C'è anche l'opzione di collegarsi via Hidden Service TOR, se
+   abbiamo l'applicazione *Orbot* installata.
+
+   Menu -> Expert Settings -> Connect via Tor e Extended Connection Settings
+
+** Configurazione con Hidden Service
+   #+ATTR_HTML: :class float-right
+   #+ATTR_HTML: :width 250px
+   [[file:images/Conversations_5.png]]
+
+   Inseriamo =wi7qkxyrdpu5cmvr.onion= come /Hostname/ e =5222= come /Port/
+
+
+* Footnotes
+
+[fn:1] Daniel Gultsch sviluppa Conversations a tempo pieno.
+
+[fn:2] https://conversations.im

File diff suppressed because it is too large
+ 0 - 0
theme/css/default.css


+ 1 - 0
theme/css/io2013.css

@@ -0,0 +1 @@
+*{line-height:1.3}h2{font-weight:bold}h2,h3{color:#515151}q,blockquote{font-weight:bold}slides>slide{color:#515151}slides>slide.title-slide:after{content:'';background:url(../../images/io2013/google-io-lockup-1.png) no-repeat 100% 50%;-moz-background-size:contain;-o-background-size:contain;-webkit-background-size:contain;background-size:contain;position:absolute;bottom:80px;right:40px;width:100%;height:90px}slides>slide.title-slide hgroup h1{font-weight:bold;line-height:1.1}slides>slide.title-slide hgroup h2,slides>slide.title-slide hgroup p{color:#515151}slides>slide.title-slide hgroup h2{margin-top:0.25em}slides>slide.title-slide hgroup p{margin-top:3em}

+ 1 - 0
theme/css/phone.css

@@ -0,0 +1 @@
+slides>slide{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;-webkit-transition:none !important;transition:none !important}

+ 15 - 0
theme/css/small-icon.css

@@ -0,0 +1,15 @@
+slides > slide:not(.nobackground):before {
+background: url(../../false) no-repeat 0 50%;
+font-size: 12pt;
+content: "";
+position: absolute;
+bottom: 20px;
+left: 60px;
+-moz-background-size: 30px 30px;
+-o-background-size: 30px 30px;
+-webkit-background-size: 30px 30px;
+background-size: 30px 30px;
+padding-left: 40px;
+height: 30px;
+line-height: 1.9;
+}

+ 138 - 0
theme/scss/_base.scss

@@ -0,0 +1,138 @@
+@charset "UTF-8";
+
+@import "compass/css3/border-radius";
+@import "compass/css3/box";
+@import "compass/css3/box-shadow";
+@import "compass/css3/box-sizing";
+@import "compass/css3/images";
+@import "compass/css3/text-shadow";
+@import "compass/css3/background-size";
+@import "compass/css3/transform";
+@import "compass/css3/transition";
+
+@import "variables";
+
+@mixin font-smoothing($val: antialiased) {
+  -webkit-font-smoothing: $val;
+  -moz-font-smoothing: $val;
+  -ms-font-smoothing: $val;
+  -o-font-smoothing: $val;
+}
+
+@mixin flexbox {
+  display: -webkit-box !important;
+  display: -moz-box !important;
+  display: -ms-box !important;
+  display: -o-box !important;
+  display: box !important;
+}
+
+@mixin flex-center-center {
+  @include box-orient(vertical);
+  @include box-align(center);
+  @include box-pack(center);
+}
+
+@mixin flex-left-center {
+  @include box-orient(vertical);
+  @include box-align(left);
+  @include box-pack(center);
+}
+
+@mixin flex-right-center {
+  @include box-orient(vertical);
+  @include box-align(end);
+  @include box-pack(center);
+}
+
+/**
+ * Base SlideDeck Styles
+ */
+html {
+  height: 100%;
+  overflow: hidden;
+}
+
+body {
+  margin: 0;
+  padding: 0;
+
+  opacity: 0;
+
+  height: 100%;
+  min-height: 740px;
+  width: 100%;
+
+  overflow: hidden;
+
+  color: #fff;
+  @include font-smoothing(antialiased);
+  @include transition(opacity 800ms ease-in 100ms); // Add small delay to prevent jank.
+
+  &.loaded {
+    opacity: 1 !important;
+  }
+}
+
+input, button {
+  vertical-align: middle;
+}
+
+slides > slide[hidden] {
+  display: none !important;
+}
+
+slides {
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  left: 0;
+  top: 0;
+  @include transform(translate3d(0, 0, 0));
+  @include perspective(1000);
+  @include transform-style(preserve-3d);
+  @include transition(opacity 800ms ease-in 100ms); // Add small delay to prevent jank.
+}
+
+slides > slide {
+  display: block;
+  position: absolute;
+  overflow: hidden;
+  left: 50%;
+  top: 50%;
+  @include 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;
+}
+*/

+ 40 - 0
theme/scss/_variables.scss

@@ -0,0 +1,40 @@
+$social-tags: '';
+$brand-small-icon-size: 30px;
+
+$gray-0: #efefef;
+$gray-1: #e6e6e6;
+$gray-2: #a9a9a9;
+$gray-3: #797979;
+$gray-4: #515151;
+
+$brand-blue: rgb(67, 135, 253);
+$brand-blue-secondary: #3c8ef3;
+$brand-blue-secondary2: #2a7cdf;
+
+$brand-red: rgb(244, 74, 63);
+$brand-red-secondary: #e0543e;
+$brand-red-secondary2: #d94d3a;
+
+$brand-yellow: rgb(255, 209, 77);
+$brand-yellow-secondary: #f9cc46;
+$brand-yellow-secondary2: #f6c000;
+
+$brand-green: rgb(13, 168, 97);
+$brand-green-secondary: #00a86d;
+$brand-green-secondary2: #009f5d;
+
+$hiroko-table-header: #9DC8C8;
+$hiroko-table-odd: #E3FFEA;
+
+$hiroko-highlight: #ffff99;
+
+$slide-width: 900px;
+$slide-height: 700px;
+$slide-width-widescreen: 1100px;
+$slide-top-bottom-padding: 40px;
+$slide-left-right-padding: 60px;
+$slide-border-radius: 5px;
+
+$slide-tap-area-width: 100px;
+
+$article-content-top-padding: 45px;

+ 1131 - 0
theme/scss/default.scss

@@ -0,0 +1,1131 @@
+@import "base";
+@import "compass/css3/columns";
+@import "compass/css3/user-interface";
+
+@mixin highlight-color($color: $brand-yellow) {
+    -webkit-tap-highlight-color: $color;
+    -moz-tap-highlight-color: $color;
+    -ms-tap-highlight-color: $color;
+    -o-tap-highlight-color: $color;
+    tap-highlight-color: $color;
+}
+
+@mixin backdrop {
+    @include background(linear-gradient(white, white 85%, $gray-1));
+    background-color: white;
+}
+
+
+/**
+ * Theme Styles
+ */
+::selection {
+    color: white;
+    background-color: $brand-yellow;
+    @include text-shadow(none);
+}
+
+::-webkit-scrollbar {
+    height: 16px;
+    overflow: visible;
+    width: 16px;
+}
+::-webkit-scrollbar-thumb {
+    background-color: rgba(0, 0, 0, .1);
+    background-clip: padding-box;
+    border: solid transparent;
+    min-height: 28px;
+    padding: 100px 0 0;
+    @include box-shadow(inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07));
+    border-width: 1px 1px 1px 6px;
+}
+::-webkit-scrollbar-thumb:hover {
+    background-color: rgba(0, 0, 0, 0.5);
+}
+::-webkit-scrollbar-button {
+    height: 0;
+    width: 0;
+}
+::-webkit-scrollbar-track {
+    background-clip: padding-box;
+    border: solid transparent;
+    border-width: 0 0 0 4px;
+}
+::-webkit-scrollbar-corner {
+    background: transparent;
+}
+
+body {
+    background: black;
+}
+
+slides > slide {
+    display: none;
+    font-family: 'Open Sans', Arial, sans-serif;
+    font-size: 26px;
+    color: $gray-3;
+    //@include background(linear-gradient(white, white 85%, $gray-1));
+    //background-color: white;
+    width: $slide-width;
+    height: $slide-height;
+    margin-left: -$slide-width / 2;
+    margin-top: -$slide-height / 2;
+    padding: $slide-top-bottom-padding $slide-left-right-padding;
+
+    @include border-radius($slide-border-radius);
+    //@include box-shadow(5px 5px 20px $gray-4);
+    @include transition(all 0.6s ease-in-out);
+
+    //$translateX: 1020px;
+    //$rotateY: 30deg;
+    //$rotateX: 45deg;
+
+    &.far-past {
+	//display: block;
+	display: none;
+	//@include transform(translate(-$translateX * 2));
+	//@include transform(translate3d(-$translateX * 2, 0, 0));
+    }
+
+    &.past {
+	display: block;
+	//@include transform(translate(-$translateX) rotateY($rotateY) rotateX($rotateX));
+	//@include transform(translate3d(-$translateX, 0, 0) rotateY($rotateY) rotateX($rotateX));
+	opacity: 0;
+    }
+
+    &.current {
+	display: block;
+	//@include transform(translate(0));
+	//@include transform(translate3d(0, 0, 0));
+	opacity: 1;
+
+	.auto-fadein {
+	    opacity: 1;
+	}
+
+	.gdbar {
+	    @include background-size(100% 100%);
+	}
+    }
+
+    &.next {
+	display: block;
+	//@include transform(translate($translateX) rotateY(-$rotateY) rotateX($rotateX));
+	//@include transform(translate3d($translateX, 0, 0) rotateY(-$rotateY) rotateX($rotateX));
+	opacity: 0;
+	pointer-events: none;
+    }
+
+    &.far-next {
+	//display: block;
+	display: none;
+	//@include transform(translate($translateX * 2));
+	//@include transform(translate3d($translateX * 2, 0, 0));
+    }
+
+    &.dark {
+	background: $gray-4 !important;
+    }
+
+    &:not(.nobackground) {
+	//background: white url(../../images/google_developers_icon_128.png) ($brand-small-icon-size * 2) 98% no-repeat;
+	//@include background-size($brand-small-icon-size $brand-small-icon-size);
+
+	&:before {
+	    font-size: 12pt;
+	    content: $social-tags;
+	    position: absolute;
+	    bottom: $slide-top-bottom-padding / 2;
+	    left: $slide-left-right-padding;
+	    background: url(../../images/google_developers_icon_128.png) no-repeat 0 50%;
+	    @include background-size($brand-small-icon-size $brand-small-icon-size);
+	    padding-left: $brand-small-icon-size + 10;
+	    height: $brand-small-icon-size;
+	    line-height: 1.9;
+	}
+	&:after {
+	    font-size: 12pt;
+	    content: attr(data-slide-num) '/' attr(data-total-slides);
+	    position: absolute;
+	    bottom: $slide-top-bottom-padding / 2;
+	    right: $slide-left-right-padding;
+	    line-height: 1.9;
+	}
+    }
+
+    &.title-slide {
+	&:after {
+	    content: '';
+	    //background: url(../../images/io2012_logo.png) no-repeat 100% 50%;
+	    //@include background-size(contain);
+	    position: absolute;
+	    bottom: $slide-top-bottom-padding;
+	    right: $slide-top-bottom-padding;
+	    width: 100%;
+	    height: 60px;
+	}
+    }
+
+    &.backdrop {
+	z-index: -10;
+	display: block !important;
+	@include backdrop;
+
+	&:after, &:before {
+		     display: none; // Prevent double set of slide nums and footer icons.
+		 }
+    }
+
+    > hgroup + article {
+	margin-top: $article-content-top-padding;
+
+	&.flexbox {
+	    &.vcenter, &.vleft, &.vright {
+		height: 80%;
+	    }
+	}
+
+	p {
+	    margin-bottom: 1em;
+	}
+    }
+
+    > article:only-child {
+	height: 100%;
+
+	> iframe {
+	    height: 98%;
+	}
+    }
+}
+
+slides.layout-faux-widescreen > slide {
+    padding: $slide-top-bottom-padding 160px;
+}
+
+slides.layout-widescreen,
+slides.layout-faux-widescreen {
+
+    $translateX: 1130px;
+
+    > slide {
+	margin-left: -$slide-width-widescreen / 2;
+	width: $slide-width-widescreen;
+    }
+
+    > slide.far-past {
+	display: block;
+	display: none;
+	@include transform(translate(-$translateX * 2));
+	@include transform(translate3d(-$translateX * 2, 0, 0));
+    }
+
+    > slide.past {
+	display: block;
+	//@include transform(translate(-$translateX));
+	//@include transform(translate3d(-$translateX, 0, 0));
+	opacity: 0;
+    }
+
+    > slide.current {
+	display: block;
+	//@include transform(translate(0));
+	//@include transform(translate3d(0, 0, 0));
+	opacity: 1;
+    }
+
+    > slide.next {
+	display: block;
+	//@include transform(translate($translateX));
+	//@include transform(translate3d($translateX, 0, 0));
+	opacity: 0;
+	pointer-events: none;
+    }
+
+    > slide.far-next {
+	display: block;
+	display: none;
+	@include transform(translate($translateX * 2));
+	@include transform(translate3d($translateX * 2, 0, 0));
+    }
+
+    #prev-slide-area {
+	margin-left: -$slide-width-widescreen / 2 - $slide-tap-area-width;
+    }
+
+    #next-slide-area {
+	margin-left: $slide-width-widescreen / 2;
+    }
+}
+
+b {
+    font-weight: 600;
+}
+
+a {
+    color: $brand-blue-secondary2;
+    text-decoration: none;
+    border-bottom: 1px solid rgba(42, 124, 223, 0.5);
+
+    &:hover {
+	color: black !important;
+    }
+}
+
+h1, h2, h3 {
+    font-weight: 600;
+}
+
+h2 {
+    font-size: 45px;
+    line-height: 45px;
+    letter-spacing: -2px;
+    color: $gray-4;
+}
+
+h3 {
+    font-size: 30px;
+    letter-spacing: -1px;
+    line-height: 2;
+    font-weight: inherit;
+    color: $gray-3;
+}
+
+ul {
+    margin-bottom: 1.2em;
+    margin-left: 1.2em;
+    position: relative;
+
+    li {
+	ul {
+	    margin-left: 2em;
+	    margin-bottom: 1.2em;
+	}
+    }
+}
+
+ol {
+    margin-bottom: 1.2em;
+    margin-left: 1.2em;
+    position: relative;
+    li {
+	ol {
+	    margin-left: 2em;
+	    margin-bottom: 1.2em;
+	}
+    }
+}
+
+// Code highlighting only effects the current slide.
+.highlight-code slide.current {
+    pre > * {
+	opacity: 0.25;
+	@include transition(opacity 0.5s ease-in);
+    }
+    b {
+	opacity: 1;
+    }
+}
+
+pre {
+    font-family: 'Source Code Pro', 'Courier New', monospace;
+    font-size: 20px;
+    line-height: 28px;
+    padding: 10px 0 10px $slide-left-right-padding;
+    letter-spacing: -1px;
+    margin-bottom: 20px;
+    width: 106%;
+    background-color: $gray-1;
+    left: -$slide-left-right-padding;
+    position: relative;
+    @include box-sizing(border-box);
+    /*overflow: hidden;*/
+
+    &[data-lang]:after {
+	content: attr(data-lang);
+	background-color: $gray-2;
+	right: 0;
+	top: 0;
+	position: absolute;
+	font-size: 16pt;
+	color: white;
+	padding: 2px 25px;
+	text-transform: uppercase;
+    }
+}
+
+pre[data-lang="go"] {
+    color: #333;
+}
+
+code {
+    font-size: 95%;
+    font-family: 'Source Code Pro', 'Courier New', monospace;
+    color: $gray-4;
+    background-color: $gray-1;
+    padding:0 0.25em;
+    border-radius:0.1em;
+}
+
+iframe {
+    width: 100%;
+    height: $slide-height - ($slide-top-bottom-padding * 2) - ($article-content-top-padding * 2);
+    background: white;
+    border: 1px solid $gray-1;
+    @include box-sizing(border-box);
+}
+
+dt {
+    font-weight: bold;
+}
+
+button {
+    display: inline-block;
+    @include background(linear-gradient(#F9F9F9 40%, #E3E3E3 70%));
+    border: 1px solid $gray-2;
+    @include border-radius(3px);
+    padding: 5px 8px;
+    outline: none;
+    white-space: nowrap;
+    @include user-select(none);
+    cursor: pointer;
+    @include text-shadow(1px 1px #fff);
+    font-size: 10pt;
+}
+
+button:not(:disabled):hover {
+    border-color: $gray-4;
+}
+
+button:not(:disabled):active {
+    @include background(linear-gradient(#E3E3E3 40%, #F9F9F9 70%));
+}
+
+:disabled {
+    color: $gray-2;
+}
+
+.blue {
+    color: $brand-blue;
+}
+.blue2 {
+    color: $brand-blue-secondary;
+}
+.blue3 {
+    color: $brand-blue-secondary2;
+}
+.yellow {
+    color: $brand-yellow;
+}
+.yellow2 {
+    color: $brand-yellow-secondary;
+}
+.yellow3 {
+    color: $brand-yellow-secondary2;
+}
+.green {
+    color: $brand-green;
+}
+.green2 {
+    color: $brand-green-secondary;
+}
+.green3 {
+    color: $brand-green-secondary2;
+}
+.red {
+    color: $brand-red;
+}
+.red2 {
+    color: $brand-red-secondary;
+}
+.red3 {
+    color: $brand-red-secondary2;
+}
+.gray {
+    color: $gray-1;
+}
+.gray2 {
+    color: $gray-2;
+}
+.gray3 {
+    color: $gray-3;
+}
+.gray4 {
+    color: $gray-4;
+}
+
+.white {
+    color: white !important;
+}
+.black {
+    color: black !important;
+}
+
+.columns-2 {
+    @include column-count(2);
+}
+
+table {
+    width: 100%;
+    border-collapse: -moz-initial;
+    border-collapse: initial;
+    border-spacing: 2px;
+    border-bottom: none;
+    border-top: none;
+
+    tr > td:first-child, th {
+	font-weight: 600;
+	color: $gray-4;
+    }
+
+    tr:nth-child(odd) {
+	background-color: $hiroko-table-odd;
+    }
+
+    th {
+	color: white;
+	font-size: 0.8px;
+	background: $hiroko-table-header;
+    }
+
+    td, th {
+	font-size: 0.8em;
+	padding: 0.5em 0.5em;
+    }
+
+    td.highlight {
+	color: $gray-4;
+	background-color: $hiroko-highlight;
+    }
+
+    &.rows {
+	border-bottom: none;
+	border-right: 1px solid $gray-3;
+    }
+}
+
+q {
+    font-size: 45px;
+    line-height: 72px;
+
+    &:before {
+	content: '“';
+	position: absolute;
+	margin-left: -0.5em;
+    }
+    &:after {
+	content: '”';
+	position: absolute;
+	margin-left: 0.1em;
+    }
+}
+
+.footpara {
+    margin: 0;
+}
+
+slide.fill {
+    background-repeat: no-repeat;
+    @include border-radius($slide-border-radius);
+    @include background-size(cover);
+}
+
+/* Size variants */
+
+article.smaller {
+    p, ul, li {
+	font-size: 20px;
+	line-height: 24px;
+	letter-spacing: 0;
+    }
+    table {
+	td, th {
+	    font-size: 14px;
+	}
+    }
+    pre {
+	font-size: 15px;
+	line-height: 20px;
+	letter-spacing: 0;
+    }
+    q {
+	font-size: 40px;
+	line-height: 48px;
+
+	&:before, &:after {
+		      font-size: 60px;
+		  }
+    }
+}
+
+article.larger {
+    p, ul, li {
+	font-size: 36px;
+	line-height: 42px;
+	letter-spacing: 0;
+    }
+    table {
+	td, th {
+	    font-size: 20px;
+	}
+    }
+    pre {
+	font-size: 32px;
+	line-height: 36px;
+	letter-spacing: 0;
+    }
+    q {
+	font-size: 54px;
+	line-height: 60px;
+
+	&:before, &:after {
+		      font-size: 72px;
+		  }
+    }
+}
+
+article.large {
+    p, ul, li {
+	font-size: 42px;
+	line-height: 52px;
+	letter-spacing: 0;
+    }
+    table {
+	td, th {
+	    font-size: 26px;
+	}
+    }
+    pre {
+	font-size: 42px;
+	line-height: 52px;
+	letter-spacing: 0;
+    }
+    q {
+	font-size: 42px;
+	line-height: 52px;
+
+	&:before, &:after {
+		      font-size: 52px;
+		  }
+    }
+}
+
+
+
+/* Builds */
+
+.build {
+    > * {
+	@include transition(opacity 0.5s ease-in-out 0.2s);
+    }
+
+    .to-build {
+	opacity: 0;
+    }
+
+    .build-fade {
+	opacity: 0.3;
+
+	&:hover {
+	    opacity: 1.0;
+	}
+    }
+}
+
+.popup .next .build {
+    .to-build {
+	opacity: 1;
+    }
+
+    .build-fade {
+	opacity: 1;
+    }
+}
+
+/* Pretty print */
+
+.prettyprint .str, /* string content */
+.prettyprint .atv { /* a markup attribute value */
+    color: $brand-green-secondary2; //rgb(0, 138, 53);
+}
+.prettyprint .kwd, /* a keyword */
+.prettyprint .tag { /* a markup tag name */
+    color: rgb(0, 102, 204);
+}
+.prettyprint .com { /* a comment */
+    color: $gray-3; //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: $gray-4; //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: $brand-red-secondary2; //rgb(127, 0, 127);
+}
+.prettyprint .pln {
+    color: $gray-4;
+}
+
+.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;
+    @include flexbox;
+    @include flex-center-center;
+    @include border-radius($slide-border-radius);
+
+    @include box-sizing(border-box);
+    @include transform(translateY($slide-height / 2));@include transition(all 0.4s ease-in-out);
+
+    > section {
+	background: #fff;
+	@include border-radius($slide-border-radius);
+	@include box-shadow(0 0 10px $gray-3);
+	width: 60%;
+	padding: 2em;
+    }
+}
+
+// Speaker notes only show the current slide.
+.with-notes {
+
+    &.popup {
+
+	slides.layout-widescreen,
+	slides.layout-faux-widescreen {
+	    slide {
+		&.next {
+		    @include transform(translate3d($slide-width-widescreen / 2 + 140, 80px, 0) scale(0.35));
+		}
+		.note {
+		    @include transform(translate3d(300px, $slide-height + 100, 0) scale(1.5));
+		}
+	    }
+	}
+
+	slide {
+	    overflow: visible;
+	    background: white;
+	    @include transition(none); // No slide transition goodies when in presenter mode.
+	    pointer-events: none;
+	    @include transform-origin(0, 0); // For speaker note transition.
+
+	    &:not(.backdrop) {
+		@include transform(scale(0.6) translate3d(0.5em, 0.5em, 0));
+		@include box-shadow(0 0 10px $gray-3);
+	    }
+
+	    &.backdrop {
+		//@include background(linear-gradient($gray-1, white 30%, white 60%, $gray-1));
+		@include background-image(radial-gradient(50% 50%, #b1dfff 0%,
+							  $brand-blue 600px));
+	    }
+
+	    &.next {
+		@include transform(translate3d($slide-width / 2 + 120, 80px, 0) scale(0.35));
+		opacity: 1 !important;
+
+		.note {
+		    display: none !important; // Prevents seeing notes if we go to previous slide.
+		}
+	    }
+	}
+
+	.note {
+	    width: 109%;
+	    height: $slide-height / 2 - 90;
+	    background: $gray-1;
+	    padding: 0;
+
+	    @include box-shadow(0 0 10px $gray-3);
+
+	    @include transform(translate3d(250px, $slide-height + 100, 0) scale(1.5));
+	    @include transition(opacity 400ms ease-in-out);
+
+	    > section {
+		background: #fff;
+		@include border-radius($slide-border-radius);
+		height: 100%;
+		width: 100%;
+		@include box-sizing(border-box);
+		@include box-shadow(none);
+		overflow: auto;
+		padding: 1em;
+	    }
+	}
+    }
+
+    .note {
+	opacity: 1;
+	@include transform(translateY(0));
+	pointer-events: auto; // Allow people to do things like open links embedded in the speaker notes.
+    }
+}
+
+.source {
+    font-size: 14px;
+    color: $gray-2;
+    position: absolute;
+    bottom: $slide-top-bottom-padding + 30px;
+    left: $slide-left-right-padding;
+}
+
+.centered {
+    text-align: center;
+}
+
+.float-right {
+    float: right;
+}
+
+.float-left {
+    float: left;
+}
+
+.z-index-999 {
+    position: relative;
+    z-index: 999;
+}
+
+
+blockquote, p.verse {
+    font-style: italic;
+    font-family: 'Times New Roman', Times, serif !important;
+    padding: 1em 1em;
+    background-color: #FCF7E8;
+    border-left: 0.2em solid #C6BB9F;
+    color: #616161;
+    quotes: '\201C''\201D''\2018''\2019';
+    p {
+	margin-top: 0;
+	margin-bottom: 0 !important;
+    }
+}
+
+.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%, white 150%);
+}
+
+.flexbox {
+    @include flexbox;
+}
+
+.flexbox.vcenter {
+    @include flex-center-center;
+    height: 100%;
+    width: 100%;
+}
+
+.flexbox.vleft {
+    @include flex-left-center;
+    height: 100%;
+    width: 100%;
+}
+
+.flexbox.vright {
+    @include flex-right-center;
+    height: 100%;
+    width: 100%;
+}
+
+.auto-fadein {
+    @include transition(opacity 0.6s ease-in 1s);
+    opacity: 0;
+}
+
+/* Clickable/tappable areas */
+.slide-area {
+    z-index: 1000;
+
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: $slide-tap-area-width;
+    height: $slide-height;
+
+    left: 50%;
+    top: 50%;
+
+    cursor: pointer;
+    margin-top: -$slide-height / 2;
+
+    //@include highlight-color(rgba(51, 51, 51, 0.5));
+}
+#prev-slide-area {
+    margin-left: -$slide-width-widescreen / 2;
+    //@include border-radius(10px 0 0 10px);
+    //@include box-shadow(-5px 0 10px #222 inset);
+}
+#next-slide-area {
+    margin-left: $slide-width / 2;
+    //@include border-radius(0 10px 10px 0);
+    //@include box-shadow(5px 0 10px #222 inset);
+}
+
+/* ===== SLIDE CONTENT ===== */
+.logoslide {
+    img {
+	width: 383px;
+	height: 92px;
+    }
+}
+
+.segue {
+    padding: $slide-left-right-padding $slide-left-right-padding * 2;
+
+    h2 {
+	color: $gray-1;
+	font-size: 60px;
+    }
+    h3 {
+	color: $gray-1;
+	line-height: 2.8;
+    }
+    hgroup {
+	position: absolute;
+	bottom: 225px;
+    }
+}
+
+.thank-you-slide {
+    background: $brand-blue !important;
+    color: white;
+
+    h2 {
+	font-size: 60px;
+	color: inherit;
+    }
+
+    article > p {
+	margin-top: 2em;
+	font-size: 20pt;
+    }
+
+    > p {
+	position: absolute;
+	bottom: $slide-top-bottom-padding * 2;
+	font-size: 24pt;
+	line-height: 1.3;
+    }
+}
+
+aside.gdbar {
+    height: 97px;
+    width: 215px;
+    position: absolute;
+    left: -1px;
+    top: 125px;
+    @include border-radius(0 10px 10px 0);
+    @include background(linear-gradient(left, $gray-1, $gray-1) no-repeat);
+    @include background-size(0% 100%);
+    @include 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. */
+
+    &.right {
+	right: 0;
+	left: -moz-initial;
+	left: initial;
+	top: ($slide-height / 2) - 96; /* 96 is height of gray icon bar */
+	@include transform(rotateZ(180deg));
+
+	img {
+	    @include transform(rotateZ(180deg));
+	}
+    }
+
+    &.bottom {
+	top: -moz-initial;
+	top: initial;
+	bottom: $slide-left-right-padding;
+    }
+
+    img {
+	width: 85px;
+	height: 85px;
+	position: absolute;
+	right: 0;
+	margin: 8px 15px;
+    }
+}
+
+.title-slide {
+
+    hgroup {
+	bottom: 100px;
+
+	h1 {
+	    font-size: 65px;
+	    line-height: 1.4;
+	    letter-spacing: -3px;
+	    color: $gray-4;
+	}
+
+	h2 {
+	    font-size: 34px;
+	    color: $gray-2;
+	    font-weight: inherit;
+	}
+
+	p {
+	    font-size: 20px;
+	    color: $gray-3;
+	    line-height: 1.3;
+	    margin-top: 2em;
+	}
+    }
+}
+
+.quote {
+    color: $gray-1;
+
+    .author {
+	font-size: 24px;
+	position: absolute;
+	bottom: 80px;
+	line-height: 1.4;
+    }
+}
+
+[data-config-contact] {
+    a {
+	color: rgb(255, 255, 255);
+	border-bottom: none;
+    }
+    span {
+	width: 115px;
+	display: inline-block;
+    }
+}
+
+.overview {
+
+    &.popup {
+	.note {
+	    display: none !important;
+	}
+    }
+
+    slides {
+	slide {
+	    &.backdrop {
+		display: none !important;
+	    }
+
+	    display: block;
+	    cursor: pointer;
+	    opacity: 0.5;
+	    pointer-events: auto !important;
+
+	    @include backdrop();
+
+	    &.far-past,
+	    &.past,
+	    &.next,
+	    &.far-next,
+	    &.far-past {
+		opacity: 0.5;
+		display: block;
+	    }
+
+	    &.current {
+		opacity: 1;
+	    }
+	}
+    }
+
+    .slide-area {
+	display: none;
+    }
+}
+
+@media print {
+    slides {
+	slide {
+	    display: block !important;
+	    position: relative;
+	    @include backdrop();
+	    @include 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;
+
+	    &.far-past,
+	    &.past,
+	    &.next,
+	    &.far-next,
+	    &.far-past,
+	    &.current {
+		opacity: 1 !important;
+		display: block !important;
+	    }
+
+	    .build {
+		> * {
+		    @include transition(none);
+		}
+
+		.to-build,
+		.build-fade {
+		    opacity: 1;
+		}
+	    }
+
+	    .auto-fadein {
+		opacity: 1 !important;
+	    }
+
+	    &.backdrop {
+		display: none !important;
+	    }
+
+	    table.rows {
+		border-right: 0;
+	    }
+	}
+
+	slide[hidden] {
+	    display: none !important;
+	}
+    }
+
+    .slide-area {
+	display: none;
+    }
+
+    .reflect {
+	-webkit-box-reflect: none;
+	-moz-box-reflect: none;
+	-o-box-reflect: none;
+	-ms-box-reflect: none;
+	box-reflect: none;
+    }
+
+    pre, code {
+	font-family: monospace !important;
+    }
+}

+ 51 - 0
theme/scss/io2013.scss

@@ -0,0 +1,51 @@
+@import "compass/css3/background-size";
+
+@import "variables";
+
+* {
+  line-height: 1.3;
+}
+
+h2 {
+  font-weight: bold;
+}
+h2, h3 {
+  color: $gray-4;
+}
+
+q, blockquote {
+  font-weight: bold;
+}
+
+slides > slide {
+  color: $gray-4;
+
+  &.title-slide {
+    &:after {
+      content: '';
+      background: url(../../images/io2013/google-io-lockup-1.png) no-repeat 100% 50%;
+      @include background-size(contain);
+      position: absolute;
+      bottom: $slide-top-bottom-padding + 40;
+      right: $slide-top-bottom-padding;
+      width: 100%;
+      height: 90px;
+    }
+
+    hgroup {
+      h1 {
+        font-weight: bold;
+        line-height: 1.1;
+      }
+      h2, p {
+        color: $gray-4;
+      }
+      h2 {
+        margin-top: 0.25em;
+      }
+      p {
+        margin-top: 3em;
+      }
+    }
+  }
+}

+ 35 - 0
theme/scss/phone.scss

@@ -0,0 +1,35 @@
+@import "compass/css3/transition";
+
+
+/*Smartphones (portrait and landscape) ----------- */
+/*@media only screen
+and (min-width : 320px)
+and (max-width : 480px) {
+
+}*/
+
+/* Smartphones (portrait) ----------- */
+//@media only screen and (max-device-width: 480px) {
+/* Styles */
+//$slide-width: 350px;
+//$slide-height: 500px;
+
+slides > slide {
+/*  width: $slide-width !important;
+  height: $slide-height !important;
+  margin-left: -$slide-width / 2 !important;
+  margin-top: -$slide-height / 2 !important;
+*/
+  // Don't do full slide transitions on mobile.
+  -webkit-transition: none !important; // Bug in compass? Not sure why the below is not working
+  @include 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 */
+}

Some files were not shown because too many files changed in this diff