//https://github.com/inexorabletash/polyfill/blob/master/web.js

if (!document.querySelectorAll) {
  document.querySelectorAll = function (selectors) {
    var style = document.createElement('style'), elements = [], element;
    document.documentElement.firstChild.appendChild(style);
    document._qsa = [];

    style.styleSheet.cssText = selectors + '{x-qsa:expression(document._qsa && document._qsa.push(this))}';
    window.scrollBy(0, 0);
    style.parentNode.removeChild(style);

    while (document._qsa.length) {
      element = document._qsa.shift();
      element.style.removeAttribute('x-qsa');
      elements.push(element);
    }
    document._qsa = null;
    return elements;
  };
}

if (!document.querySelector) {
  document.querySelector = function (selectors) {
    var elements = document.querySelectorAll(selectors);
    return (elements.length) ? elements[0] : null;
  };
}

if (!document.getElementsByClassName) {
  document.getElementsByClassName = function (classNames) {
    classNames = String(classNames).replace(/^|\s+/g, '.');
    return document.querySelectorAll(classNames);
  };
}

//https://github.com/inexorabletash/polyfill // ES5 15.2.3.14 Object.keys ( O ) // developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys if (!Object.keys) {

Object.keys = function (o) {
  if (o !== Object(o)) { throw TypeError('Object.keys called on non-object'); }
  var ret = [], p;
  for (p in o) {
    if (Object.prototype.hasOwnProperty.call(o, p)) {
      ret.push(p);
    }
  }
  return ret;
};

}

//https://github.com/inexorabletash/polyfill/blob/master/web.js (function (global) {

var B64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
global.atob = global.atob || function (input) {
  input = String(input);
  var position = 0,
      output = [],
      buffer = 0, bits = 0, n;

  input = input.replace(/\s/g, '');
  if ((input.length % 4) === 0) { input = input.replace(/=+$/, ''); }
  if ((input.length % 4) === 1) { throw Error('InvalidCharacterError'); }
  if (/[^+/0-9A-Za-z]/.test(input)) { throw Error('InvalidCharacterError'); }

  while (position < input.length) {
    n = B64_ALPHABET.indexOf(input.charAt(position));
    buffer = (buffer << 6) | n;
    bits += 6;

    if (bits === 24) {
      output.push(String.fromCharCode((buffer >> 16) & 0xFF));
      output.push(String.fromCharCode((buffer >>  8) & 0xFF));
      output.push(String.fromCharCode(buffer & 0xFF));
      bits = 0;
      buffer = 0;
    }
    position += 1;
  }

  if (bits === 12) {
    buffer = buffer >> 4;
    output.push(String.fromCharCode(buffer & 0xFF));
  } else if (bits === 18) {
    buffer = buffer >> 2;
    output.push(String.fromCharCode((buffer >> 8) & 0xFF));
    output.push(String.fromCharCode(buffer & 0xFF));
  }

  return output.join('');
};

global.btoa = global.btoa || function (input) {
  input = String(input);
  var position = 0,
      out = [],
      o1, o2, o3,
      e1, e2, e3, e4;

  if (/[^\x00-\xFF]/.test(input)) { throw Error('InvalidCharacterError'); }

  while (position < input.length) {
    o1 = input.charCodeAt(position++);
    o2 = input.charCodeAt(position++);
    o3 = input.charCodeAt(position++);

    // 111111 112222 222233 333333
    e1 = o1 >> 2;
    e2 = ((o1 & 0x3) << 4) | (o2 >> 4);
    e3 = ((o2 & 0xf) << 2) | (o3 >> 6);
    e4 = o3 & 0x3f;

    if (position === input.length + 2) {
      e3 = 64; e4 = 64;
    }
    else if (position === input.length + 1) {
      e4 = 64;
    }

    out.push(B64_ALPHABET.charAt(e1),
             B64_ALPHABET.charAt(e2),
             B64_ALPHABET.charAt(e3),
             B64_ALPHABET.charAt(e4));
  }

  return out.join('');
};

}(this));

//https://gist.github.com/jimeh/332357 if (!Object.prototype.hasOwnProperty){

/*jshint -W001, -W103 */
Object.prototype.hasOwnProperty = function(prop) {
            var proto = this.__proto__ || this.constructor.prototype;
            return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
    };
/*jshint +W001, +W103 */

}

//requestAnimationFrame polyfill for older Firefox/Chrome versions if (!window.requestAnimationFrame) {

if (window.webkitRequestAnimationFrame) {
      //https://github.com/Financial-Times/polyfill-service/blob/master/polyfills/requestAnimationFrame/polyfill-webkit.js
      (function (global) {
        // window.requestAnimationFrame
        global.requestAnimationFrame = function (callback) {
                return webkitRequestAnimationFrame(function () {
                        callback(global.performance.now());
                });
        };

        // window.cancelAnimationFrame
        global.cancelAnimationFrame = webkitCancelAnimationFrame;
      }(this));
} else if (window.mozRequestAnimationFrame) {
        //https://github.com/Financial-Times/polyfill-service/blob/master/polyfills/requestAnimationFrame/polyfill-moz.js
      (function (global) {
        // window.requestAnimationFrame
        global.requestAnimationFrame = function (callback) {
                return mozRequestAnimationFrame(function () {
                        callback(global.performance.now());
                });
        };

        // window.cancelAnimationFrame
        global.cancelAnimationFrame = mozCancelAnimationFrame;
      }(this));
} else {
      (function (global) {
        global.requestAnimationFrame = function (callback) {
              return global.setTimeout(callback, 1000 / 60);
        };

        global.cancelAnimationFrame = global.clearTimeout;
      })(this);
}

}