text:
(function() {
  var _ref, _ref1, _ref2,
    __slice = [].slice;

  if ((_ref = window.Myna) == null) {
    window.Myna = {};
  }

  if ((_ref1 = Myna.debug) == null) {
    Myna.debug = false;
  }

  Myna.log = function() {
    var args, _ref2;

    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
    if (Myna.debug) {
      if ((_ref2 = window.console) != null) {
        _ref2.log(args);
      }
    }
  };

  Myna.error = function() {
    var args, _ref2;

    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
    if (Myna.debug) {
      if ((_ref2 = window.console) != null) {
        _ref2.error(args);
      }
    }
    throw args;
  };

  Myna.trim = function(str) {
    if (str === null) {
      return "";
    } else {
      return str.replace(/^\s+|\s+$/g, '');
    }
  };

  Myna.isArray = Array.isArray || function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  };

  Myna.isObject = function(obj) {
    return obj === Object(obj);
  };

  Myna.extend = function() {
    var des, key, sources, src, value, _i, _len;

    des = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
    for (_i = 0, _len = sources.length; _i < _len; _i++) {
      src = sources[_i];
      for (key in src) {
        value = src[key];
        des[key] = value;
      }
    }
    return des;
  };

  Myna.deleteKeys = function() {
    var ans, key, keys, obj, _i, _len;

    obj = arguments[0], keys = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
    ans = Myna.extend({}, obj);
    for (_i = 0, _len = keys.length; _i < _len; _i++) {
      key = keys[_i];
      delete ans[key];
    }
    return ans;
  };

  Myna.dateToString = function(date) {
    var day, hour, milli, minute, month, pad, second, year;

    if (Date.prototype.toISOString) {
      return date.toISOString();
    } else {
      pad = function(num, len) {
        var str;

        str = "" + num;
        while (str.length < len) {
          str = '0' + str;
        }
        return str;
      };
      year = pad(date.getUTCFullYear(), 4);
      month = pad(date.getUTCMonth() + 1, 2);
      day = pad(date.getUTCDate(), 2);
      hour = pad(date.getUTCHours(), 2);
      minute = pad(date.getUTCMinutes(), 2);
      second = pad(date.getUTCSeconds(), 2);
      milli = pad(date.getUTCMilliseconds(), 2);
      return "" + year + "-" + month + "-" + day + "T" + hour + ":" + minute + ":" + second + "." + milli + "Z";
    }
  };

  Myna.problem = function(msg) {
    return msg;
  };

  Myna.redirect = function(url) {
    return window.location.replace(url);
  };

  Myna.$ = (_ref2 = window.jQuery) != null ? _ref2 : null;

}).call(this);

(function() {
  Myna.parseHashParams = function(hash) {
    var ans, lhs, part, rhs, _i, _len, _ref, _ref1;

    if (hash == null) {
      hash = window.location.hash;
    }
    hash = !hash ? "" : hash[0] === "#" ? hash.substring(1) : hash;
    ans = {};
    _ref = hash.split("&");
    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
      part = _ref[_i];
      if (!(part !== "")) {
        continue;
      }
      _ref1 = part.split("="), lhs = _ref1[0], rhs = _ref1[1];
      ans[decodeURIComponent(lhs)] = decodeURIComponent(rhs != null ? rhs : lhs);
    }
    Myna.log("parseHashParams", ans);
    return ans;
  };

  Myna.hashParams = Myna.parseHashParams();

  if (Myna.hashParams["debug"]) {
    Myna.debug = true;
  }

  Myna.preview = function() {
    if (Myna.hashParams["preview"]) {
      Myna.cache.save("myna-preview", true);
      return true;
    } else {
      return !!Myna.cache.load("myna-preview");
    }
  };

  Myna.setPreview = function(preview) {
    Myna.cache.save("myna-preview", !!preview);
  };

}).call(this);

(function() {
  Myna.jsonp = {
    callbacks: {},
    counter: 0,
    createScriptElem: function(url, callbackName) {
      var scriptElem;

      scriptElem = document.createElement("script");
      scriptElem.setAttribute("type", "text/javascript");
      scriptElem.setAttribute("async", "true");
      scriptElem.setAttribute("src", url);
      scriptElem.setAttribute("class", "myna-jsonp");
      scriptElem.setAttribute("data-callback", callbackName);
      scriptElem.onload = scriptElem.onreadystatechange = function() {
        return Myna.jsonp.remove(callbackName, scriptElem);
      };
      return scriptElem;
    },
    request: function(options) {
      var callbackName, error, key, onComplete, onTimeout, params, returned, scriptElem, success, timeout, timer, url, urlRoot, value, _ref, _ref1, _ref2, _ref3, _ref4;

      if (options == null) {
        options = {};
      }
      urlRoot = (_ref = options.url) != null ? _ref : Myna.error("Myna.jsonp.request", "no url in options", options);
      success = (_ref1 = options.success) != null ? _ref1 : (function() {});
      error = (_ref2 = options.error) != null ? _ref2 : (function() {});
      timeout = (_ref3 = options.timeout) != null ? _ref3 : 10 * 1000;
      params = (_ref4 = options.params) != null ? _ref4 : {};
      callbackName = "callback" + (Myna.jsonp.counter++);
      returned = false;
      url = "" + urlRoot + "?";
      for (key in params) {
        value = params[key];
        url += "" + key + "=" + value + "&";
      }
      url += "callback=Myna.jsonp.callbacks." + callbackName;
      Myna.log("Myna.jsonp.request", url, success, error, timeout);
      scriptElem = Myna.jsonp.createScriptElem(url, callbackName);
      onTimeout = function() {
        if (returned) {
          return Myna.log("Myna.jsonp.request.onTimeout", callbackName, timeout, "already returned");
        } else {
          returned = true;
          Myna.log("Myna.jsonp.request.onTimeout", callbackName, timeout);
          Myna.jsonp.remove(callbackName, scriptElem);
          return error({
            typename: 'problem',
            status: 500,
            messages: [
              {
                typename: 'timeout',
                message: 'request timed out after #{timeout}ms',
                callback: callbackName
              }
            ]
          });
        }
      };
      if (timeout > 0) {
        timer = window.setTimeout(onTimeout, timeout);
      } else {
        timer = null;
      }
      onComplete = function(response) {
        if (returned) {
          return Myna.log("Myna.jsonp.request.onComplete", callbackName, "already returned");
        } else {
          returned = true;
          Myna.log("Myna.jsonp.request.onComplete", callbackName, response.typename, response.typename === "problem", response);
          window.clearTimeout(timer);
          Myna.jsonp.remove(callbackName, scriptElem);
          if (response.typename === "problem") {
            return error(response);
          } else {
            return success(response);
          }
        }
      };
      Myna.jsonp.callbacks[callbackName] = onComplete;
      document.getElementsByTagName("head")[0].appendChild(scriptElem);
    },
    remove: function(callbackName, scriptElem) {
      var readyState;

      if (callbackName == null) {
        callbackName = null;
      }
      if (scriptElem == null) {
        scriptElem = null;
      }
      readyState = scriptElem != null ? scriptElem.readyState : void 0;
      if (!(readyState && readyState !== "complete" && readyState !== "loaded")) {
        try {
          if (scriptElem) {
            scriptElem.onload = null;
            scriptElem.parentNode.removeChild(scriptElem);
          }
        } finally {
          if (callbackName) {
            delete Myna.jsonp.callbacks[callbackName];
          }
        }
      }
    }
  };

}).call(this);

(function() {
  var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    __slice = [].slice;

  Myna.Events = (function() {
    function Events() {
      this.off = __bind(this.off, this);
      this.on = __bind(this.on, this);
      this.triggerAsync = __bind(this.triggerAsync, this);
      this.trigger = __bind(this.trigger, this);      this.eventHandlers = {};
    }

    Events.prototype.trigger = function() {
      var args, cancel, event, handler, _i, _len, _ref, _ref1;

      event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
      Myna.log.apply(Myna, ["Myna.Events.trigger", event].concat(__slice.call(args)));
      cancel = false;
      _ref1 = (_ref = this.eventHandlers[event]) != null ? _ref : [];
      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
        handler = _ref1[_i];
        cancel = cancel || (handler.apply(this, args) === false);
      }
      if (cancel) {
        return false;
      } else {
        return void 0;
      }
    };

    Events.prototype.triggerAsync = function() {
      var args, error, event, success, triggerAll, _i, _ref,
        _this = this;

      event = arguments[0], args = 4 <= arguments.length ? __slice.call(arguments, 1, _i = arguments.length - 2) : (_i = 1, []), success = arguments[_i++], error = arguments[_i++];
      Myna.log.apply(Myna, ["Myna.Events.triggerAsync", event].concat(__slice.call(args)));
      triggerAll = function(handlers) {
        var head, rest;

        Myna.log("Myna.Events.triggerAsync.triggerAll", handlers);
        if (handlers.length === 0) {
          return success();
        } else {
          head = handlers[0], rest = 2 <= handlers.length ? __slice.call(handlers, 1) : [];
          return head.call.apply(head, [_this].concat(__slice.call(args), [(function() {
            return triggerAll(rest);
          })], [error]));
        }
      };
      return triggerAll((_ref = this.eventHandlers[event]) != null ? _ref : []);
    };

    Events.prototype.on = function(event, handler) {
      var _ref;

      this.eventHandlers[event] = ((_ref = this.eventHandlers[event]) != null ? _ref : []).concat([handler]);
      return Myna.log("Myna.Events.on", event, handler, this.eventHandlers[event]);
    };

    Events.prototype.off = function(event, handler) {
      var h;

      if (handler == null) {
        handler = null;
      }
      switch (arguments.length) {
        case 0:
          this.eventHandlers = {};
          break;
        case 1:
          delete this.eventHandlers[arguments[0]];
          break;
        default:
          event = arguments[0], handler = arguments[1];
          this.eventHandlers[event] = (function() {
            var _i, _len, _ref, _results;

            _ref = this.eventHandlers[event];
            _results = [];
            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
              h = _ref[_i];
              if (h !== handler) {
                _results.push(h);
              }
            }
            return _results;
          }).call(this);
      }
      return Myna.log("Myna.Events.off", event, handler, this.eventHandlers[event]);
    };

    return Events;

  })();

}).call(this);

(function() {
  'use strict';
  var Path,
    __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    __slice = [].slice,
    __hasProp = {}.hasOwnProperty,
    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

  Path = (function() {
    Path.identifierRegex = /^[a-z_$][a-z0-9_$]*/i;

    Path.integerRegex = /^[0-9]+/;

    Path.completeIdentifierRegex = /^[a-z_$][a-z0-9_$]*$/i;

    Path.permissiveIdentifierRegex = /^[^[.]+/;

    function Path(input) {
      this.toString = __bind(this.toString, this);
      this.drop = __bind(this.drop, this);
      this.take = __bind(this.take, this);
      this.isPrefixOf = __bind(this.isPrefixOf, this);
      this.prefixes = __bind(this.prefixes, this);
      this.unset = __bind(this.unset, this);
      this.set = __bind(this.set, this);
      this.get = __bind(this.get, this);
      this.path = __bind(this.path, this);
      this.quote = __bind(this.quote, this);      if (typeof input === "string") {
        this.nodes = Path.parse(input);
      } else {
        this.nodes = input;
      }
    }

    Path.isValid = function(path) {
      var exn;

      try {
        Path.parse(path);
        return true;
      } catch (_error) {
        exn = _error;
        return false;
      }
    };

    Path.normalize = function(path) {
      var exn;

      try {
        return new Path(path).toString();
      } catch (_error) {
        exn = _error;
        return path;
      }
    };

    Path.parse = function(originalPath) {
      var identifier, indexField, number, path, skip, string, take, takeString, topLevel;

      path = originalPath;
      skip = function(num) {
        if (path.length < num) {
          throw "bad settings path: " + originalPath;
        } else {
          path = path.substring(num);
        }
      };
      take = function(num) {
        var ans;

        if (path.length < num) {
          throw "bad settings path: " + originalPath;
        } else {
          ans = path.substring(0, num);
          path = path.substring(num);
          return ans;
        }
      };
      takeString = function(str) {
        path = path.substring(str.length);
        return str;
      };
      identifier = function() {
        var match;

        match = path.match(Path.permissiveIdentifierRegex);
        if (match) {
          return takeString(match[0]);
        } else {
          throw "bad settings path: " + originalPath;
        }
      };
      number = function() {
        var match;

        match = path.match(Path.integerRegex);
        if (match) {
          return parseInt(takeString(match[0]));
        } else {
          throw "bad settings path: " + originalPath;
        }
      };
      string = function(quote) {
        var ans, terminated;

        skip(1);
        ans = "";
        terminated = false;
        while (!terminated) {
          if (path[0] === quote) {
            terminated = true;
          } else if (path[0] === "\\") {
            skip(1);
            ans += take(1);
          } else {
            ans += take(1);
          }
        }
        skip(1);
        return ans;
      };
      indexField = function() {
        var ans;

        skip(1);
        if (path[0] === "'") {
          ans = string("'");
        } else if (path[0] === '"') {
          ans = string('"');
        } else {
          ans = number();
        }
        skip(1);
        return ans;
      };
      topLevel = function() {
        var ans;

        ans = [];
        while (path.length > 0) {
          if (path[0] === ".") {
            skip(1);
            ans.push(identifier());
          } else if (path[0] === "[") {
            ans.push(indexField());
          } else {
            ans.push(identifier());
          }
        }
        return ans;
      };
      path = Myna.trim(path);
      if (path === "") {
        return [];
      } else if (path[0] === "." || path[0] === "[") {
        return topLevel();
      } else {
        path = "." + path;
        return topLevel();
      }
    };

    Path.prototype.quote = function(str) {
      return str.replace(/['\"\\]/g, function(quote) {
        return "\\" + quote;
      });
    };

    Path.prototype.path = function(nodes) {
      var ans, node, _i, _len;

      if (nodes == null) {
        nodes = this.nodes;
      }
      ans = "";
      for (_i = 0, _len = nodes.length; _i < _len; _i++) {
        node = nodes[_i];
        if (typeof node === "number") {
          ans += "[" + node + "]";
        } else if (Path.completeIdentifierRegex.test(node)) {
          ans += "." + node;
        } else {
          ans += "[\"" + (this.quote(node)) + "\"]";
        }
      }
      if (ans[0] === ".") {
        return ans.substring(1);
      } else {
        return ans;
      }
    };

    Path.prototype.get = function(data) {
      var node, _i, _len, _ref;

      _ref = this.nodes;
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        node = _ref[_i];
        data = data != null ? data[node] : void 0;
      }
      return data;
    };

    Path.prototype.set = function(data, value) {
      var first, last, node, obj, _i, _j, _len, _ref;

      if (value != null) {
        if (this.nodes.length === 0) {
          return value;
        } else {
          obj = data;
          _ref = this.nodes, first = 2 <= _ref.length ? __slice.call(_ref, 0, _i = _ref.length - 1) : (_i = 0, []), last = _ref[_i++];
          for (_j = 0, _len = first.length; _j < _len; _j++) {
            node = first[_j];
            if (typeof obj[node] !== "object") {
              obj[node] = {};
            }
            obj = obj[node];
          }
          obj[last] = value;
          return data;
        }
      } else {
        return this.unset(data);
      }
    };

    Path.prototype.unset = function(data) {
      var first, last, node, obj, _i, _j, _len, _ref;

      if (this.nodes.length === 0) {
        return void 0;
      } else {
        obj = data;
        _ref = this.nodes, first = 2 <= _ref.length ? __slice.call(_ref, 0, _i = _ref.length - 1) : (_i = 0, []), last = _ref[_i++];
        for (_j = 0, _len = first.length; _j < _len; _j++) {
          node = first[_j];
          if (obj[node] == null) {
            return data;
          }
          obj = obj[node];
        }
        delete obj[last];
        return data;
      }
    };

    Path.prototype.prefixes = function() {
      var ans, n, nodes, _i, _ref;

      nodes = this.nodes;
      ans = [];
      for (n = _i = 1, _ref = nodes.length; 1 <= _ref ? _i <= _ref : _i >= _ref; n = 1 <= _ref ? ++_i : --_i) {
        ans.push(this.path(nodes.slice(0, n)));
      }
      return ans;
    };

    Path.prototype.isPrefixOf = function(path) {
      var a, b, num, _i, _ref;

      a = this.nodes;
      b = path.nodes;
      if (a.length > b.length) {
        return false;
      }
      for (num = _i = 0, _ref = a.length; 0 <= _ref ? _i < _ref : _i > _ref; num = 0 <= _ref ? ++_i : --_i) {
        if (a[num] !== b[num]) {
          return false;
        }
      }
      return true;
    };

    Path.prototype.take = function(num) {
      return new Path(_.take(this.nodes, num));
    };

    Path.prototype.drop = function(num) {
      return new Path(_.drop(this.nodes, num));
    };

    Path.prototype.toString = function() {
      return this.path();
    };

    return Path;

  }).call(this);

  Myna.Settings = (function(_super) {
    __extends(Settings, _super);

    Settings.Path = Path;

    Settings.defaultSetOptions = {
      silent: false
    };

    function Settings(data) {
      if (data == null) {
        data = {};
      }
      this.toJSON = __bind(this.toJSON, this);
      this.triggerChange = __bind(this.triggerChange, this);
      this.paths = __bind(this.paths, this);
      this.pathValuePairs = __bind(this.pathValuePairs, this);
      this.unset = __bind(this.unset, this);
      this.set = __bind(this.set, this);
      this.get = __bind(this.get, this);
      Settings.__super__.constructor.call(this);
      this.data = {};
      this.set(data);
    }

    Settings.prototype.get = function(path, orElse) {
      var _ref;

      if (orElse == null) {
        orElse = void 0;
      }
      return (_ref = new Myna.Settings.Path(path).get(this.data)) != null ? _ref : orElse;
    };

    Settings.prototype.set = function() {
      var options, path, pathStr, paths, updates, value, _ref;

      if (arguments.length === 0) {
        throw ["Myna.Settings.set", "not enough arguments", arguments];
      }
      if (typeof arguments[0] === "object") {
        updates = arguments[0];
        options = Myna.extend({}, Myna.Settings.defaultSetOptions, (_ref = arguments[1]) != null ? _ref : {});
        paths = [];
        for (pathStr in updates) {
          value = updates[pathStr];
          path = new Myna.Settings.Path(pathStr);
          this.data = path.set(this.data, value);
          paths.push(path);
        }
        if (!options.silent) {
          this.triggerChange(paths);
        }
      } else {
        updates = {};
        updates[arguments[0]] = arguments[1];
        options = arguments[2];
        this.set(updates, options);
      }
      return this;
    };

    Settings.prototype.unset = function(path, options) {
      var updates;

      updates = {};
      updates[path] = void 0;
      return this.set(updates, options);
    };

    Settings.prototype.pathValuePairs = function() {
      var ans, normalize, visit;

      ans = [];
      normalize = function(path) {
        if (path[0] === ".") {
          return path.substring(1);
        } else {
          return path;
        }
      };
      visit = function(value, path) {
        var i, k, v, _i, _len, _results, _results1;

        if (path == null) {
          path = "";
        }
        if (Myna.isArray(value)) {
          _results = [];
          for (v = _i = 0, _len = value.length; _i < _len; v = ++_i) {
            i = value[v];
            _results.push(visit(v, path + "[" + i + "]"));
          }
          return _results;
        } else if (Myna.isObject(value)) {
          _results1 = [];
          for (k in value) {
            v = value[k];
            _results1.push(visit(v, path + "." + k));
          }
          return _results1;
        } else {
          return ans.push({
            path: normalize(path),
            value: value
          });
        }
      };
      visit(this.data);
      return ans;
    };

    Settings.prototype.paths = function() {
      return _.map(this.pathValuePairs(), function(pvp) {
        return pvp.path;
      });
    };

    Settings.prototype.triggerChange = function(paths) {
      var path, prefix, _i, _j, _len, _len1, _ref;

      for (_i = 0, _len = paths.length; _i < _len; _i++) {
        path = paths[_i];
        _ref = path.prefixes();
        for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
          prefix = _ref[_j];
          this.trigger("change:" + prefix, this.get(prefix));
        }
      }
      return this.trigger("change");
    };

    Settings.prototype.toJSON = function(options) {
      if (options == null) {
        options = {};
      }
      return this.data;
    };

    return Settings;

  })(Myna.Events);

}).call(this);

(function() {
  var decodeCookieValue, encodeCookieValue, exn, readCookie, readLocalStorage, removeCookie, removeLocalStorage, writeCookie, writeLocalStorage, _ref,
    _this = this;

  if ((_ref = Myna.cache) == null) {
    Myna.cache = {};
  }

  Myna.cache.localStorageSupported = (function() {
    try {
      localStorage.setItem('modernizer', 'modernizer');
      localStorage.removeItem('modernizer');
      return true;
    } catch (_error) {
      exn = _error;
      return false;
    }
  })();

  Myna.cache.localStorageEnabled = true;

  readLocalStorage = function(key) {
    var str;

    str = window.localStorage.getItem("myna-" + key);
    if (str != null) {
      try {
        return JSON.parse(str);
      } catch (_error) {
        exn = _error;
        return null;
      }
    } else {
      return null;
    }
  };

  writeLocalStorage = function(key, obj) {
    if (obj != null) {
      window.localStorage.setItem("myna-" + key, JSON.stringify(obj));
    } else {
      window.localStorage.removeItem("myna-" + key);
    }
  };

  removeLocalStorage = function(key) {
    window.localStorage.removeItem("myna-" + key);
  };

  encodeCookieValue = function(obj) {
    return encodeURIComponent(JSON.stringify(obj));
  };

  decodeCookieValue = function(str) {
    str = str.indexOf('"') === 0 ? str.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\') : str;
    return JSON.parse(decodeURIComponent(str.replace(/\+/g, ' ')));
  };

  writeCookie = function(name, obj, days) {
    var date, expires, path, value;

    if (days == null) {
      days = 365;
    }
    value = "myna-" + name + "=" + encodeCookieValue(obj);
    expires = days ? (date = new Date(), date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)), "; expires=" + date.toGMTString()) : "";
    path = "; path=/";
    document.cookie = "" + value + expires + path;
  };

  readCookie = function(name) {
    var cookie, cookieValue, cookies, isNameEQCookie, nameEQ, str, _i, _len;

    nameEQ = "myna-" + name + "=";
    isNameEQCookie = function(cookie) {
      var i;

      i = cookie.indexOf(nameEQ);
      return i >= 0 && cookie.substring(0, i).match('^\\s*$');
    };
    cookieValue = function(cookie) {
      var i;

      i = cookie.indexOf(nameEQ);
      return cookie.substring(i + nameEQ.length, cookie.length);
    };
    cookies = document.cookie.split(';');
    for (_i = 0, _len = cookies.length; _i < _len; _i++) {
      cookie = cookies[_i];
      if (isNameEQCookie(cookie)) {
        if ((str = cookieValue(cookie)) != null) {
          return decodeCookieValue(str);
        }
      }
    }
    return null;
  };

  removeCookie = function(name) {
    writeCookie(name, "", -1);
  };

  Myna.cache.load = function(key) {
    if (Myna.cache.localStorageSupported && Myna.cache.localStorageEnabled) {
      return readLocalStorage(key);
    } else {
      return readCookie(key);
    }
  };

  Myna.cache.save = function(key, value) {
    if (Myna.cache.localStorageSupported && Myna.cache.localStorageEnabled) {
      writeLocalStorage(key, value);
    } else {
      writeCookie(key, value);
    }
  };

  Myna.cache.remove = function(key) {
    if (Myna.cache.localStorageSupported && Myna.cache.localStorageEnabled) {
      removeLocalStorage(key);
    } else {
      removeCookie(key);
    }
  };

}).call(this);

(function() {
  Myna.Variant = (function() {
    function Variant(options) {
      var _ref, _ref1, _ref2, _ref3;

      if (options == null) {
        options = {};
      }
      this.id = (_ref = options.id) != null ? _ref : Myna.error("Myna.Variant.constructor", "no id in options", options);
      this.name = (_ref1 = options.name) != null ? _ref1 : this.id;
      this.weight = (_ref2 = options.weight) != null ? _ref2 : Myna.error("Myna.Variant.constructor", "no weight in options", options);
      this.settings = new Myna.Settings((_ref3 = options.settings) != null ? _ref3 : {});
    }

    return Variant;

  })();

}).call(this);

(function() {
  var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    __hasProp = {}.hasOwnProperty,
    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

  Myna.BaseExperiment = (function(_super) {
    __extends(BaseExperiment, _super);

    function BaseExperiment(options) {
      var data, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4;

      if (options == null) {
        options = {};
      }
      this.save = __bind(this.save, this);
      this.load = __bind(this.load, this);
      this.loadAndSave = __bind(this.loadAndSave, this);
      this.clearVariant = __bind(this.clearVariant, this);
      this.saveVariant = __bind(this.saveVariant, this);
      this.loadVariant = __bind(this.loadVariant, this);
      this.clearLastReward = __bind(this.clearLastReward, this);
      this.saveLastReward = __bind(this.saveLastReward, this);
      this.loadLastReward = __bind(this.loadLastReward, this);
      this.clearLastView = __bind(this.clearLastView, this);
      this.saveLastView = __bind(this.saveLastView, this);
      this.loadLastView = __bind(this.loadLastView, this);
      this.randomVariant = __bind(this.randomVariant, this);
      this.totalWeight = __bind(this.totalWeight, this);
      this.saveVariantFromReward = __bind(this.saveVariantFromReward, this);
      this.rewardVariant = __bind(this.rewardVariant, this);
      this.loadVariantsForReward = __bind(this.loadVariantsForReward, this);
      this.reward = __bind(this.reward, this);
      this.saveVariantFromView = __bind(this.saveVariantFromView, this);
      this.viewVariant = __bind(this.viewVariant, this);
      this.loadVariantsForView = __bind(this.loadVariantsForView, this);
      this.view = __bind(this.view, this);
      this.loadVariantsForSuggest = __bind(this.loadVariantsForSuggest, this);
      this.suggest = __bind(this.suggest, this);
      BaseExperiment.__super__.constructor.call(this, options);
      Myna.log("Myna.BaseExperiment.constructor", options);
      this.uuid = (_ref = options.uuid) != null ? _ref : Myna.error("Myna.BaseExperiment.constructor", this.id, "no uuid in options", options);
      this.id = (_ref1 = options.id) != null ? _ref1 : Myna.error("Myna.BaseExperiment.constructor", this.id, "no id in options", options);
      this.settings = new Myna.Settings((_ref2 = options.settings) != null ? _ref2 : {});
      this.variants = {};
      _ref4 = (_ref3 = options.variants) != null ? _ref3 : [];
      for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
        data = _ref4[_i];
        this.variants[data.id] = new Myna.Variant(data);
      }
    }

    BaseExperiment.prototype.suggest = function(success, error) {
      var variants, _ref, _ref1;

      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      variants = this.loadVariantsForSuggest();
      Myna.log("Myna.BaseExperiment.suggest", this.id, (_ref = variants.variant) != null ? _ref.id : void 0, (_ref1 = variants.viewed) != null ? _ref1.id : void 0);
      this.viewVariant(Myna.extend({
        success: success,
        error: error
      }, variants));
    };

    BaseExperiment.prototype.loadVariantsForSuggest = function() {
      return {
        variant: this.randomVariant(),
        viewed: this.loadLastView()
      };
    };

    BaseExperiment.prototype.view = function(variantOrId, success, error) {
      var variants, _ref, _ref1;

      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      variants = this.loadVariantsForView(variantOrId);
      Myna.log("Myna.BaseExperiment.view", this.id, (_ref = variants.variant) != null ? _ref.id : void 0, (_ref1 = variants.viewed) != null ? _ref1.id : void 0);
      this.viewVariant(Myna.extend({
        success: success,
        error: error
      }, variants));
    };

    BaseExperiment.prototype.loadVariantsForView = function(variantOrId) {
      return {
        variant: variantOrId instanceof Myna.Variant ? variantOrId : this.variants[variantOrId],
        viewed: null
      };
    };

    BaseExperiment.prototype.viewVariant = function(options) {
      var error, success, variant, viewed, _ref, _ref1;

      variant = options.variant;
      viewed = options.viewed;
      success = (_ref = options.success) != null ? _ref : (function() {});
      error = (_ref1 = options.error) != null ? _ref1 : (function() {});
      Myna.log("Myna.BaseExperiment.viewVariant", this.id, variant != null ? variant.id : void 0, viewed != null ? viewed.id : void 0);
      if (viewed != null) {
        if (this.trigger('beforeView', viewed, false) !== false) {
          success.call(this, viewed, false);
          this.trigger('view', viewed, false);
        }
      } else if (variant != null) {
        if (this.trigger('beforeView', variant, true) !== false) {
          this.saveVariantFromView(variant);
          success.call(this, variant, true);
          this.trigger('view', variant, true);
          this.trigger('recordView', variant);
        }
      } else {
        error(Myna.problem("no-variant"));
      }
    };

    BaseExperiment.prototype.saveVariantFromView = function(variant) {
      this.saveLastView(variant);
      return this.clearLastReward();
    };

    BaseExperiment.prototype.reward = function(amount, success, error) {
      var variants, _ref, _ref1;

      if (amount == null) {
        amount = 1.0;
      }
      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      variants = this.loadVariantsForReward();
      Myna.log("Myna.BaseExperiment.reward", this.id, (_ref = variants.variant) != null ? _ref.id : void 0, (_ref1 = variants.rewarded) != null ? _ref1.id : void 0, amount);
      this.rewardVariant(Myna.extend({
        amount: amount,
        success: success,
        error: error
      }, variants));
    };

    BaseExperiment.prototype.loadVariantsForReward = function() {
      return {
        variant: this.loadLastView(),
        rewarded: this.loadLastReward()
      };
    };

    BaseExperiment.prototype.rewardVariant = function(options) {
      var amount, error, rewarded, success, variant, _ref, _ref1, _ref2,
        _this = this;

      if (options == null) {
        options = {};
      }
      Myna.log("Myna.BaseExperiment.rewardVariant", this.id, options);
      variant = options.variant;
      rewarded = options.rewarded;
      amount = (_ref = options.amount) != null ? _ref : 1.0;
      success = (_ref1 = options.success) != null ? _ref1 : (function() {});
      error = (_ref2 = options.error) != null ? _ref2 : (function() {});
      if (rewarded != null) {
        if (this.trigger('beforeReward', rewarded, amount, false) !== false) {
          success.call(this, rewarded, amount, false);
          this.trigger('reward', rewarded, amount, false);
        }
      } else if (variant != null) {
        if (this.trigger('beforeReward', variant, amount, true) !== false) {
          this.triggerAsync('recordReward', variant, amount, function() {
            _this.saveVariantFromReward(variant);
            success.call(_this, variant, amount, true);
            return _this.trigger('reward', variant, amount, true);
          }, function() {
            _this.saveVariantFromReward(variant);
            error.call(_this);
          });
        }
      } else {
        error(Myna.problem("no-variant"));
      }
    };

    BaseExperiment.prototype.saveVariantFromReward = function(variant) {
      this.clearLastView();
      return this.saveLastReward(variant);
    };

    BaseExperiment.prototype.totalWeight = function() {
      var ans, id, variant, _ref;

      ans = 0.0;
      _ref = this.variants;
      for (id in _ref) {
        variant = _ref[id];
        ans += variant.weight;
      }
      return ans;
    };

    BaseExperiment.prototype.randomVariant = function() {
      var id, random, total, variant, _ref;

      total = this.totalWeight();
      random = Math.random() * total;
      _ref = this.variants;
      for (id in _ref) {
        variant = _ref[id];
        total -= variant.weight;
        if (total <= random) {
          Myna.log("Myna.BaseExperiment.randomVariant", this.id, variant.id);
          return variant;
        }
      }
      Myna.log("Myna.BaseExperiment.randomVariant", this.id, null);
      return null;
    };

    BaseExperiment.prototype.loadLastView = function() {
      return this.loadVariant('lastView');
    };

    BaseExperiment.prototype.saveLastView = function(variant) {
      this.saveVariant('lastView', variant);
      return this.clearVariant('lastReward');
    };

    BaseExperiment.prototype.clearLastView = function() {
      return this.clearVariant('lastView');
    };

    BaseExperiment.prototype.loadLastReward = function() {
      return this.loadVariant('lastReward');
    };

    BaseExperiment.prototype.saveLastReward = function(variant) {
      return this.saveVariant('lastReward', variant);
    };

    BaseExperiment.prototype.clearLastReward = function() {
      return this.clearVariant('lastReward');
    };

    BaseExperiment.prototype.loadVariant = function(cacheKey) {
      var id, _ref;

      id = (_ref = this.load()) != null ? _ref[cacheKey] : void 0;
      Myna.log("Myna.BaseExperiment.loadVariant", this.id, cacheKey, id);
      if (id != null) {
        return this.variants[id];
      } else {
        return null;
      }
    };

    BaseExperiment.prototype.saveVariant = function(cacheKey, variant) {
      var _this = this;

      return this.loadAndSave(function(saved) {
        Myna.log("Myna.BaseExperiment.saveVariant", _this.id, cacheKey, variant, saved);
        if (variant != null) {
          saved[cacheKey] = variant.id;
        } else {
          delete saved[cacheKey];
        }
        return saved;
      });
    };

    BaseExperiment.prototype.clearVariant = function(cacheKey) {
      return this.saveVariant(cacheKey, null);
    };

    BaseExperiment.prototype.loadAndSave = function(func) {
      var _ref;

      return this.save(func((_ref = this.load()) != null ? _ref : {}));
    };

    BaseExperiment.prototype.load = function() {
      return Myna.cache.load(this.uuid);
    };

    BaseExperiment.prototype.save = function(state) {
      return Myna.cache.save(this.uuid, state);
    };

    return BaseExperiment;

  })(Myna.Events);

}).call(this);

(function() {
  var _ref,
    __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    __hasProp = {}.hasOwnProperty,
    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

  Myna.Experiment = (function(_super) {
    __extends(Experiment, _super);

    function Experiment() {
      this.clearStickyReward = __bind(this.clearStickyReward, this);
      this.saveStickyReward = __bind(this.saveStickyReward, this);
      this.loadStickyReward = __bind(this.loadStickyReward, this);
      this.clearStickySuggestion = __bind(this.clearStickySuggestion, this);
      this.saveStickySuggestion = __bind(this.saveStickySuggestion, this);
      this.loadStickySuggestion = __bind(this.loadStickySuggestion, this);
      this.unstick = __bind(this.unstick, this);
      this.saveVariantFromReward = __bind(this.saveVariantFromReward, this);
      this.loadVariantsForReward = __bind(this.loadVariantsForReward, this);
      this.saveVariantFromView = __bind(this.saveVariantFromView, this);
      this.loadVariantsForView = __bind(this.loadVariantsForView, this);
      this.loadVariantsForSuggest = __bind(this.loadVariantsForSuggest, this);
      this.sticky = __bind(this.sticky, this);      _ref = Experiment.__super__.constructor.apply(this, arguments);
      return _ref;
    }

    Experiment.prototype.sticky = function() {
      return !!this.settings.get("myna.web.sticky", true);
    };

    Experiment.prototype.loadVariantsForSuggest = function() {
      var sticky;

      sticky = this.loadStickySuggestion();
      return {
        variant: sticky != null ? sticky : this.randomVariant(),
        viewed: sticky != null ? sticky : null
      };
    };

    Experiment.prototype.loadVariantsForView = function(variant) {
      return Experiment.__super__.loadVariantsForView.call(this, variant);
    };

    Experiment.prototype.saveVariantFromView = function(variant) {
      if (this.sticky()) {
        this.saveStickySuggestion(variant);
      }
      return Experiment.__super__.saveVariantFromView.call(this, variant);
    };

    Experiment.prototype.loadVariantsForReward = function() {
      if (this.sticky()) {
        return {
          variant: this.loadLastView(),
          rewarded: this.loadStickyReward()
        };
      } else {
        return Experiment.__super__.loadVariantsForReward.call(this);
      }
    };

    Experiment.prototype.saveVariantFromReward = function(variant) {
      if (this.sticky()) {
        this.saveStickyReward(variant);
      }
      return Experiment.__super__.saveVariantFromReward.call(this, variant);
    };

    Experiment.prototype.unstick = function() {
      Myna.log("Myna.Experiment.unstick", this.id);
      this.clearLastView();
      this.clearLastReward();
      this.clearStickySuggestion();
      return this.clearStickyReward();
    };

    Experiment.prototype.loadStickySuggestion = function() {
      if (this.sticky()) {
        return this.loadVariant('stickySuggestion');
      } else {
        return null;
      }
    };

    Experiment.prototype.saveStickySuggestion = function(variant) {
      this.saveVariant('stickySuggestion', variant);
      return this.clearVariant('stickyReward');
    };

    Experiment.prototype.clearStickySuggestion = function() {
      this.clearVariant('stickySuggestion');
      return this.clearVariant('stickyReward');
    };

    Experiment.prototype.loadStickyReward = function() {
      if (this.sticky()) {
        return this.loadVariant('stickyReward');
      } else {
        return null;
      }
    };

    Experiment.prototype.saveStickyReward = function(variant) {
      return this.saveVariant('stickyReward', variant);
    };

    Experiment.prototype.clearStickyReward = function() {
      return this.clearVariant('stickyReward');
    };

    return Experiment;

  })(Myna.BaseExperiment);

}).call(this);

(function() {
  var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    __hasProp = {}.hasOwnProperty,
    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
    __slice = [].slice;

  Myna.Recorder = (function(_super) {
    __extends(Recorder, _super);

    function Recorder(client) {
      this.save = __bind(this.save, this);
      this.load = __bind(this.load, this);
      this.loadAndSave = __bind(this.loadAndSave, this);
      this.clearQueuedEvents = __bind(this.clearQueuedEvents, this);
      this.requeueEvents = __bind(this.requeueEvents, this);
      this.queueEvent = __bind(this.queueEvent, this);
      this.queuedEvents = __bind(this.queuedEvents, this);
      this.sync = __bind(this.sync, this);
      this.recordReward = __bind(this.recordReward, this);
      this.recordView = __bind(this.recordView, this);
      this.listenTo = __bind(this.listenTo, this);
      this.init = __bind(this.init, this);
      var _ref, _ref1;

      Recorder.__super__.constructor.call(this);
      Myna.log("Myna.Recorder.constructor", client);
      this.client = client;
      this.apiKey = (_ref = client.apiKey) != null ? _ref : Myna.error("Myna.Recorder.constructor", "no apiKey in options", options);
      this.apiRoot = (_ref1 = client.apiRoot) != null ? _ref1 : "//api.mynaweb.com";
      this.storageKey = client.settings.get("myna.web.storageKey", "myna");
      this.timeout = client.settings.get("myna.web.timeout", 1000);
      this.autoSync = client.settings.get("myna.web.autoSync", true);
      this.semaphore = 0;
      this.waiting = [];
    }

    Recorder.prototype.init = function() {
      var expt, id, _ref, _results;

      _ref = this.client.experiments;
      _results = [];
      for (id in _ref) {
        expt = _ref[id];
        _results.push(this.listenTo(expt));
      }
      return _results;
    };

    Recorder.prototype.listenTo = function(expt) {
      var _this = this;

      Myna.log("Myna.Recorder.listenTo", expt.id);
      expt.on('recordView', function(variant, success, error) {
        return _this.recordView(expt, variant, success, error);
      });
      return expt.on('recordReward', function(variant, amount, success, error) {
        return _this.recordReward(expt, variant, amount, success, error);
      });
    };

    Recorder.prototype.recordView = function(expt, variant, success, error) {
      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      Myna.log("Myna.Recorder.recordView", expt.id, variant.id);
      this.queueEvent({
        typename: "view",
        experiment: expt.uuid,
        variant: variant.id,
        timestamp: Myna.dateToString(new Date())
      });
      Myna.log("Myna.Recorder.recordReward", "aboutToSync", this.autoSync);
      if (this.autoSync) {
        return this.sync(success, error);
      } else {
        return success();
      }
    };

    Recorder.prototype.recordReward = function(expt, variant, amount, success, error) {
      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      Myna.log("Myna.Recorder.recordReward", expt.id, variant.id, amount);
      this.queueEvent({
        typename: "reward",
        experiment: expt.uuid,
        variant: variant.id,
        amount: amount,
        timestamp: Myna.dateToString(new Date())
      });
      Myna.log("Myna.Recorder.recordReward", "aboutToSync", this.autoSync);
      if (this.autoSync) {
        return this.sync(success, error);
      } else {
        return success();
      }
    };

    Recorder.prototype.sync = function(success, error) {
      var finish, start, syncAll, syncOne, waiting,
        _this = this;

      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      this.waiting.push({
        success: success,
        error: error
      });
      if (this.semaphore > 0) {
        return Myna.log("Myna.Recorder.sync", "queued", this.waiting.length);
      } else {
        this.semaphore++;
        waiting = this.waiting;
        this.waiting = [];
        start = function() {
          var events;

          events = _this.clearQueuedEvents();
          Myna.log("Myna.Recorder.sync.start", events, waiting.length);
          if (_this.trigger('beforeSync', events) === false) {
            return finish([], [], events, true);
          } else {
            return syncAll(events, [], [], []);
          }
        };
        syncAll = function(events, successEvents, discardedEvents, requeuedEvents) {
          var head, tail;

          Myna.log("Myna.Recorder.sync.syncAll", events, successEvents, discardedEvents, requeuedEvents);
          if (events.length === 0) {
            return finish(successEvents, discardedEvents, requeuedEvents);
          } else {
            head = events[0], tail = 2 <= events.length ? __slice.call(events, 1) : [];
            return syncOne(head, tail, successEvents, discardedEvents, requeuedEvents);
          }
        };
        syncOne = function(event, otherEvents, successEvents, discardedEvents, requeuedEvents) {
          var params;

          Myna.log("Myna.Recorder.sync.syncOne", event, otherEvents, successEvents, discardedEvents, requeuedEvents);
          params = Myna.extend({}, event, {
            apikey: _this.apiKey
          });
          params = Myna.deleteKeys(params, 'experiment');
          return Myna.jsonp.request({
            url: "" + _this.apiRoot + "/v2/experiment/" + event.experiment + "/record",
            success: function() {
              return syncAll(otherEvents, successEvents.concat([event]), discardedEvents, requeuedEvents);
            },
            error: function(response) {
              if (response.status && response.status >= 500) {
                return syncAll(otherEvents, successEvents, discardedEvents, requeuedEvents.concat([event]));
              } else {
                return syncAll(otherEvents, successEvents, discardedEvents.concat([event]), requeuedEvents);
              }
            },
            timeout: _this.timeout,
            params: params
          });
        };
        finish = function(successEvents, discardedEvents, requeuedEvents, cancelled) {
          var item, _i, _j, _len, _len1;

          if (cancelled == null) {
            cancelled = false;
          }
          Myna.log("Myna.Recorder.sync.finish", successEvents, discardedEvents, requeuedEvents, _this.waiting.length);
          if (requeuedEvents.length > 0) {
            _this.requeueEvents(requeuedEvents);
          }
          if (discardedEvents.length > 0 || requeuedEvents.length > 0) {
            for (_i = 0, _len = waiting.length; _i < _len; _i++) {
              item = waiting[_i];
              item.error(successEvents, discardedEvents, requeuedEvents);
            }
          } else {
            for (_j = 0, _len1 = waiting.length; _j < _len1; _j++) {
              item = waiting[_j];
              item.success(successEvents, discardedEvents, requeuedEvents);
            }
          }
          if (!cancelled) {
            _this.trigger('sync', successEvents, discardedEvents, requeuedEvents);
          }
          _this.semaphore--;
          if (!cancelled && _this.waiting.length > 0) {
            return _this.sync();
          }
        };
        return start();
      }
    };

    Recorder.prototype.queuedEvents = function() {
      var ans, _ref;

      ans = (_ref = this.load().queuedEvents) != null ? _ref : [];
      Myna.log("Myna.Recorder.queuedEvents", ans);
      return ans;
    };

    Recorder.prototype.queueEvent = function(event) {
      Myna.log("Myna.Recorder.queueEvent", event);
      return this.loadAndSave(function(saved) {
        var _ref;

        saved.queuedEvents = ((_ref = saved.queuedEvents) != null ? _ref : []).concat([event]);
        return saved;
      });
    };

    Recorder.prototype.requeueEvents = function(events) {
      Myna.log("Myna.Recorder.requeueEvents", events);
      return this.loadAndSave(function(saved) {
        var _ref;

        saved.queuedEvents = events.concat((_ref = saved.queuedEvents) != null ? _ref : []);
        return saved;
      });
    };

    Recorder.prototype.clearQueuedEvents = function() {
      var ans;

      Myna.log("Myna.Recorder.clearQueuedEvents");
      ans = [];
      this.loadAndSave(function(saved) {
        var _ref;

        ans = (_ref = saved.queuedEvents) != null ? _ref : [];
        delete saved.queuedEvents;
        return saved;
      });
      return ans;
    };

    Recorder.prototype.loadAndSave = function(func) {
      var _ref;

      return this.save(func((_ref = this.load()) != null ? _ref : {}));
    };

    Recorder.prototype.load = function() {
      return Myna.cache.load(this.storageKey);
    };

    Recorder.prototype.save = function(state) {
      return Myna.cache.save(this.storageKey, state);
    };

    return Recorder;

  })(Myna.Events);

}).call(this);

(function() {
  var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
    __hasProp = {}.hasOwnProperty,
    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

  Myna.GoogleAnalytics = (function(_super) {
    __extends(GoogleAnalytics, _super);

    function GoogleAnalytics(client) {
      this.rewardMultiplier = __bind(this.rewardMultiplier, this);
      this.eventName = __bind(this.eventName, this);
      this.enabled = __bind(this.enabled, this);
      this.rewardEvent = __bind(this.rewardEvent, this);
      this.viewEvent = __bind(this.viewEvent, this);
      this.recordReward = __bind(this.recordReward, this);
      this.recordView = __bind(this.recordView, this);
      this.listenTo = __bind(this.listenTo, this);
      this.init = __bind(this.init, this);      Myna.log("Myna.GoogleAnalytics.constructor", client);
      this.client = client;
    }

    GoogleAnalytics.prototype.init = function() {
      var expt, id, _ref, _results;

      _ref = this.client.experiments;
      _results = [];
      for (id in _ref) {
        expt = _ref[id];
        _results.push(this.listenTo(expt));
      }
      return _results;
    };

    GoogleAnalytics.prototype.listenTo = function(expt) {
      var _this = this;

      Myna.log("Myna.GoogleAnalytics.listenTo", expt.id);
      expt.on('recordView', function(variant, success, error) {
        return _this.recordView(expt, variant, success, error);
      });
      return expt.on('recordReward', function(variant, amount, success, error) {
        return _this.recordReward(expt, variant, amount, success, error);
      });
    };

    GoogleAnalytics.prototype.recordView = function(expt, variant, success, error) {
      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      Myna.log("Myna.GoogleAnalytics.recordView", expt, variant, success, error);
      if (this.enabled(expt)) {
        if (typeof _gaq !== "undefined" && _gaq !== null) {
          _gaq.push(this.viewEvent(expt, variant));
        }
      }
      return success();
    };

    GoogleAnalytics.prototype.recordReward = function(expt, variant, amount, success, error) {
      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      Myna.log("Myna.GoogleAnalytics.recordReward", expt, variant, success, error);
      if (this.enabled(expt)) {
        if (typeof _gaq !== "undefined" && _gaq !== null) {
          _gaq.push(this.rewardEvent(expt, variant, amount));
        }
      }
      return success();
    };

    GoogleAnalytics.prototype.viewEvent = function(expt, variant) {
      return ["_trackEvent", "myna", this.eventName(expt, "view"), variant.id, null, false];
    };

    GoogleAnalytics.prototype.rewardEvent = function(expt, variant, amount) {
      var m;

      m = this.rewardMultiplier(expt);
      return ["_trackEvent", "myna", this.eventName(expt, "reward"), variant.id, Math.round(m * amount), true];
    };

    GoogleAnalytics.prototype.enabled = function(expt) {
      return expt.settings.get("myna.web.googleAnalytics.enabled", true);
    };

    GoogleAnalytics.prototype.eventName = function(expt, event) {
      var _ref;

      return (_ref = expt.settings.get("myna.web.googleAnalytics." + event + "Event")) != null ? _ref : "" + expt.id + "-" + event;
    };

    GoogleAnalytics.prototype.rewardMultiplier = function(expt) {
      return expt.settings.get("myna.web.googleAnalytics.rewardMultiplier", 100);
    };

    return GoogleAnalytics;

  })(Myna.Events);

}).call(this);

(function() {
  var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };

  Myna.Client = (function() {
    function Client(options) {
      var expt, _i, _len, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;

      if (options == null) {
        options = {};
      }
      this.reward = __bind(this.reward, this);
      this.view = __bind(this.view, this);
      this.suggest = __bind(this.suggest, this);
      Myna.log("Myna.Client.constructor", options);
      this.uuid = (_ref = options.uuid) != null ? _ref : null;
      this.apiKey = (_ref1 = options.apiKey) != null ? _ref1 : Myna.error("Myna.Deployment.constructor", "no apiKey in options", options);
      this.apiRoot = (_ref2 = options.apiRoot) != null ? _ref2 : "//api.mynaweb.com";
      this.settings = new Myna.Settings((_ref3 = options.settings) != null ? _ref3 : {});
      this.experiments = {};
      _ref5 = (_ref4 = options.experiments) != null ? _ref4 : [];
      for (_i = 0, _len = _ref5.length; _i < _len; _i++) {
        expt = _ref5[_i];
        this.experiments[expt.id] = expt;
      }
    }

    Client.prototype.suggest = function(exptId, success, error) {
      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      return this.experiments[exptId].suggest(success, error);
    };

    Client.prototype.view = function(exptId, variantId, success, error) {
      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      return this.experiments[exptId].view(variantId, success, error);
    };

    Client.prototype.reward = function(exptId, amount, success, error) {
      if (amount == null) {
        amount = 1.0;
      }
      if (success == null) {
        success = (function() {});
      }
      if (error == null) {
        error = (function() {});
      }
      return this.experiments[exptId].reward(amount, success, error);
    };

    return Client;

  })();

}).call(this);

(function() {
  Myna.readyHandlers = [];

  Myna.ready = function(callback) {
    if (Myna.client) {
      callback(Myna.client);
    } else {
      Myna.readyHandlers.push(callback);
    }
  };

  Myna.triggerReady = function(client) {
    var callback, _i, _len, _ref, _results;

    _ref = Myna.readyHandlers;
    _results = [];
    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
      callback = _ref[_i];
      _results.push(callback.call(Myna, client));
    }
    return _results;
  };

  Myna.init = function(options) {
    var client, error, exn, success, _ref, _ref1;

    Myna.log("Myna.init", options);
    if (Myna.preview() && options.latest) {
      Myna.initRemote({
        url: options.latest
      });
    } else {
      success = (_ref = options.success) != null ? _ref : (function() {});
      error = (_ref1 = options.error) != null ? _ref1 : (function() {});
      try {
        client = Myna.initLocal(options);
        success(client);
      } catch (_error) {
        exn = _error;
        error(exn);
      }
    }
  };

  Myna.initLocal = function(options) {
    var apiKey, apiRoot, experiments, expt, typename, _ref, _ref1;

    Myna.log("Myna.init", options);
    typename = options.typename;
    if (typename !== "deployment") {
      Myna.error("Myna.Client.initLocal", "Myna needs a deployment to initialise. The given JSON is not a deployment.\nIt has a typename of \"" + typename + "\". Check you are initialising Myna with the\ncorrect UUID if you are calling initRemote", options);
    }
    apiKey = (_ref = options.apiKey) != null ? _ref : Myna.error("Myna.init", "no apiKey in options", options);
    apiRoot = (_ref1 = options.apiRoot) != null ? _ref1 : "//api.mynaweb.com";
    experiments = (function() {
      var _i, _len, _ref2, _ref3, _results;

      _ref3 = (_ref2 = options.experiments) != null ? _ref2 : [];
      _results = [];
      for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
        expt = _ref3[_i];
        _results.push(new Myna.Experiment(expt));
      }
      return _results;
    })();
    Myna.client = new Myna.Client({
      apiKey: apiKey,
      apiRoot: apiRoot,
      experiments: experiments
    });
    Myna.recorder = new Myna.Recorder(Myna.client);
    Myna.googleAnalytics = new Myna.GoogleAnalytics(Myna.client);
    if (Myna.preview()) {
      if (Myna.$) {
        Myna.inspector = new Myna.Inspector(Myna.client);
        Myna.$(function() {
          Myna.triggerReady(Myna.client);
          return Myna.inspector.init();
        });
      }
    } else {
      Myna.triggerReady(Myna.client);
      Myna.recorder.init();
      Myna.googleAnalytics.init();
    }
    return Myna.client;
  };

  Myna.initRemote = function(options) {
    var error, success, url, _ref, _ref1, _ref2;

    Myna.log("Myna.initRemote", options);
    url = (_ref = options.url) != null ? _ref : Myna.error("Myna.Client.initRemote", "no url specified in options", options);
    success = (_ref1 = options.success) != null ? _ref1 : (function() {});
    error = (_ref2 = options.error) != null ? _ref2 : (function() {});
    Myna.jsonp.request({
      url: url,
      success: function(json) {
        var client, exn;

        Myna.log("Myna.initRemote", "response", json);
        try {
          client = Myna.initLocal(json);
          return success(client);
        } catch (_error) {
          exn = _error;
          return error(exn);
        }
      },
      error: error
    });
  };

}).call(this);


Join The WaveSwansea Sound and do something amazing today!
Sign up for Macmillan Cancer Support's Gower MacMarathon, sponsored by Swansea Building Society on September 14th and help raise money for people affected by cancer. Hike 14 or 22 miles along the stunning Gower coastline for the 22nd annual Gower MacMarathon. Whichever distance you choose you'll be supporting people living with cancer.
The The WaveSwansea Sound team will be there cheering you on as you make a difference for thousands of people!
4,959 people are diagnosed with cancer each year in South West Wales. Macmillan want to be there for each and every one of these people and with your support, whatever cancer throws their way, we can be right there with them.


EU Regulation 261/2004 establishes passenger rights for delays, cancellations and cases of passengers getting denied boarding. It covers flights within the EU with all carriers. Flights which either originate outside the EU, or whose destination lies outside of the European Union, must be with an EU airline in order to be eligible for compensation under this regulation. A passenger must be delayed over 3 hours in order to qualify for compensation.
If disruptions to flight plans were caused by extraordinary circumstances, passengers will not be entitled to claim compensation.
As this regulation does not establish time limits for bringing actions in the national courts, each EU member state regulates such time limits individually. This means that different European countries have different statutes of limitations when it comes to making a claim for compensation for delayed and cancelled flights or cases where passengers have been denied boarding.
A claim for compensation can be brought to the national court of either the country of departure, country of arrival or the country in which the airline is based.
Claiming compensation for delayed & cancelled flights has been made easy, Get Paid When Delayed is here to help.
This website helps you to generate your own personal claims letter. All you have to do is fill in a few questions regarding details of your flight delay or cancellation. To begin, simply click Start Your Claim.
We also help passengers get a reimbursement for damages to luggage, lost baggage items or refund for expenses incurred due to delayed luggage at the Lost & Found section of the site.
Need to contact the airline? Get Paid When Delayed has also compiled a list of Airline Contact Details so you can quickly access addresses, helpline telephone numbers, email addresses, links to complaint sections of airline website and other customer services.


text:
Lost legends
'Mandalorian' Season 3: An old Star Wars comic may reveal Baby Yoda's past
"There's more to life than 'honor' and your damn order...."
Dais Johnston
The Phantom Menace established a lot of harsh truths for the Star Wars universe. Podracing was suddenly the premier sport in the galaxy, slavery was established as a major part of the Tatooine economy, and the term "Sith Lord" was first uttered. But also, the shady practices of Jedi recruitment were revealed to fans. The practice wasn't questioned in the films, but a non-canon comic dissects its morality — and predicts Grogu's appearance in The Mandalorian.
During the prequel era of Star Wars fandom, Dark Horse Comics released a series of now non-canon anthology comics entitled Star Wars Tales. Each issue was different. Some were grab bags of vignettes from all sorts of characters from the films, some were focused on a singular character like a stormtrooper or Han Solo, and sometimes the entire issue would be dedicated to making Darth Vader and Darth Maul fight each other.
How did TV and movies get you through the pandemic? We want to hear from you! Take this quick Inverse survey.
In Star Wars Tales #13, the entire issue was devoted to everyone's favorite defenestrated Jedi, Mace Windu. The stories followed him as he encountered a time paradox, hunted down a murderer, and taught his padawan a lesson about the Sith. The last of these stories, however, is the most interesting.
Depa questions the morality of the Jedi edicts. Dark Horse Comics
Mace is showing his padawan, Depa Billaba (who would later teach Rebels Jedi Kanan Jarrus) the Jedi nursery. She tells him about dreams she had about her parents, or at least people she thinks are her parents, and Mace chides her for having such attachments.
Suddenly, one of the infants is stolen by bounty hunter Vianna D'Pow. Mace assumes she's going to sell the child on the black market, but Vianna reveals she was actually hired by the child's parents who regret allowing their child to be taken. Mace spares her life, but returns the child back to their parents. The last panel shows a message from Mace's parents expressing a wish to see him.
It's an intriguing story, but the most fascinating part isn't in the plot. It's in the foreground of a panel showing the Jedi nursery. Among all the infants is a tiny green being with very familiar-looking ears.
A familiar green creature is awoken by Mace Windu's fight with Vianna. Dark Horse Comics
While this comic isn't canon, the inclusion of a Baby Yoda, even if it's not the Baby Yoda, opens a whole realm of possibility. Could The Mandalorian Season 3 explore Grogu's beginnings in the Jedi nursery? Considering his long lifespan, he probably spent a handful of years among the infants being indoctrinated into the Jedi order.
This flashback would serve as a great way to add context to the Jedi methods. After all, if fans are mad about Baby Yoda eating eggs, just wait until they realize the Jedi stole babies. A flashback to Grogu's beginnings could either retcon the Jedi to include a more family-friendly recruitment method, or it could steer into the skid and show what Ahsoka hinted at in her appearance — the Jedi aren't the perfect good guys the galaxy seems to see them as.
If that's the direction The Mandalorian takes in Season 3, this flashback could feed into a paradigm shift. Din Djarin could realize Grogu's Jedi training away from him isn't a good idea, and then suddenly Luke Skywalker is the villain of the show. It's a huge and lofty idea, but the ideas in this comic could grow into a major plotline in The Mandalorian Season 3.
The Mandalorian is now streaming on Disney+.
Mandalorian Season 3 trailer confirms a dramatic new look for Grogu
By Dais Johnston
Mandalorian Season 3 can fix Star Wars history with one simple retcon
The Mandalorian Season 3 trailer breakdown

redpajama_set_name: RedPajamaCommonCrawl


text:
On The Economy
Social Distancing and Contact-Intensive Occupations
By Fernando Leibovici, Economist; Ana Maria Santacreu, Economist; and Matthew Famiglietti, Research Associate
While social distancing is crucial for addressing the health shock caused by COVID-19, it has also reshaped the landscape of economic activity. The impact, however, is likely to be considerably heterogeneous across occupations.
In particular, nonessential occupations that require a high degree of face-to-face and close physical interaction are particularly likely to be hit hard, as consumers reduce their demand for them in pursuit of social distancing. Thus, these occupations are likely to be more vulnerable to the shock, leading either to layoffs of nonessential workers or to an increase in the risk of contagion among those workers that have to stay in the workplace to perform essential activities. Carrying out some of these occupations remotely, when plausible, is likely to allow them to better absorb the negative shock.
In this blog post, we attempt to characterize which occupations are these contact-intensive occupations that are likely to be relatively more affected by the COVID-19 pandemic and how important these occupations are for the U.S. economy.
Working Proximity to Other People
To do so, we combined individual-level data from the 2017 American Community Survey with an index of occupational contact-intensity from O*NET.We restricted our attention to employed men and women ages 25-64. Individuals across a very large number of occupations covering the entire U.S. economy are asked by O*NET to answer questions on the mix of knowledge, skills, abilities and work context (among other characteristics) that best describe their occupations.
One of these questions involves rating the extent to which the job requires the worker to perform job tasks in close physical proximity to other people. The answers are given scores, which are aggregated to compute a contact-intensity index. The possible answers and corresponding scores are:
I don't work near other people (beyond 100 ft.): 0
I work with others but not closely (e.g., private office): 25
Slightly close (e.g., shared office): 50
Moderately close (at arm's length): 75
Very close (near touching): 100
We then classified occupations into low, medium and high contact-intensity categories according to index scores of 0 to 50, 50 to 75, and 75 and above, respectively. The table below lists the high contact-intensity occupations.
High Contact-Intensity Occupations
Proximity index
# of workers
Avg. # of hours worked per week
Avg. annual labor income
% of U.S. workforce
Barbers, Hairstylists and Cosmetologists
92.17 1,097,556 36.00 $17,334 0.87%
Occupational Therapy and Physical Therapist Assistants and Aides
90.50 95,730 36.22 $41,846 0.08%
Home Health and Personal Care Aides; and Nursing Assistants, Orderlies and Psychiatric Aides
Therapists, Veterinarians, Nurses, Midwives and Audiologists
Supervisors of Food Preparation and Serving Workers
88.00 846,895 42.31 $32,805 0.67%
Health Care Diagnosing or Treating Practitioners
86.19 1,543,291 46.42 $167,744 1.22%
Supervisors of Personal Care and Service Workers
Health Technologists and Technicians
Pilots, air traffic controllers and flight attendants
81.60 281,574 41.13 $105,009 0.22%
Other Health Care Support Occupations
Preschool, Elementary, Middle, Secondary and Special Education Teachers
Other Teachers and Instructors
Motor Vehicle Operators
Other Personal Care and Service Workers
Food and Beverage Serving Workers
SOURCES: 2017 American Community Survey, O*NET and authors' calculations.
Data presented in the table above is available for download.
There are 15 occupations (out of 107 occupations at the four-digit Standard Occupation Classification level) considered high contact-intensity. Barbers, hairstylists and cosmetologists are at the top of the list, with a physical proximity index of 92.17. Food and beverage serving workers are at the bottom of the high contact-intensity occupations list, with an index of 75.17. Other contact-intensive occupations include those that provide health services as well as pilots, air traffic controllers and flight attendants, and Pre-K to 12th grade teachers.
COVID-19 Effects on High Contact-Intensity Occupations
The ongoing pandemic impacts all of these occupations, but it is likely to affect each of them in a different way. For instance, while barbers, hairstylists and cosmetologists are likely to be out of business until the pandemic subsides, Pre-K to 12th grade education is already being conducted remotely in many states, mitigating the impact of the health shock.
Similarly, while many types of health services (such as non-urgent dentist appointments) are likely to be postponed until the pandemic is resolved, others will certainly be very active assisting COVID-19 patients despite the risk of contagion. The table below shows that these high contact-intensity occupations represent about one-fifth of total U.S. employment and labor income: 27.3 million workers who earn nearly $1.3 trillion annually.
Occupations with Low, Medium and High Contact Intensity
Relative contact intensity
Avg. Proximity index
Total # of workers
Total labor income
47.13 34,405,074 41.64 $2,508,096,964,282 27.23%
In contrast, low contact-intensity occupations—those which are least likely to be affected by the COVID-19 shock—represent about one-fourth of total employment and about one-third of labor income: 34.4 million workers who earn $3 trillion annually. Examples of these types of occupations are designers, scientists and hunters.
States and Contact-Intensive Occupations
The heterogeneous exposure across occupations that we have documented above also translates into some heterogeneity in exposure across U.S. states, as seen in the figure below.
Those U.S. states where there are more occupations that require physical contact are more likely to be vulnerable to the health shock. Such states include Mississippi, New York and West Virginia with more than 24% of their workers in high contact-intensity occupations. In contrast, Virginia, Colorado and Utah may be relatively less affected, with less than 20% of their workers in such occupations.
These observations show that high contact-intensity occupations represent a non-negligible fraction of the U.S. economy in terms of employment and total labor income. Thus, the direct economic impact of COVID-19 via the recent social-distancing measures is likely to be significant.
However, the overall impact will depend on the flexibility of these occupations to adapt to this alternative social environment. If more occupations can be done remotely, then the impact is likely to be mitigated.
1 We restricted our attention to employed men and women ages 25-64.
St. Louis Fed's COVID-19 resource page
Working Paper: Fiscal Policy during a Pandemic
Economic Synopses: Possible Fiscal Policies for Rare, Unanticipated, and Severe Viral Outbreaks
This post was updated to use total labor income instead of total income. The update does not change the authors' analysis or conclusions.
Posted In Labor | Tagged fernando leibovici, ana maria santacreu, matthew famiglietti, labor, covid19, coronavirus, social distancing, working proximity
Back-of-the-Envelope Estimates of Next Quarter's Unemployment Rate
How Many Employees Are Prepared to Work from Home?
The St. Louis Fed On the Economy blog features relevant commentary, analysis, research and data from our economists and other St. Louis Fed experts.
Views expressed are not necessarily those of the Federal Reserve Bank of St. Louis or of the Federal Reserve System.
For media-related questions, email mediainquiries@stls.frb.org. For all other blog-related questions or comments, email on-the-economy@stls.frb.org.
Select a category Banking Community Development Federal Reserve Financial Housing Inflation Labor Output Trade


text:
You are here: Home > Featured > Opinion: The Chief Rabbinate's blacklist isn't defending Judaism. It's undermining it.
Opinion: The Chief Rabbinate's blacklist isn't defending Judaism. It's undermining it.
By Rabbi Seth Farber: July 11, 2017
Rabbi Seth Farber (Idit Wagner)
JERUSALEM (JTA) – Over the weekend, JTA and others reported on a "blacklist of rabbis" maintained by Israel's Chief Rabbinate. The list contains the names of more than 160 rabbis whom the rabbinate does not trust to confirm the Jewish identity of immigrants to Israel.
The list, obtained by Itim from the rabbinate after a protracted legal battle, has sparked an uproar in Israel and around the Jewish world. I have been contacted by rabbis, politicians, Israeli and American consuls general and ambassadors, asking one question: Who is responsible for this mess?
If one asks Ashkenazi Chief Rabbi David Lau what happened, his argument – articulated in a letter his chief of staff sent to his CEO – is that a clerk went AWOL. According to Lau, Rabbi Itamar Tubul, the director of certifications and personal status at the rabbinate, issued a list without consulting anyone. The chief rabbi has asked the CEO to censure Tubul, thus, from his perspective, bringing an end to the travesty of the blacklist.
But Rabbi Tubul didn't cause the blacklist to be created. In fact, he is a manifestation of a systemic failure of the rabbinate, and in fact of Israel, to address the significance of the Jewish part of the Jewish State for the Jewish world.
"The State of Israel will be open for Jewish immigration and for the Ingathering of the Exiles," Israel's Declaration of Independence reads. "It will be based on freedom, justice and peace as envisaged by the prophets of Israel; it will ensure complete equality of social and political rights to all its inhabitants irrespective of religion, race or sex; it will guarantee freedom of religion."
But today, rather than support its historic role as a homeland for Jews around the world, Israel's government – through the rabbinate which it empowers – chooses to delegitimize hundreds of communities and rabbis throughout the Diaspora. Rather than embracing the diversity of the Jewish world and enabling Jews not born in Israel to make their home here, Israel pushes them away – purportedly in the name of Halachah, or Jewish law.
As an Orthodox rabbi, I want to state categorically that rejecting people's Jewishness is anti-halachic. The Halachah is clear: Jews are to be believed if they say they are Jewish. The rabbinate is undermining the very Judaism it wishes to sustain.
But of course, the present controversy isn't only about Halachah. It's about power and accountability. The rabbinate has been allowed for too long to operate without any oversight, without any accountability, without any sense of its responsibility. This is not Rabbi Tubul's problem, or the chief rabbi's problem. It is the government's problem.
If the State of Israel is to remain a life force for the Jewish people, it must restructure the power of the rabbinate, such that Jewish communities around the world will be welcomed and validated, not dismissed and disparaged. If we are to create a new model of Jewish peoplehood, one that balanced what was once referred to as Babylon and Jerusalem, then the suspicion of the Diaspora by the religious authorities in Israel must be supplanted by a spirit of tolerance and acceptance.
Ultimately, times of crisis are also times of opportunity. The fractured relationship between Israel and the Jewish world can be healed and from these dark moments, we can emerge stronger. But the government of Israel must be willing to act boldly, and rethink if its behavior today is truly serving the interests of the Zionist enterprise. I'm convinced things can be better. But, to paraphrase the motto of the special forces unit in which Prime Minister Benjamin Netanyahu served, "One wins only if one dares."
Rabbi Seth (Shaul) Farber is the director of Itim: The Jewish Advocacy Center (www.itim.org.il), an organization that helps people navigate the religious authorities' bureaucracy in Israel.
Add your comment: Cancel reply


Chronic jaw pain can make eating, speaking or even smiling difficult. What's more, finding the right treatment approach can be just as difficult.
This is because TMD (Temporomandibular Disorder: named for the joints on either side of the lower jaw) actually describes a wide range of possible problems with the joints and connecting muscles. Any of them can result in impaired jaw function, radiating pain or even headaches.
We'll need to conduct a full dental and facial exam to accurately diagnose your jaw pain's cause. Even then, the way may still not be clear: there's considerable debate among dentists about the best treatment approach. Two basic schools of thought prevail, one conservative and non-invasive and the other more aggressive and interventional.
The conservative approach seeks to alleviate symptoms in a variety of ways, including recommending softer foods to give muscles and joints time to relax, applying cold and heat to ease soreness, massage of the jaw joint muscles, gentle stretching and jaw exercises. We may also prescribe medications like ibuprofen and other non-steroidal anti-inflammatory drugs for pain and swelling relief, and sometimes muscle relaxers to reduce spasms. If your pain stems from clenching or grinding habits, we could fit you with a custom bite guard you wear while you sleep to reduce the forces on your teeth.
The more aggressive approach is much more invasive. These methods include altering the bite or teeth position with orthodontics or dental work or surgically altering the joints themselves or the shape of the jaw. If you're recommended one of these more aggressive treatments, you should know they're not commonly used to treat TMD and they're irreversible. There's also no guarantee you'll gain relief from your symptoms, so by all means get a second opinion before undergoing any procedures.
For most people the best course of treatment is to start with the least invasive techniques, which are usually very successful. If they don't relieve your pain and limited function, we may then consider escalating treatment to more irreversible procedures to help you find relief from this unwelcome condition.


Mandi Tolen is a high school math teacher with experience teaching ELA and technology classes. She is a Google Certified Innovator and very active on Twitter. Mandi is passionate about helping other teachers be the best they can be.
Choose Your Own Adventure in math!


In what has now become the undisputed king of smartphone launches and an annual recurrence, Apple will be holding an event later today to make some major hardware announcements. While a new Apple Watch along with an upgraded Apple TV should grace the stage, what fans are undoubtedly looking forward to the most is the new series of iPhones expected to be unveiled, seeing as it's the 10th anniversary of the device.
What's changed in these 10 years is the massive proliferation of the internet and consequently, the spread of leaks (some unintentional, others deliberate) which has ensured that the common folks know a lot about the iPhones to be launched before the official event. Where once the leaks for the iPhone 4 caused a media storm when the device was forgotten at a restaurant, the leaks have now become fairly recurrent and expected. From the flurry of media activity that has been surrounding the iPhones in the past year or so, here's a lowdown of all the major stuff expected to be uncovered at tomorrow's event.
Let's get the giants out of the way first. Apple is expected to announce not two but three iPhones tomorrow. Two of these will be the standard upgrades to the iPhone 7 and 7 Plus line and will be named the iPhone 7S and 7S Plus, keeping in mind the traditional naming scheme. These devices could feature screen sizes similar to their predecessors at 4.7 inches and 5.5 inches for the S and S Plus variants respectively. Both phones are expected to come with the traditional LCD display and feature missing 3.5 mm jacks, a completely absent home button, dual rear cameras and the latest generation of Apple's A series chips.
The big "surprise" of the event though, is expected to be the third iPhone. Dubbed the iPhone X or iPhone 8, this 10th anniversary special will reportedly feature a complete OLED front panel with the home button entirely hidden or done away with depending upon which source of rumors you believe. At 5.8 inches of screen, it will also be larger than the standard iPhone sizes while still being smaller than some of its competition. It could feature a glass back along with dual rear cameras at the rear end which, for a change, will be vertically aligned. There could also be support for 4K video recording from both cameras according to one dicey rumor (although this seems less likely to be the case).
The iPhones are expected to do away with biometric scanning or Touch ID entirely in favor of more improved Iris Recognition Technology. This problem seems to have been the outcome of Apple ditching the home button and not wanting to put a fingerprint sensor at the back while also being unable to implement it under the front glass panel (that technology is still in the nascent stages and only Vivo has managed to get a prototype to somewhat work). There are also whispers that Apple has doubled the storage options to 64 GB, 256 GB and 512 GB for the special-edition iPhone.
While pricing is unknown at this stage for the two standard iPhones, the iPhone X is rumored to cost a whopping $999 with some sources speculating this could even be Apple's first iPhone that crosses the $1000 price mark. In terms of colors, the iPhones could come in hues of Silver, Black and Gold with the final names being called something else.
In addition to the iPhone, Apple is expected to provide an update to its Apple Watch lineup with the Apple Watch Series 3. This Series 3 watch will feature an in-built LTE sensor for cellular connectivity from the watch itself. This should make things like GPS based location tracking possible directly through the watch although it's bound to come at the cost of some battery life. Features like improved health and fitness tracking along with the ability to make phone calls (a natural outcome of incorporating LTE Tech) are also expected though unconfirmed by sources. A new Apple TV is also on the horizon with support for 4K and HDR technology although details have been largely mum on this one with the iPhones having taken most of the spotlight.
Apple unveiled the Homepod at its WWDC event back in June and announced a fall launch schedule for the device. It should most likely make another appearance at the event, possibly integrating with the new iPhones in ways that would make it an appealing buy for iOS ecosystem owners. Finally, on the software side of things Apple is definitely going to push ARKit by dedicating a small segment or two to show its capabilities after giving a tease of them at its Developer's Keynote that was held back in June. By all accounts, ARKit is shaping up to be a promising platform with an already huge install base of iOS devices to cater to making it all the more exciting.
The event will be live-streamed on Apple's official website. Stay tuned to Appocalypse for coverage of the event tomorrow.


Fabulous size images storage renovation including platform with. of begonia gray king inspirations also beautiful ikea platform bed with storage images drawers instructions beds plans headboard sets white.
Ikea platform bed with storage and awesome beds queen size bedroom sets pictures stunning inspirations including parts hacks unique black brown full double.


Just got the word that a cookbook I did illustrations for a few months back is now ready for order from SunyPress. This is a nonprofit endeavor, with all net profits being donated to regional food banks & charities all over the country. You can check it out & purchase it here.


text:
Obama, back for another Leno interview, accuses Russia of 'Cold War thinking'
Neil Munro White House Correspondent
August 07, 2013 12:12 AM ET
President Barack Obama lashed out at Russia's treatment of its sexual minorities on Tuesday, but he downplayed the massive intelligence victory over the United States that Russian strongman Vladimir Putin won by helping engineer Edward Snowden's defection.
During an appearance on NBC's "The Tonight Show," Obama told host Jay Leno said he has "no patience for countries that try to treat gays and lesbians and transgendered persons in ways that intimidate them or are harmful to them."
On Wednesday morning, a White House official told reporters that Obama would cancel a customary one-on-one meeting with Russian President Vladimir Putin at the impending G-20 summit in Petersburg, Russia. The announcement came after some groups urged Obama to boycott the meeting.
"I have been very clear that when it comes to universal rights, when it comes to people's basic freedoms, that whether you're discriminating on the basis of race, religion, gender, or sexual orientation you are violating the basic morality that I think should transcend every country," he declared.
He also seemed to believe that Russia's controversial new laws curbing apparent advocacy of homosexuality could cause problems at the 2014 winter Olympics in southern Russia.
"I think Putin and Russia have a big stake in making sure the Olympics work," he said.
"I think they understand that for most of the countries that participate in the Olympics, we wouldn't tolerate gays and lesbians being treated differently — they're athletes" he said. "If Russia wants to uphold the Olympic spirit, then every judgment should be made on the track or in the swimming pool or on the balance beam and people's sexual orientation shouldn't have anything to do with it," he said.
However, there's no indication from Russia that the new rules would change the grading system for downhill skiing and other other events.
But while Obama used strong language over a domestic matter only affecting the citizens of Russia, he downplayed the dispute over national-security leaks by Snowdon — a government contractor who disclosed secret data about U.S. electronic surveillance programs — by saying the crisis would not prompt him to boycott the G-20 Summit.
This month, Russia offered Edward Snowdon temporary sanctuary in Russia, frustrating U.S efforts to get him into U.S. custody before he reveals more secrets about the American government's worldwide surveillance capability.
Obama patronized Putin's decision to keep Snowden.
"There are times when they slip back into Cold War thinking and Cold War mentality. What I continually say to them and to President Putin, that's the past," he said.
Obama also evaded Leno's question over whether Snowdon should be called a whistleblower. "Well, we don't know yet exactly what he did other than what he said on the Internet, and it's important for me not to prejudge something," he said.
But Obama did offer a low-key defense of the surveillance programs.
"This intelligence gathering that we do is a critical component to counter terrorism," he said.
"If in fact the allegations are true that he [leaked information], then that is a huge problem because a lot of what we do is terrorist networks not knowing, you know, that, in fact, we may be able to access their information."
Russian legislators have recently restricted demonstrations and advocacy by Western-style gay and lesbian interest groups in Russia.
The authors of the law say they're worried about Russia's low birth rate and declining population. The decline follows seven decades of harsh Soviet rule and several brutal wars, and it is occurring during a period of rapid growth of restive Muslims populations in the former empire's southern provinces.
The Russian government has tried a variety of methods to increase the low non-Muslim birth-rate, which threatens to shrink Russia's population, economy, military and clout. Russia faces rising threats from China as well as its own Muslim populations in Chechnya and other provinces.
Follow Neil on Twitter
Tags : barack obama edward snowden gay rights jay leno
Neil Munro


text:
Home News Breaking News Gingrich Calls Climate Ad With Pelosi The 'Dumbest Single Thing I've Done'...
Gingrich Calls Climate Ad With Pelosi The 'Dumbest Single Thing I've Done' Recently
GOP White House hopeful Newt Gingrich wants voters to know he really, really regrets making a 2008 ad with then-House Speaker Nancy Pelosi (D-Calif.) calling for action to address climate change.
"That is probably the dumbest single thing I've done in recent years," Gingrich, a former House Speaker, said Tuesday on Fox News, calling the ad "inexplicable."
The ad features Gingrich and Pelosi seated on a couch in front of the Capitol.
"We do agree our country must take action to address climate change," Gingrich says in the ad. "If enough of us demand action from our leaders, we can spark the innovation that we need."
The ad did not endorse any specific policies, but it came at a time when Pelosi was gearing up to push cap-and-trade legislation through the House.
The ad was sponsored by Al Gore's Alliance for Climate Protection (which has since become the Climate Reality Project), a group that endorses greenhouse gas limits.
Gingrich also expressed regret over the ad in July, saying in a radio interview that it was "misconstrued."
"I was trying to make a point that we shouldn't be afraid to debate the left, even on the environment," Gingrich said on WGIR radio of the 30-second television commercial. "Obviously it was misconstrued, and it's probably one of those things I wouldn't do again."
Gingrich on Tuesday noted his opposition to cap-and-trade, saying on Fox News that there should not be a "central government model" solution.
But, explaining the ad, he said, "I do think it's important for conservatives to be in the middle of the debate over the environment," and said his comments in the ad were an endorsement of finding "innovative" ways to get clean energy.
Gingrich on Tuesday called himself "agnostic" on the question of global warming.
"I actually don't know whether global warming is occurring," he said on Fox. "The vast majority of National Academy of Science says it is, a minority says it is not."
But he also warned conservatives not to take a hardened stance against belief in global warming.
"I say to all of my conservative friends, don't assume automatically the entire National Academy of Sciences is wrong," he said. "And I would say to the National Academy, don't assume that vote by renowned scientists is necessarily true."
The vast majority of scientists say the planet is warming and human activities – including the burning of fossil fuels – are a major reason why.
Several leading GOP candidates have expressed skepticism about global warming, humans' role or both.
{The Hill/Matzav.com Newscenter}
Previous articlePhotos: Chief Rabbi Metzger Among Attendees at Kosherfest 2011
Next articleMeis Mitzvah Pulled From The Crematorium
This short segment was part of a 15 minute interview where Gingrich was in the "hot seat" questioned by 4 reporters on important issues on Fox news. His performance was brilliant. Leave it to the slick media to focus on the slightest weakness and magnify it as the defining impression.
Gingrich for president- the only candidate who knows what he's talking about.
Cain would've said "I don't remember."
Bachmann would have used some faux-scientist to back her up.
Perry's response would've been incomprehensible.


PORCUPINE TREE JAPAN HQCD+DVD Audio MINI LP CD BOX LIMITED EDITION Stupid Dream IEZP-7 OUT OF PRINT Lightbulb Sun IEZP-8 OUT OF PRINT In Absentia IEZP-9 OUT OF PRINT Deadwing IEZP-10 OUT OF PRINT Far of a Blank Planet IEZP-11 OUT OF PRINT. The item "PORCUPINE TREE JAPAN HQCD+DVD Audio MINI LP CD BOX LIMITED EDITION" is in sale since Tuesday, January 05, 2016.
This item is in the category "Musik\CDs".jan" and is located in Kiel. This item can be shipped worldwide.


A look at photographs of some familiar Harford County landmarks then and now.
A large group of volunteers came out to the campus of Harford Community College in Bel Air Friday morning to help planting 140 trees. The event is organized by the Harford County Department of Planning & Zoning to plant native trees throughout the county each year.
Sam Wilson fills small buckets of mulch for volunteers to carry to their tree after planting Friday morning. Wilson and a host of volunteers came out to help plant 140 trees for the Harford County Arbor Day tree planting event on the campus of Harford Community College Friday morning.