Full Code of HubSpot/offline for AI

master a17291864212 cached
136 files
289.5 KB
87.2k tokens
1 requests
Download .txt
Showing preview only (320K chars total). Download the full file or copy to clipboard to get everything.
Repository: HubSpot/offline
Branch: master
Commit: a17291864212
Files: 136
Total size: 289.5 KB

Directory structure:
gitextract_8akg9yce/

├── .github/
│   ├── ISSUE_TEMPLATE
│   └── PULL_REQUEST_TEMPLATE
├── .gitignore
├── .hsdoc
├── Gruntfile.coffee
├── LICENSE
├── README.md
├── bower.json
├── coffee/
│   ├── offline.coffee
│   ├── reconnect.coffee
│   ├── requests.coffee
│   ├── simulate.coffee
│   ├── snake.coffee
│   └── ui.coffee
├── docs/
│   └── welcome/
│       ├── app.js
│       ├── images/
│       │   ├── ethernet-cable.sketch/
│       │   │   ├── Data
│       │   │   ├── fonts
│       │   │   └── version
│       │   ├── macbook-pro-top.sketch/
│       │   │   ├── Data
│       │   │   ├── fonts
│       │   │   └── version
│       │   └── macbook-pro.sketch/
│       │       ├── Data
│       │       ├── fonts
│       │       └── version
│       └── index.html
├── install.json
├── js/
│   ├── offline.js
│   ├── reconnect.js
│   ├── requests.js
│   ├── simulate.js
│   ├── snake.js
│   └── ui.js
├── offline.js
├── package.json
├── sass/
│   ├── _arabic.sass
│   ├── _chinese-simplified.sass
│   ├── _chinese-traditional.sass
│   ├── _content.sass
│   ├── _czech.sass
│   ├── _dutch.sass
│   ├── _english.sass
│   ├── _french.sass
│   ├── _german.sass
│   ├── _italian.sass
│   ├── _keyframes.sass
│   ├── _mixins.sass
│   ├── _offline-theme-base-indicator.sass
│   ├── _offline-theme-base.sass
│   ├── _pashto.sass
│   ├── _persian.sass
│   ├── _polish.sass
│   ├── _portuguese-brazil.sass
│   ├── _spanish.sass
│   ├── _turkish.sass
│   ├── offline-language-arabic-indicator.sass
│   ├── offline-language-arabic.sass
│   ├── offline-language-chinese-simplified-indicator.sass
│   ├── offline-language-chinese-simplified.sass
│   ├── offline-language-chinese-traditional-indicator.sass
│   ├── offline-language-chinese-traditional.sass
│   ├── offline-language-czech-indicator.sass
│   ├── offline-language-czech.sass
│   ├── offline-language-dutch-indicator.sass
│   ├── offline-language-dutch.sass
│   ├── offline-language-english-indicator.sass
│   ├── offline-language-english.sass
│   ├── offline-language-french-indicator.sass
│   ├── offline-language-french.sass
│   ├── offline-language-german-indicator.sass
│   ├── offline-language-german.sass
│   ├── offline-language-italian-indicator.sass
│   ├── offline-language-italian.sass
│   ├── offline-language-pashto-indicator.sass
│   ├── offline-language-pashto.sass
│   ├── offline-language-polish-indicator.sass
│   ├── offline-language-polish.sass
│   ├── offline-language-portuguese-brazil-indicator.sass
│   ├── offline-language-portuguese-brazil.sass
│   ├── offline-language-simplified-chinese-indicator.sass
│   ├── offline-language-spanish-indicator.sass
│   ├── offline-language-spanish.sass
│   ├── offline-language-turkish-indicator.sass
│   ├── offline-language-turkish.sass
│   ├── offline-theme-chrome-indicator.sass
│   ├── offline-theme-chrome.sass
│   ├── offline-theme-dark-indicator.sass
│   ├── offline-theme-dark.sass
│   ├── offline-theme-default-indicator.sass
│   ├── offline-theme-default.sass
│   ├── offline-theme-hubspot.sass
│   ├── offline-theme-slide-indicator.sass
│   └── offline-theme-slide.sass
├── test/
│   ├── index.html
│   └── snake.html
└── themes/
    ├── offline-language-arabic-indicator.css
    ├── offline-language-arabic.css
    ├── offline-language-chinese-simplified-indicator.css
    ├── offline-language-chinese-simplified.css
    ├── offline-language-chinese-traditional-indicator.css
    ├── offline-language-chinese-traditional.css
    ├── offline-language-czech-indicator.css
    ├── offline-language-czech.css
    ├── offline-language-dutch-indicator.css
    ├── offline-language-dutch.css
    ├── offline-language-english-indicator.css
    ├── offline-language-english.css
    ├── offline-language-french-indicator.css
    ├── offline-language-french.css
    ├── offline-language-german-indicator.css
    ├── offline-language-german.css
    ├── offline-language-hebrew-indicator.css
    ├── offline-language-hebrew.css
    ├── offline-language-italian-indicator.css
    ├── offline-language-italian.css
    ├── offline-language-pashto-indicator.css
    ├── offline-language-pashto.css
    ├── offline-language-persian-indicator.css
    ├── offline-language-persian.css
    ├── offline-language-polish-indicator.css
    ├── offline-language-polish.css
    ├── offline-language-portuguese-brazil-indicator.css
    ├── offline-language-portuguese-brazil.css
    ├── offline-language-simplified-chinese-indicator.css
    ├── offline-language-spanish-indicator.css
    ├── offline-language-spanish.css
    ├── offline-language-turkish-indicator.css
    ├── offline-language-turkish.css
    ├── offline-theme-chrome-indicator.css
    ├── offline-theme-chrome.css
    ├── offline-theme-dark-indicator.css
    ├── offline-theme-dark.css
    ├── offline-theme-default-indicator.css
    ├── offline-theme-default.css
    ├── offline-theme-hubspot.css
    ├── offline-theme-slide-indicator.css
    └── offline-theme-slide.css

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE
================================================
<!--

    This project isn't actively maintained.

    Issues and pull requests will likely not receive a response.

-->


================================================
FILE: .github/PULL_REQUEST_TEMPLATE
================================================
<!--

    This project isn't actively maintained.

    Issues and pull requests will likely not receive a response.

-->


================================================
FILE: .gitignore
================================================
node_modules/
.sass-cache/

================================================
FILE: .hsdoc
================================================
title: "Offline"
source: "{coffee/*,sass/*}"
assets: "{js/*,themes/*,offline.min.js,docs/welcome/*,test/*}"


================================================
FILE: Gruntfile.coffee
================================================
module.exports = (grunt) ->
  grunt.initConfig
    pkg: grunt.file.readJSON('package.json')

    coffee:
      compile:
        expand: true
        flatten: true
        src: ['coffee/*.coffee']
        dest: 'js/'
        ext: '.js'

    watch:
      options:
        atBegin:
          true
      coffee:
        files: ['coffee/*', 'sass/*']
        tasks: ['coffee', 'uglify', 'compass']

    uglify:
      options:
        banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n'

      minified:
        src: ['js/*', '!js/snake.js']
        dest: 'offline.min.js'

      original:
        src: ['js/*', '!js/snake.js']
        dest: 'offline.js'
        options:
          mangle: false
          beautify:
            beautify: true
            indent_level: 2
            space_colon: false

    compass:
      dist:
        options:
          sassDir: 'sass'
          cssDir: 'themes'

  grunt.loadNpmTasks 'grunt-contrib-watch'
  grunt.loadNpmTasks 'grunt-contrib-uglify'
  grunt.loadNpmTasks 'grunt-contrib-coffee'
  grunt.loadNpmTasks 'grunt-contrib-compass'

  grunt.registerTask 'default', ['coffee', 'uglify', 'compass']


================================================
FILE: LICENSE
================================================
Copyright (c) 2014 HubSpot, Inc.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.



================================================
FILE: README.md
================================================
___

**This project isn't actively maintained.**
___

Offline
======

**Note to users pre-0.6.0:  Offline previously used a cloudfront hosted file as one of it's methods of detecting the connection status.  This method is now deprecated and the image has been removed.  Please upgrade to Offline 0.7.0+.**

Improve the experience of your app when your users lose connection.

- Monitors ajax requests looking for failure
- Confirms the connection status by requesting an image or fake resource
- Automatically grabs ajax requests made while the connection is down and remakes them
  after the connection is restored.
- Simple UI with beautiful themes
- 3kb minified and compressed

Installation
-------------------

Include [the javascript](https://raw.github.com/HubSpot/offline/v0.7.14/offline.min.js), one of [the themes](http://github.hubspot.com/offline/docs/welcome/), and one of [the
languages](https://github.com/HubSpot/offline/tree/master/themes) on your site.  You're done!

To use only the JavaScript API without a UI indicator, simply leave out the CSS file.

If you'd like to get a peek at how it looks on your site, disconnect your internet, or try out the [simulator](http://craigshoemaker.github.io/offlinejs-simulate-ui/).

Advanced
--------

Optionally, you can provide some configuration by setting `Offline.options` after
bringing in the script.

Options (any can be provided as a function), with their defaults:

```javascript
{
  // Should we check the connection status immediatly on page load.
  checkOnLoad: false,

  // Should we monitor AJAX requests to help decide if we have a connection.
  interceptRequests: true,

  // Should we automatically retest periodically when the connection is down (set to false to disable).
  reconnect: {
    // How many seconds should we wait before rechecking.
    initialDelay: 3,

    // How long should we wait between retries.
    delay: (1.5 * last delay, capped at 1 hour)
  },

  // Should we store and attempt to remake requests which fail while the connection is down.
  requests: true,

  // Should we show a snake game while the connection is down to keep the user entertained?
  // It's not included in the normal build, you should bring in js/snake.js in addition to
  // offline.min.js.
  game: false
}
```

Properties
----------

`Offline.check()`: Check the current status of the connection.

`Offline.state`: The current state of the connection 'up' or 'down'

`Offline.on(event, handler, context)`: Bind an event.  Events:

  - up: The connection has gone from down to up
  - down: The connection has gone from up to down
  - confirmed-up: A connection test has succeeded, fired even if the connection was already up
  - confirmed-down: A connection test has failed, fired even if the connection was already down
  - checking: We are testing the connection
  - reconnect:started: We are beginning the reconnect process
  - reconnect:stopped: We are done attempting to reconnect
  - reconnect:tick: Fired every second during a reconnect attempt, when a check is not happening
  - reconnect:connecting: We are reconnecting now
  - reconnect:failure: A reconnect check attempt failed
  - requests:flush: Any pending requests have been remade
  - requests:capture: A new request is being held

`Offline.off(event, handler)`: Unbind an event

Checking
--------

By default, Offline makes an XHR request to load your `/favicon.ico` to check the connection.  If you don't
have such a file, it will 404 in the console, but otherwise work fine (even a 404 means the connection is up).
You can change the URL it hits (an endpoint which will respond with a quick 204 is perfect):

```javascript
Offline.options = {checks: {xhr: {url: '/connection-test'}}};
```

Make sure that the URL you check has the same origin as your page (the connection method, domain and port all must be the same), or you
will run into CORS issues.  You can add `Access-Control` headers to the endpoint to fix it on modern browsers, but it will still cause issues on
IE9 and below.

If you do want to run tests on a different domain, try the image method.  It loads an image, which are allowed to cross domains.

```javascript
Offline.options = {checks: {image: {url: 'my-image.gif'}, active: 'image'}}
```

The one caveat is that with the image method, we can't distinguish a 404 from a genuine connection issue, so any error at all will
appear to Offline as a connection issue.

Offline also includes a check called `'up'` and another called `'down'` which will always report being up or down respectively for
testing.  You can activate them by setting the `active` option, adding a data attribute to your script tag with the name
`data-simulate` and value `'up'` or `'down'`, or by setting `localStorage.OFFLINE_SIMULATE` to `'up'` or `'down'`.

Reconnect
---------

The reconnect module automatically retests the connection periodically when it is down.
A successful AJAX request will also trigger a silent recheck (if `interceptRequests` is not false).

You can disable the reconnect module by setting the `reconnect` to false.  Reconnect can be
configured by setting options on the reconnect setting.

Requests
--------

The requests module holds any failed AJAX requests and, after deduping them, remakes them when the connection
is restored.

You can disable it by setting the `requests` setting to false.

You can also set deDupBody to be true if you want deduping to also take into account the content of the request.

Dependencies
------------

None!

Browser Support
---------------

Modern Chrome, Firefox, Safari and IE8+

Note that not all browsers (including Safari and old IE) support the offline events, forcing Offline to use less accurate methods of detection.


================================================
FILE: bower.json
================================================
{
  "name": "offline",
  "homepage": "http://github.hubspot.com/offline/docs/welcome",
  "authors": [
    "Zack Bloom <zackbloom@gmail.com>",
    "Adam Schwartz <adam.flynn.schwartz@gmail.com>"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/HubSpot/offline.git"
  },
  "description": "Automatically detect when a browser is offline",
  "main": "offline.js",
  "license": "MIT",
  "keywords": [
    "offline",
    "online",
    "internet",
    "network",
    "ajax",
    "notification",
    "javascript",
    "client-side"
  ],
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "coffee",
    "docs",
    "js",
    "test",
    "bower.json",
    "package.json"
  ]
}


================================================
FILE: coffee/offline.coffee
================================================
# We get a clue that the browser might be offline from suspicious requests or
# the HTML5 offline api.  If we suspect it's offline, we make a request for any random path
# which (probably) doesn't exist.  If we get a response, we're still online, if not,
# we trigger an event and update our status.

extendNative = (to, from) ->
  for key of from::
    try
      val = from::[key]

      if not to[key]? and typeof val isnt 'function'
        to[key] = val
    catch e

Offline = {}

Offline.options = if window.Offline then window.Offline.options or {} else {}
defaultOptions =
  checks:
    xhr:
      url: ->
        # This can be any endpoint, even one that will 404.
        "/favicon.ico?_=#{ (new Date()).getTime() }"
      timeout: 5000
      type: 'HEAD'
    image:
      url: ->
        # This can be any image, this is the better option if your image is on a different domain, otherwise just use XHR
        "/favicon.ico?_=#{ (new Date()).getTime() }"

    active: 'xhr'

  checkOnLoad: false

  interceptRequests: true

  reconnect: true

  deDupBody: false

grab = (obj, key) ->
  cur = obj
  parts = key.split('.')
  for part, i in parts
    cur = cur[part]
    break if typeof cur isnt 'object'

  if i is parts.length - 1
    cur
  else
    undefined

Offline.getOption = (key) ->
  val = grab(Offline.options, key) ? grab(defaultOptions, key)

  if typeof val is 'function'
    val()
  else
    val

# These events are available in modern browsers, but they mean different things.
# In FF and IE they mean the user has explicitly entered "Offline Mode"
# In Chrome they mean that the internet connection was lost or restored
window.addEventListener? 'online', ->
  # The event fires slightly before the browser is ready to make a request
  setTimeout Offline.confirmUp, 100
, false

window.addEventListener? 'offline', ->
  Offline.confirmDown()
, false

Offline.state = 'up'

Offline.markUp = ->
  Offline.trigger 'confirmed-up'

  return if Offline.state is 'up'

  Offline.state = 'up'
  Offline.trigger 'up'

Offline.markDown = ->
  Offline.trigger 'confirmed-down'

  return if Offline.state is 'down'

  Offline.state = 'down'
  Offline.trigger 'down'

handlers = {}

Offline.on = (event, handler, ctx) ->
  events = event.split(' ')

  if events.length > 1
    Offline.on(e, handler, ctx) for e in events
  else
    handlers[event] ?= []
    handlers[event].push [ctx, handler]

Offline.off = (event, handler) ->
  return unless handlers[event]?

  if not handler
    handlers[event] = []
  else
    i = 0
    while i < handlers[event].length
      [ctx, _handler] = handlers[event][i]
      if _handler is handler
        handlers[event].splice i, 1
      else
        i++

Offline.trigger = (event) ->
  if handlers[event]?
    # we have to make a copy of the handlers since its possible that the called functions will modify the handlers array by calling off/on 
    for [ctx, handler] in handlers[event][..]
      handler.call(ctx)

checkXHR = (xhr, onUp, onDown) ->
  checkStatus = ->
    if xhr.status and xhr.status < 12000
      onUp()
    else
      onDown()

  if xhr.onprogress is null
    # onprogress would be undefined on older browsers

    # XDomainRequest doesn't implement addEventListener
    _onerror = xhr.onerror
    xhr.onerror = ->
      onDown()

      _onerror?(arguments...)

    _ontimeout = xhr.ontimeout
    xhr.ontimeout = ->
      onDown()

      _ontimeout?(arguments...)

    _onload = xhr.onload
    xhr.onload = ->
      checkStatus()

      _onload?(arguments...)
  else
    _onreadystatechange = xhr.onreadystatechange
    xhr.onreadystatechange = ->
      if xhr.readyState is 4
        checkStatus()
      else if xhr.readyState is 0
        onDown()

      _onreadystatechange?(arguments...)

Offline.checks = {}
Offline.checks.xhr = ->
  xhr = new XMLHttpRequest

  xhr.offline = false

  # It doesn't matter what this hits, even a 404 is considered up.  It is important however that
  # it's on the same domain and port, so CORS issues don't come into play.
  xhr.open(Offline.getOption('checks.xhr.type'), Offline.getOption('checks.xhr.url'), true)

  if xhr.timeout?
    xhr.timeout = Offline.getOption('checks.xhr.timeout')

  checkXHR xhr, Offline.markUp, Offline.markDown

  try
    xhr.send()
  catch e
    # Catch NETWORK_ERRORS
    Offline.markDown()

  xhr

Offline.checks.image = ->
  img = document.createElement 'img'
  img.onerror = Offline.markDown
  img.onload = Offline.markUp
  img.src = Offline.getOption('checks.image.url')

  undefined

Offline.checks.down = Offline.markDown
Offline.checks.up = Offline.markUp

Offline.check = ->
  Offline.trigger 'checking'

  Offline.checks[Offline.getOption('checks.active')]()

Offline.confirmUp = Offline.confirmDown = Offline.check

Offline.onXHR = (cb) ->
  monitorXHR = (req, flags) ->
    _open = req.open
    req.open = (type, url, async, user, password) ->
      cb {type, url, async, flags, user, password, xhr: req}

      _open.apply req, arguments

  _XMLHttpRequest = window.XMLHttpRequest
  window.XMLHttpRequest = (flags) ->
    req = new _XMLHttpRequest(flags)

    monitorXHR req, flags

    _setRequestHeader = req.setRequestHeader
    req.headers = {}
    req.setRequestHeader = (name, value) ->
      req.headers[name] = value

      _setRequestHeader.call req, name, value

    _overrideMimeType = req.overrideMimeType
    req.overrideMimeType = (type) ->
      req.mimeType = type

      _overrideMimeType.call req, type

    req

  extendNative window.XMLHttpRequest, _XMLHttpRequest

  if window.XDomainRequest?
    _XDomainRequest = window.XDomainRequest
    window.XDomainRequest = ->
      req = new _XDomainRequest

      monitorXHR req

      req

    extendNative window.XDomainRequest, _XDomainRequest

init = ->
  if Offline.getOption 'interceptRequests'
    Offline.onXHR ({xhr}) ->
      unless xhr.offline is false
        checkXHR xhr, Offline.markUp, Offline.confirmDown

  if Offline.getOption 'checkOnLoad'
    Offline.check()

# We call init in a setTimeout to give time for options to be set
setTimeout init, 0

window.Offline = Offline


================================================
FILE: coffee/reconnect.coffee
================================================
unless window.Offline
  throw new Error "Offline Reconnect brought in without offline.js"

rc = Offline.reconnect = {}

retryIntv = null

reset = ->
  if rc.state? and rc.state isnt 'inactive'
    Offline.trigger 'reconnect:stopped'

  rc.state = 'inactive'
  rc.remaining = rc.delay = Offline.getOption('reconnect.initialDelay') ? 3

next = ->
  delay = Offline.getOption('reconnect.delay') ? Math.min(Math.ceil(rc.delay * 1.5), 3600)
  rc.remaining = rc.delay = delay

tick = ->
  return if rc.state is 'connecting'

  rc.remaining -= 1

  Offline.trigger 'reconnect:tick'
  if rc.remaining is 0
    tryNow()

tryNow = ->
  return if rc.state isnt 'waiting'

  Offline.trigger 'reconnect:connecting'
  rc.state = 'connecting'

  Offline.check()

down = ->
  return unless Offline.getOption('reconnect')

  reset()

  rc.state = 'waiting'
  
  Offline.trigger 'reconnect:started'
  retryIntv = setInterval tick, 1000

up = ->
  if retryIntv?
    clearInterval retryIntv

  reset()

nope = ->
  return unless Offline.getOption('reconnect')

  if rc.state is 'connecting'
    Offline.trigger 'reconnect:failure'
    rc.state = 'waiting'
    next()

rc.tryNow = tryNow

reset()

Offline.on 'down', down
Offline.on 'confirmed-down', nope
Offline.on 'up', up


================================================
FILE: coffee/requests.coffee
================================================
unless window.Offline
  throw new Error "Requests module brought in without offline.js"

held = []

waitingOnConfirm = false
holdRequest = (req) ->
  return if Offline.getOption('requests') is false
  Offline.trigger 'requests:capture'

  if Offline.state isnt 'down'
    waitingOnConfirm = true

  held.push req

makeRequest = ({xhr, url, type, user, password, body}) ->
  return if Offline.getOption('requests') is false
  xhr.abort()
  xhr.open(type, url, true, user, password)
  xhr.setRequestHeader(name, val) for name, val of xhr.headers

  if xhr.mimeType
    xhr.overrideMimeType xhr.mimeType

  xhr.send(body)

clear = ->
  held = []

flush = ->
  return if Offline.getOption('requests') is false
  Offline.trigger 'requests:flush'

  requests = {}
  # Dedup requests, favoring the later request
  # TODO: Throw out PUT/POST/DELETE requests after too much time?
  for request in held
    # Break cache breaking
    url = request.url.replace /(\?|&)_=[0-9]+/, (match, chr) ->
      if chr is '?' then chr else ''

    if Offline.getOption('deDupBody')
      body = request.body
      if body.toString() is '[object Object]'
        body = JSON.stringify(body)
      else
        body = body.toString()
      requests["#{ request.type.toUpperCase() } - #{ url } - #{ body }"] = request;
    else
      requests["#{ request.type.toUpperCase() } - #{ url }"] = request

  for key, request of requests
    makeRequest request

  clear()

setTimeout ->
  unless Offline.getOption('requests') is false
    Offline.on 'confirmed-up', ->
      if waitingOnConfirm
        waitingOnConfirm = false
        clear()

    Offline.on 'up', flush

    Offline.on 'down', ->
      waitingOnConfirm = false

    Offline.onXHR (request) ->
      {xhr, async} = request

      return if xhr.offline is false

      hold = -> holdRequest request

      _send = xhr.send
      xhr.send = (body) ->
        request.body = body

        _send.apply xhr, arguments

      return unless async

      if xhr.onprogress is null
        xhr.addEventListener 'error', hold, false
        xhr.addEventListener 'timeout', hold, false
      else
        _onreadystatechange = xhr.onreadystatechange
        xhr.onreadystatechange = ->
          if xhr.readyState is 0
            hold()
          else if xhr.readyState is 4 and (xhr.status is 0 or xhr.status >= 12000)
            hold()

          _onreadystatechange?(arguments...)

    Offline.requests = {
      flush,
      clear
    }
, 0


================================================
FILE: coffee/simulate.coffee
================================================
unless Offline
  throw new Error("Offline simulate brought in without offline.js")

for state in ['up', 'down']
    try
      simulate = document.querySelector("script[data-simulate='#{ state }']") or localStorage?.OFFLINE_SIMULATE is state
    catch e
      simulate = false

  if simulate
    Offline.options ?= {}
    Offline.options.checks ?= {}
    Offline.options.checks.active = state


================================================
FILE: coffee/snake.coffee
================================================
canvas = dot = score = speed = stop = snake = randDot = fill = null

render = ->
  canvas = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
  canvas.setAttribute 'style', 'width: 100%; height: 100%; margin: -8px; position: absolute; top: 0; left: 0; z-index: 1000'
  canvas.setAttribute 'viewBox', '0 0 1000 1000'
  document.body.appendChild canvas

  dot = document.createElementNS('http://www.w3.org/2000/svg', 'circle')
  dot.setAttribute 'r', 20
  do randDot = ->
    dot.setAttribute 'cx', (Math.random() * 960)|0 + 20
    dot.setAttribute 'cy', (Math.random() * 960)|0 + 20

  canvas.appendChild dot

  snake =
    direction: 0
    nodes: []

  score = 0
  speed = 10
  stop = false

  move()

move = ->
  return if stop

  lastNode = snake.nodes[snake.nodes.length - 1]
  if lastNode
    lastX = +lastNode.getAttribute('cx')
    lastY = +lastNode.getAttribute('cy')

  else
    lastX = 500
    lastY = 500

  if snake.nodes.length > score
    old = snake.nodes.shift()
    canvas.removeChild old

  nX = lastX + Math.cos(snake.direction) * speed
  nY = lastY + Math.sin(snake.direction) * speed

  node = document.createElementNS('http://www.w3.org/2000/svg', 'circle')
  node.setAttribute 'r', 20
  node.setAttribute 'cx', nX
  node.setAttribute 'cy', nY

  if fill
    node.style.fill = fill

  dotX = +dot.getAttribute('cx')
  dotY = +dot.getAttribute('cy')
  if dotX - 20 < nX < dotX + 20 and dotY - 20 < nY < dotY + 20
    score++
    speed++
    randDot()

  canvas.appendChild node
  snake.nodes.push node

  requestAnimationFrame move

keyHandler = (e) ->
  if 37 <= e.keyCode <= 40
    snake.direction = Math.PI/2 * ((e.keyCode - 35) % 4)

    return false

show = ->
  document.addEventListener 'keydown', keyHandler

  render()

hide = ->
  document.removeEventListener 'keydown', keyHandler
  stop = true

  document.removeChild canvas

setTimeout ->
  if Offline.getOption('game') and document.addEventListener?
    Offline.on 'down', show
    Offline.on 'up', hide
    Offline.on 'reconnect:failure', ->
      fill = '#ec8787'
      setTimeout ->
        fill = 'black'
      , 2000
, 0


================================================
FILE: coffee/ui.coffee
================================================
unless window.Offline
  throw new Error "Offline UI brought in without offline.js"

TEMPLATE = '<div class="offline-ui"><div class="offline-ui-content"></div></div>'
RETRY_TEMPLATE = '<a href class="offline-ui-retry"></a>'

createFromHTML = (html) ->
  el = document.createElement('div')
  el.innerHTML = html
  el.children[0]

el = content = null
addClass = (name) ->
  removeClass name
  el.className += " #{ name }"

removeClass = (name) ->
  el.className = el.className.replace new RegExp("(^| )#{ name.split(' ').join('|') }( |$)", 'gi'), ' '

flashTimeouts = {}
flashClass = (name, time) ->
  addClass name

  if flashTimeouts[name]?
    clearTimeout flashTimeouts[name]

  flashTimeouts[name] = setTimeout ->
    removeClass name
    delete flashTimeouts[name]
  , time * 1000

roundTime = (sec) ->
  units =
    'day': 86400
    'hour': 3600
    'minute': 60
    'second': 1

  for unit, mult of units
    if sec >= mult
      val = Math.floor(sec / mult)

      return [val, unit]

  return ['now', '']

render = ->
  el = createFromHTML TEMPLATE
  document.body.appendChild el

  if Offline.reconnect? and Offline.getOption('reconnect')
    el.appendChild createFromHTML RETRY_TEMPLATE

    button = el.querySelector('.offline-ui-retry')
    handler = (e) ->
      e.preventDefault()

      Offline.reconnect.tryNow()

    if button.addEventListener?
      button.addEventListener 'click', handler, false
    else
      button.attachEvent 'click', handler

  addClass "offline-ui-#{ Offline.state }"

  content = el.querySelector('.offline-ui-content')

init = ->
  render()

  Offline.on 'up', ->
    removeClass 'offline-ui-down'
    addClass 'offline-ui-up'

    flashClass 'offline-ui-up-2s', 2
    flashClass 'offline-ui-up-5s', 5

  Offline.on 'down', ->
    removeClass 'offline-ui-up'
    addClass 'offline-ui-down'

    flashClass 'offline-ui-down-2s', 2
    flashClass 'offline-ui-down-5s', 5

  Offline.on 'reconnect:connecting', ->
    addClass 'offline-ui-connecting'
    removeClass 'offline-ui-waiting'

  Offline.on 'reconnect:tick', ->
    addClass 'offline-ui-waiting'
    removeClass 'offline-ui-connecting'

    [time, unit] = roundTime Offline.reconnect.remaining

    content.setAttribute 'data-retry-in-value', time
    content.setAttribute 'data-retry-in-unit', unit

  Offline.on 'reconnect:stopped', ->
    removeClass 'offline-ui-connecting offline-ui-waiting'

    content.setAttribute 'data-retry-in-value', null
    content.setAttribute 'data-retry-in-unit', null

  Offline.on 'reconnect:failure', ->
    flashClass 'offline-ui-reconnect-failed-2s', 2
    flashClass 'offline-ui-reconnect-failed-5s', 5

  Offline.on 'reconnect:success', ->
    flashClass 'offline-ui-reconnect-succeeded-2s', 2
    flashClass 'offline-ui-reconnect-succeeded-5s', 5

if document.readyState is 'complete'
  init()
else if document.addEventListener?
  document.addEventListener 'DOMContentLoaded', init, false
else
  # IE8

  _onreadystatechange = document.onreadystatechange
  document.onreadystatechange = ->
    if document.readyState is 'complete'
      init()

    _onreadystatechange?(arguments...)


================================================
FILE: docs/welcome/app.js
================================================
$(function(){
    var themes = [{
        name: 'default',
        title: 'Default'
    }, {
        name: 'slide',
        title: 'Slide'
    }, {
        name: 'dark',
        title: 'Dark'
    }, {
        name: 'chrome',
        title: 'Chrome'
    }];

    var indicatorThemes = [{
        name: 'default-indicator',
        title: 'Default'
    }, {
        name: 'slide-indicator',
        title: 'Slide'
    }, {
        name: 'dark-indicator',
        title: 'Dark'
    }, {
        name: 'chrome-indicator',
        title: 'Chrome'
    }];

    var addThemes = function(themes, selector) {
        $.each(themes, function(i, theme){
            $(selector).append('<div class="theme ' + (i % 2 === 0 ? 'even' : 'odd') + '">'+
                '<h3>' + theme.title + '</h3>' +
                '<p><a href="/offline/themes/offline-theme-' + theme.name + '.css" class="download-link">download</a></p>'+
                '<div class="browser"><iframe data-theme="' + theme.name + '"></iframe></div>' +
            '</div>');
        });
    };

    addThemes(themes, '.full-themes');
    addThemes(indicatorThemes, '.indicator-themes');

    $('.browser iframe').each(function(){
        var _this = this;
        var themeName = $(this).data('theme');

        doc = (this.contentWindow || this.documentWindow).document;
        doc.open();
        doc.write('' +
            '<link rel="stylesheet" href="/offline/themes/offline-theme-' + themeName + '.css" />' +
            '<link rel="stylesheet" href="/offline/themes/offline-language-english' + (themeName.match(/\-indicator$/) ? '-indicator' : '') + '.css" />' +
            '<div data-phase="0" class="offline-ui offline-ui-down offline-ui-down-5s"><div class="offline-ui-content"></div><a class="offline-ui-retry"></a></div>' +
        '');
        doc.close();
    });

    var phases = [
        [5, 'offline-ui offline-ui-down offline-ui-down-5s', '', ''],
        [3, 'offline-ui offline-ui-down offline-ui-connecting offline-ui-waiting', '5 seconds', '5s'],
        [1, 'offline-ui offline-ui-down offline-ui-connecting offline-ui-waiting', '4 seconds', '4s'],
        [1, 'offline-ui offline-ui-down offline-ui-connecting offline-ui-waiting', '3 seconds', '3s'],
        [1, 'offline-ui offline-ui-down offline-ui-connecting offline-ui-waiting', '2 seconds', '2s'],
        [1, 'offline-ui offline-ui-down offline-ui-connecting offline-ui-waiting', '1 seconds', '1s'],
        [1, 'offline-ui offline-ui-up offline-ui-up-5s', '', '']
    ];

    var nextPhase = function() {
        var phase;

        $('.browser iframe').each(function(){
            var $offline = $(this).contents().find('.offline-ui'),
                $content = $offline.find('.offline-ui-content');

            phase = parseInt($offline.attr('data-phase'), 10);

            $offline.get(0).className = phases[phase][1];
            $content.attr('data-retry-in', phases[phase][2]);
            $content.attr('data-retry-in-abbr', phases[phase][3]);

            phase = (phase + 1) % phases.length;
            $offline.attr('data-phase', phase);
        });

        setTimeout(function(){
            nextPhase();
        }, phases[phase][0] * 1000);
    };

    nextPhase();
});

================================================
FILE: docs/welcome/images/ethernet-cable.sketch/fonts
================================================


================================================
FILE: docs/welcome/images/ethernet-cable.sketch/version
================================================
14

================================================
FILE: docs/welcome/images/macbook-pro-top.sketch/fonts
================================================


================================================
FILE: docs/welcome/images/macbook-pro-top.sketch/version
================================================
14

================================================
FILE: docs/welcome/images/macbook-pro.sketch/fonts
================================================


================================================
FILE: docs/welcome/images/macbook-pro.sketch/version
================================================
14

================================================
FILE: docs/welcome/index.html
================================================
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js ie6 ie9-and-less ie8-and-less ie7-and-less" lang="en"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7 ie9-and-less ie8-and-less ie7-and-less" lang="en"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8 ie9-and-less ie8-and-less" lang="en"> <![endif]-->
<!--[if IE 9]>    <html class="no-js ie9 ie9-and-less" lang="en"> <![endif]-->
<!--[if gt IE 9]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="chrome=1">
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        <title>Offline.js – Handle your users losing their internet connection like a pro</title>
        <meta name="description" content="Offline.js is a Javascript and CSS library to automatically alert your users when they've lost internet connectivity.  It turns any app into an offline app.">
        <link rel="icon" href="http://static.hubspot.com/favicon.ico">
        <script type="text/javascript" src="//use.typekit.net/jbn8qxr.js"></script>
        <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min.js"></script>
        <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
        <script src="/offline/offline.min.js"></script>
        <link rel="stylesheet" href="/offline/themes/offline-theme-default.css" />
        <link rel="stylesheet" href="/offline/themes/offline-language-english.css" />
    </head>
    <body>
        <style>
            .section.colored {
                background: #61A0FF;
                -webkit-transition: background 1s 1.5s ease-in-out;
                -moz-transition: background 1s 1.5s ease-in-out;
                transition: background 1s 1.5s ease-in-out;
            }
            .header .button {
                color: #61A0FF;
                -webkit-transition: color 1s 1.5s ease-in-out;
                -moz-transition: color 1s 1.5s ease-in-out;
                transition: color 1s 1.5s ease-in-out;
            }
            .page-loaded .section.colored {
                background: #F66;
            }
            .page-loaded .header .button {
                color: #F66;
            }

            a.download-src-link, .button {
                background: #444;
            }

            a, a:hover, a:active, .header .title .title2:before {
                color: #F66;
            }
        </style>
        <style>
            html, body {
                margin: 0;
                height: 100%;
                color: #444;
            }

            a, a:hover, a:active {
                text-decoration: none
            }

            body {
                font-family: "proxima-nova", "Helvetica Neue", sans-serif;
            }

            html .offline-ui {
                font-size: 16px;
            }

            @media (min-width: 1700px) { html { font-size: 188%; } }
            @media (max-width: 1700px) { html { font-size: 188%; } }
            @media (max-width: 1680px) { html { font-size: 186%; } }
            @media (max-width: 1660px) { html { font-size: 184%; } }
            @media (max-width: 1640px) { html { font-size: 182%; } }
            @media (max-width: 1620px) { html { font-size: 180%; } }
            @media (max-width: 1600px) { html { font-size: 178%; } }
            @media (max-width: 1580px) { html { font-size: 176%; } }
            @media (max-width: 1560px) { html { font-size: 174%; } }
            @media (max-width: 1540px) { html { font-size: 172%; } }
            @media (max-width: 1520px) { html { font-size: 170%; } }
            @media (max-width: 1500px) { html { font-size: 168%; } }
            @media (max-width: 1480px) { html { font-size: 166%; } }
            @media (max-width: 1460px) { html { font-size: 164%; } }
            @media (max-width: 1440px) { html { font-size: 162%; } }
            @media (max-width: 1420px) { html { font-size: 160%; } }
            @media (max-width: 1400px) { html { font-size: 158%; } }
            @media (max-width: 1380px) { html { font-size: 156%; } }
            @media (max-width: 1360px) { html { font-size: 154%; } }
            @media (max-width: 1340px) { html { font-size: 152%; } }
            @media (max-width: 1320px) { html { font-size: 150%; } }
            @media (max-width: 1300px) { html { font-size: 148%; } }
            @media (max-width: 1280px) { html { font-size: 146%; } }
            @media (max-width: 1260px) { html { font-size: 144%; } }
            @media (max-width: 1240px) { html { font-size: 142%; } }
            @media (max-width: 1220px) { html { font-size: 140%; } }
            @media (max-width: 1200px) { html { font-size: 138%; } }
            @media (max-width: 1180px) { html { font-size: 136%; } }
            @media (max-width: 1160px) { html { font-size: 134%; } }
            @media (max-width: 1140px) { html { font-size: 132%; } }
            @media (max-width: 1120px) { html { font-size: 130%; } }
            @media (max-width: 1100px) { html { font-size: 128%; } }
            @media (max-width: 1080px) { html { font-size: 126%; } }
            @media (max-width: 1060px) { html { font-size: 124%; } }
            @media (max-width: 1040px) { html { font-size: 122%; } }
            @media (max-width: 1020px) { html { font-size: 120%; } }

            .page {
                position: relative;
            }

            .section.colored .page {
                height: 100%;
            }

            .header {
                color: #fff;
                height: 12rem;
                max-width: 100%;
                position: absolute;
                margin: auto;
                top: 0;
                bottom: 0;
                left: 2rem;
                right: 2rem;
            }
            @media (max-width: 768px) {
                .header {
                    height: 17rem;
                }
            }
            .header h1 {
                font-size: 2rem;
                font-weight: 800;
                margin: 0;
            }
            .header h3 {
                font-size: 1.5rem;
                font-weight: 800;
                margin: 0;
            }
            .header .button {
                background: #fff;
            }

            .section {
                position: relative;
                height: 100%;
                padding-top: 1rem;
                padding-bottom: 1rem;
                -webkit-box-sizing: border-box;
                -moz-box-sizing: border-box;
                box-sizing: border-box;
            }

            .section.colored {
                overflow: hidden;
                color: #fff;
            }

            .section.colored .page {
                text-align: left;
            }

            .up-arrow, .down-arrow {
                width: 100%;
                text-align: center;
                font-size: 2rem;
            }

            .down-arrow {
                position: absolute;
                left: 0;
                -webkit-transform: rotate(180deg);
                -moz-transform: rotate(180deg);
                -ms-transform: rotate(180deg);
                -o-transform: rotate(180deg);
                transform: rotate(180deg);
                bottom: 30px;
            }

            .section.colored .down-arrow {
                color: rgba(255, 255, 255, .5);
            }


            h2 {
                text-align: center;
            }
            .themes {
                text-align: center;
            }
            .browser {
                background: #e0e0e0;
                border: 4px solid #e0e0e0;
                width: 100%;
                height: 7rem;
                padding-top: 20px;
                margin: 0 0 10px;
                -webkit-box-sizing: border-box;
                -moz-box-sizing: border-box;
                box-sizing: border-box;
            }
            .browser iframe {
                border: 0;
                background: #fff;
                height: 100%;
                width: 100%;
            }
            input[type="color"] {
                width: 15rem;
                height: 2.3rem;
                font-size: 1rem;
                position: relative;
                font-family: inherit;
                cursor: pointer;
            }
            input[type="color"]::before {
                content: " ";
                display: block;
                position: absolute;
                top: 0;
                left: 3px;
                right: 3px;
                height: 100%;
                border: 6px solid #fff;
                -webkit-box-sizing: border-box;
                -moz-box-sizing: border-box;
                box-sizing: border-box;
            }
            input[type="color"]::after {
                content: "Choose a color";
                display: block;
                text-align: center;
                position: absolute;
                top: 0;
                left: -2px;
                right: -2px;
                height: 100%;
                font-size: .7rem;
                line-height: 2rem;
                color: #fcfcfc;
                color: rgba(255, 255, 255, 1);
                font-weight: 800;
                text-transform: uppercase;
                letter-spacing: 2px;
                border: 6px solid #fff;
                -webkit-box-sizing: border-box;
                -moz-box-sizing: border-box;
                box-sizing: border-box;
            }
            input[type="color"]:active::after {
                color: rgba(255, 255, 255, 0.4);
            }

            .themes h3 {
                margin-top: 1.5em;
                margin-bottom: 0;
            }

            .themes h3 + p {
                margin-top: 0;
            }

            .page {
                text-align: center;
                max-width: 32rem;
                padding: 0 10px;
                margin: 0 auto;
            }

            .themes a, .themes a:hover, .themes a:active {
                text-decoration: none;
                font-size: .7rem;
                text-transform: uppercase;
                letter-spacing: 2px;
            }

            a.button {
                padding: 0.5rem 1rem;
                color: #fff;
                cursor: pointer;
                font-size: 1rem;
                text-transform: uppercase;
                letter-spacing: .1em;
                text-decoration: none;
            }
            .themes-pitch {
                padding: 15px;
            }
            .block {
                padding: 10px 0;
            }
            .color-label {
                display: none;
            }

            .ethernet-cable {
                width: 148rem;
                height: 4rem;
                margin-left: -148rem;
                position: relative;
                left: 200%;
                -webkit-transition: left 1s .5s ease-in-out;
                -moz-transition: left 1s .5s ease-in-out;
                transition: left 1s .5s ease-in-out;
                background: url("/offline/docs/welcome/images/ethernet-cable.png") no-repeat top left;
                background-size: 148rem 4rem;
            }

            .page-loaded .ethernet-cable {
                left: 110%;
            }

            @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
                .ethernet-cable {
                    background-image: url("/offline/docs/welcome/images/ethernet-cable@2x.png");
                }
            }

            @media (max-width: 768px) {
                .ethernet-cable {
                    margin-top: 2rem;
                    margin-bottom: 2rem;
                }

                .page-loaded .ethernet-cable {
                    left: 80%;
                }
            }
        </style>

        <div class="section colored">
            <div class="page">
                <div class="header">
                    <h1>Offline.js</h1>
                    <h3>Every app goes offline</h3>
                    <div class="ethernet-cable"></div>
                    <h3><a class="button" href="http://github.com/hubspot/offline">★ On GitHub</a></h3>
                </div>
            </div>
            <div class="down-arrow">⇪</div>
        </div>

        <div class="section">
            <div class="page">
                <h2>What is Offline.js?</h2>
                <p style="text-align: left">Offline.js is a library to automatically alert your users when they've lost internet connectivity, like Gmail.</p>
                <p style="text-align: left">It captures AJAX requests which were made while the connection was down, and remakes them when it's back up, so your app reacts perfectly.</p>
                <p style="text-align: left">It has a number of beautiful themes and requires no configuration.</p>
                <br/>
                <h2>Install</h2>
                <p>The easiest way to add Offline to your site is with <a href="http://eager.io" style="color: #bf0c78">Eager</a>.
                <p>Click Install to see a live preview of Offline on your website.</p>
                <iframe style="height: 48px; width: 180px" src="//install.eager.io?appId=NnkeiqegQ2K4" allowtransparency="true" scroll="no" frameBorder="0"></iframe>
                <br/>
                <br/>
                <h2>Download</h2>
                <p><a class="button" href="https://raw.github.com/HubSpot/offline/v0.7.14/offline.min.js">Offline.js</a></p>
                <br/>
                <h2>Pick a Theme</h2>
                <div class="themes full-themes"></div>
                <h2>Indicator Themes</h2>
                <div class="themes indicator-themes"></div>
                <p class="block">Submit a theme! <a href="https://github.com/HubSpot/offline">Fork us on GitHub</a></p>
                <p class="block"><a class="button" href="http://github.hubspot.com/offline/">Documentation</a></p>
                <br/>
                <p style="font-size: 0.6rem"><a href="http://dev.hubspot.com">HubSpot</a></p>
                <br/>
                <br/>
                <script src="app.js"></script>
            </div>
        </div>

        <script>setTimeout(function(){ document.body.className = 'page-loaded' }, 0);</script>

        <!-- Share -->

        <style>
            #retweet_button {
                position: fixed;
                bottom: 30px;
                left: 30px;
                width: 100px;
                -webkit-filter: grayscale(1) contrast(1.3);
                z-index: 3;
            }
            #retweet_button:hover {
                -webkit-filter: none;
            }
            #github_stars {
                position: fixed;
                bottom: 30px;
                left: 130px;
                width: 100px;
                -webkit-filter: grayscale(1) contrast(1.3);
                z-index: 3;
            }
            #github_stars:hover {
                -webkit-filter: none;
            }
            .hn-share-button-wrapper {
                position: fixed;
                bottom: 29px;
                left: 227px;
                -webkit-filter: grayscale(1) contrast(1.3);
                z-index: 3;
            }
            .hn-share-button-wrapper:hover {
                -webkit-filter: none;
            }
        </style>
        <div id="retweet_button">
            <a href="http://twitter.com/share" class="twitter-share-button" data-url="http://github.hubspot.com/offline/docs/welcome" data-text="Offline.js - Automatically alert your users when they've lost their internet connection." data-count="horizontal" data-via="HubSpotDev">Tweet</a>
            <script>
              if (Math.random() >= 0.5)
                var recommends = ['hubspotdev', 'zackbloom', 'adamfschwartz'];
              else
                var recommends = ['hubspotdev', 'adamfschwartz', 'zackbloom'];

              var $button = $('.twitter-share-button');
              if ($button.length)
                $button.data('related', recommends.join(','));
            </script>
            <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
        </div>
        <div id="github_stars">
            <iframe src="http://ghbtns.com/github-btn.html?user=HubSpot&amp;repo=offline&amp;type=watch&amp;count=true&amp;size=small" allowtransparency="true" frameborder="0" scrolling="0" width="200" height="20"></iframe>
        </div>

        <!-- Start of Async HubSpot Analytics Code -->
        <script type="text/javascript">
            (function(d,s,i,r) {
                if (d.getElementById(i)){return;}
                var n=d.createElement(s),e=d.getElementsByTagName(s)[0];
                n.id=i;n.src='//js.hubspot.com/analytics/'+(Math.ceil(new Date()/r)*r)+'/51294.js';
                e.parentNode.insertBefore(n, e);
            })(document,"script","hs-analytics",300000);
        </script>
        <!-- End of Async HubSpot Analytics Code -->

        <script>
          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

          ga('create', 'UA-45159009-1', 'hubspot.com');
          ga('send', 'pageview');
        </script>

        <!-- Force 3d acceleration always and forever :) -->
        <div style="-webkit-transform: translateZ(0)"></div>
    </body>
</html>


================================================
FILE: install.json
================================================
{
  "resources": {
    "head": [
      {
        "type": "script",
        "src": "./offline.min.js"
      },
      {
        "type": "style",
        "src": "./themes/offline-language-{{ options.language }}.css",
        "if": "!options.indicator"
      },
      {
        "type": "style",
        "src": "./themes/offline-language-{{ options.language }}-indicator.css",
        "if": "options.indicator"
      },
      {
        "type": "style",
        "src": "./themes/offline-theme-{{ options.theme }}.css",
        "if": "!options.indicator"
      },
      {
        "type": "style",
        "src": "./themes/offline-theme-{{ options.theme }}-indicator.css",
        "if": "options.indicator"
      }
    ]
  },
  "options": {
    "properties": {
      "indicator": {
        "title": "Always on",
        "description": "When checked, a connectivity indicator will always be present on the bottom-left corner of the page. When unchecked, Offline will only show a message when there are connectivity issues.",
        "type": "boolean",
        "default": false
      },
      "language": {
        "title": "Language",
        "description": "The language of the message displayed to the user when connectivity is lost or regained.",
        "type": "string",
        "enum": [
          "arabic",
          "chinese-simplified",
          "chinese-traditional",
          "dutch",
          "english",
          "french",
          "german",
          "italian",
          "pashto",
          "persian",
          "polish",
          "portuguese-brazil",
          "spanish",
          "turkish"
        ],
        "enumNames": {
          "arabic": "Arabic",
          "chinese-simplified": "Simplified Chinese",
          "chinese-traditional": "Traditional Chinese",
          "czech": "Czech",
          "dutch": "Dutch",
          "english": "English",
          "french": "French",
          "german": "German",
          "italian": "Italian",
          "pashto": "Pashto",
          "persian": "Persian",
          "polish": "Polish",
          "portuguese-brazil": "Brazilian Portuguese",
          "spanish": "Spanish",
          "turkish": "Turkish"
        },
        "default": "english"
      },
      "theme": {
        "title": "Theme",
        "description": "Describes the look and feel of the message.",
        "type": "string",
        "enum": [
          "default",
          "dark",
          "chrome",
          "slide"
        ],
        "enumNames": {
          "default": "Default",
          "dark": "Dark",
          "chrome": "Chrome",
          "slide": "Slide"
        },
        "default": "default"
      }
    }
  }
}


================================================
FILE: js/offline.js
================================================
(function() {
  var Offline, checkXHR, defaultOptions, extendNative, grab, handlers, init;

  extendNative = function(to, from) {
    var e, key, results, val;
    results = [];
    for (key in from.prototype) {
      try {
        val = from.prototype[key];
        if ((to[key] == null) && typeof val !== 'function') {
          results.push(to[key] = val);
        } else {
          results.push(void 0);
        }
      } catch (_error) {
        e = _error;
      }
    }
    return results;
  };

  Offline = {};

  Offline.options = window.Offline ? window.Offline.options || {} : {};

  defaultOptions = {
    checks: {
      xhr: {
        url: function() {
          return "/favicon.ico?_=" + ((new Date()).getTime());
        },
        timeout: 5000,
        type: 'HEAD'
      },
      image: {
        url: function() {
          return "/favicon.ico?_=" + ((new Date()).getTime());
        }
      },
      active: 'xhr'
    },
    checkOnLoad: false,
    interceptRequests: true,
    reconnect: true,
    deDupBody: false
  };

  grab = function(obj, key) {
    var cur, i, j, len, part, parts;
    cur = obj;
    parts = key.split('.');
    for (i = j = 0, len = parts.length; j < len; i = ++j) {
      part = parts[i];
      cur = cur[part];
      if (typeof cur !== 'object') {
        break;
      }
    }
    if (i === parts.length - 1) {
      return cur;
    } else {
      return void 0;
    }
  };

  Offline.getOption = function(key) {
    var ref, val;
    val = (ref = grab(Offline.options, key)) != null ? ref : grab(defaultOptions, key);
    if (typeof val === 'function') {
      return val();
    } else {
      return val;
    }
  };

  if (typeof window.addEventListener === "function") {
    window.addEventListener('online', function() {
      return setTimeout(Offline.confirmUp, 100);
    }, false);
  }

  if (typeof window.addEventListener === "function") {
    window.addEventListener('offline', function() {
      return Offline.confirmDown();
    }, false);
  }

  Offline.state = 'up';

  Offline.markUp = function() {
    Offline.trigger('confirmed-up');
    if (Offline.state === 'up') {
      return;
    }
    Offline.state = 'up';
    return Offline.trigger('up');
  };

  Offline.markDown = function() {
    Offline.trigger('confirmed-down');
    if (Offline.state === 'down') {
      return;
    }
    Offline.state = 'down';
    return Offline.trigger('down');
  };

  handlers = {};

  Offline.on = function(event, handler, ctx) {
    var e, events, j, len, results;
    events = event.split(' ');
    if (events.length > 1) {
      results = [];
      for (j = 0, len = events.length; j < len; j++) {
        e = events[j];
        results.push(Offline.on(e, handler, ctx));
      }
      return results;
    } else {
      if (handlers[event] == null) {
        handlers[event] = [];
      }
      return handlers[event].push([ctx, handler]);
    }
  };

  Offline.off = function(event, handler) {
    var _handler, ctx, i, ref, results;
    if (handlers[event] == null) {
      return;
    }
    if (!handler) {
      return handlers[event] = [];
    } else {
      i = 0;
      results = [];
      while (i < handlers[event].length) {
        ref = handlers[event][i], ctx = ref[0], _handler = ref[1];
        if (_handler === handler) {
          results.push(handlers[event].splice(i, 1));
        } else {
          results.push(i++);
        }
      }
      return results;
    }
  };

  Offline.trigger = function(event) {
    var ctx, handler, j, len, ref, ref1, results;
    if (handlers[event] != null) {
      ref = handlers[event].slice(0);
      results = [];
      for (j = 0, len = ref.length; j < len; j++) {
        ref1 = ref[j], ctx = ref1[0], handler = ref1[1];
        results.push(handler.call(ctx));
      }
      return results;
    }
  };

  checkXHR = function(xhr, onUp, onDown) {
    var _onerror, _onload, _onreadystatechange, _ontimeout, checkStatus;
    checkStatus = function() {
      if (xhr.status && xhr.status < 12000) {
        return onUp();
      } else {
        return onDown();
      }
    };
    if (xhr.onprogress === null) {
      _onerror = xhr.onerror;
      xhr.onerror = function() {
        onDown();
        return typeof _onerror === "function" ? _onerror.apply(null, arguments) : void 0;
      };
      _ontimeout = xhr.ontimeout;
      xhr.ontimeout = function() {
        onDown();
        return typeof _ontimeout === "function" ? _ontimeout.apply(null, arguments) : void 0;
      };
      _onload = xhr.onload;
      return xhr.onload = function() {
        checkStatus();
        return typeof _onload === "function" ? _onload.apply(null, arguments) : void 0;
      };
    } else {
      _onreadystatechange = xhr.onreadystatechange;
      return xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
          checkStatus();
        } else if (xhr.readyState === 0) {
          onDown();
        }
        return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0;
      };
    }
  };

  Offline.checks = {};

  Offline.checks.xhr = function() {
    var e, xhr;
    xhr = new XMLHttpRequest;
    xhr.offline = false;
    xhr.open(Offline.getOption('checks.xhr.type'), Offline.getOption('checks.xhr.url'), true);
    if (xhr.timeout != null) {
      xhr.timeout = Offline.getOption('checks.xhr.timeout');
    }
    checkXHR(xhr, Offline.markUp, Offline.markDown);
    try {
      xhr.send();
    } catch (_error) {
      e = _error;
      Offline.markDown();
    }
    return xhr;
  };

  Offline.checks.image = function() {
    var img;
    img = document.createElement('img');
    img.onerror = Offline.markDown;
    img.onload = Offline.markUp;
    img.src = Offline.getOption('checks.image.url');
    return void 0;
  };

  Offline.checks.down = Offline.markDown;

  Offline.checks.up = Offline.markUp;

  Offline.check = function() {
    Offline.trigger('checking');
    return Offline.checks[Offline.getOption('checks.active')]();
  };

  Offline.confirmUp = Offline.confirmDown = Offline.check;

  Offline.onXHR = function(cb) {
    var _XDomainRequest, _XMLHttpRequest, monitorXHR;
    monitorXHR = function(req, flags) {
      var _open;
      _open = req.open;
      return req.open = function(type, url, async, user, password) {
        cb({
          type: type,
          url: url,
          async: async,
          flags: flags,
          user: user,
          password: password,
          xhr: req
        });
        return _open.apply(req, arguments);
      };
    };
    _XMLHttpRequest = window.XMLHttpRequest;
    window.XMLHttpRequest = function(flags) {
      var _overrideMimeType, _setRequestHeader, req;
      req = new _XMLHttpRequest(flags);
      monitorXHR(req, flags);
      _setRequestHeader = req.setRequestHeader;
      req.headers = {};
      req.setRequestHeader = function(name, value) {
        req.headers[name] = value;
        return _setRequestHeader.call(req, name, value);
      };
      _overrideMimeType = req.overrideMimeType;
      req.overrideMimeType = function(type) {
        req.mimeType = type;
        return _overrideMimeType.call(req, type);
      };
      return req;
    };
    extendNative(window.XMLHttpRequest, _XMLHttpRequest);
    if (window.XDomainRequest != null) {
      _XDomainRequest = window.XDomainRequest;
      window.XDomainRequest = function() {
        var req;
        req = new _XDomainRequest;
        monitorXHR(req);
        return req;
      };
      return extendNative(window.XDomainRequest, _XDomainRequest);
    }
  };

  init = function() {
    if (Offline.getOption('interceptRequests')) {
      Offline.onXHR(function(arg) {
        var xhr;
        xhr = arg.xhr;
        if (xhr.offline !== false) {
          return checkXHR(xhr, Offline.markUp, Offline.confirmDown);
        }
      });
    }
    if (Offline.getOption('checkOnLoad')) {
      return Offline.check();
    }
  };

  setTimeout(init, 0);

  window.Offline = Offline;

}).call(this);


================================================
FILE: js/reconnect.js
================================================
(function() {
  var down, next, nope, rc, reset, retryIntv, tick, tryNow, up;

  if (!window.Offline) {
    throw new Error("Offline Reconnect brought in without offline.js");
  }

  rc = Offline.reconnect = {};

  retryIntv = null;

  reset = function() {
    var ref;
    if ((rc.state != null) && rc.state !== 'inactive') {
      Offline.trigger('reconnect:stopped');
    }
    rc.state = 'inactive';
    return rc.remaining = rc.delay = (ref = Offline.getOption('reconnect.initialDelay')) != null ? ref : 3;
  };

  next = function() {
    var delay, ref;
    delay = (ref = Offline.getOption('reconnect.delay')) != null ? ref : Math.min(Math.ceil(rc.delay * 1.5), 3600);
    return rc.remaining = rc.delay = delay;
  };

  tick = function() {
    if (rc.state === 'connecting') {
      return;
    }
    rc.remaining -= 1;
    Offline.trigger('reconnect:tick');
    if (rc.remaining === 0) {
      return tryNow();
    }
  };

  tryNow = function() {
    if (rc.state !== 'waiting') {
      return;
    }
    Offline.trigger('reconnect:connecting');
    rc.state = 'connecting';
    return Offline.check();
  };

  down = function() {
    if (!Offline.getOption('reconnect')) {
      return;
    }
    reset();
    rc.state = 'waiting';
    Offline.trigger('reconnect:started');
    return retryIntv = setInterval(tick, 1000);
  };

  up = function() {
    if (retryIntv != null) {
      clearInterval(retryIntv);
    }
    return reset();
  };

  nope = function() {
    if (!Offline.getOption('reconnect')) {
      return;
    }
    if (rc.state === 'connecting') {
      Offline.trigger('reconnect:failure');
      rc.state = 'waiting';
      return next();
    }
  };

  rc.tryNow = tryNow;

  reset();

  Offline.on('down', down);

  Offline.on('confirmed-down', nope);

  Offline.on('up', up);

}).call(this);


================================================
FILE: js/requests.js
================================================
(function() {
  var clear, flush, held, holdRequest, makeRequest, waitingOnConfirm;

  if (!window.Offline) {
    throw new Error("Requests module brought in without offline.js");
  }

  held = [];

  waitingOnConfirm = false;

  holdRequest = function(req) {
    if (Offline.getOption('requests') === false) {
      return;
    }
    Offline.trigger('requests:capture');
    if (Offline.state !== 'down') {
      waitingOnConfirm = true;
    }
    return held.push(req);
  };

  makeRequest = function(arg) {
    var body, name, password, ref, type, url, user, val, xhr;
    xhr = arg.xhr, url = arg.url, type = arg.type, user = arg.user, password = arg.password, body = arg.body;
    if (Offline.getOption('requests') === false) {
      return;
    }
    xhr.abort();
    xhr.open(type, url, true, user, password);
    ref = xhr.headers;
    for (name in ref) {
      val = ref[name];
      xhr.setRequestHeader(name, val);
    }
    if (xhr.mimeType) {
      xhr.overrideMimeType(xhr.mimeType);
    }
    return xhr.send(body);
  };

  clear = function() {
    return held = [];
  };

  flush = function() {
    var body, i, key, len, request, requests, url;
    if (Offline.getOption('requests') === false) {
      return;
    }
    Offline.trigger('requests:flush');
    requests = {};
    for (i = 0, len = held.length; i < len; i++) {
      request = held[i];
      url = request.url.replace(/(\?|&)_=[0-9]+/, function(match, chr) {
        if (chr === '?') {
          return chr;
        } else {
          return '';
        }
      });
      if (Offline.getOption('deDupBody')) {
        body = request.body;
        if (body.toString() === '[object Object]') {
          body = JSON.stringify(body);
        } else {
          body = body.toString();
        }
        requests[(request.type.toUpperCase()) + " - " + url + " - " + body] = request;
      } else {
        requests[(request.type.toUpperCase()) + " - " + url] = request;
      }
    }
    for (key in requests) {
      request = requests[key];
      makeRequest(request);
    }
    return clear();
  };

  setTimeout(function() {
    if (Offline.getOption('requests') !== false) {
      Offline.on('confirmed-up', function() {
        if (waitingOnConfirm) {
          waitingOnConfirm = false;
          return clear();
        }
      });
      Offline.on('up', flush);
      Offline.on('down', function() {
        return waitingOnConfirm = false;
      });
      Offline.onXHR(function(request) {
        var _onreadystatechange, _send, async, hold, xhr;
        xhr = request.xhr, async = request.async;
        if (xhr.offline === false) {
          return;
        }
        hold = function() {
          return holdRequest(request);
        };
        _send = xhr.send;
        xhr.send = function(body) {
          request.body = body;
          return _send.apply(xhr, arguments);
        };
        if (!async) {
          return;
        }
        if (xhr.onprogress === null) {
          xhr.addEventListener('error', hold, false);
          return xhr.addEventListener('timeout', hold, false);
        } else {
          _onreadystatechange = xhr.onreadystatechange;
          return xhr.onreadystatechange = function() {
            if (xhr.readyState === 0) {
              hold();
            } else if (xhr.readyState === 4 && (xhr.status === 0 || xhr.status >= 12000)) {
              hold();
            }
            return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0;
          };
        }
      });
      return Offline.requests = {
        flush: flush,
        clear: clear
      };
    }
  }, 0);

}).call(this);


================================================
FILE: js/simulate.js
================================================
(function() {
  var base, e, i, len, ref, simulate, state;

  if (!Offline) {
    throw new Error("Offline simulate brought in without offline.js");
  }

  ref = ['up', 'down'];
  for (i = 0, len = ref.length; i < len; i++) {
    state = ref[i];
    try {
      simulate = document.querySelector("script[data-simulate='" + state + "']") || (typeof localStorage !== "undefined" && localStorage !== null ? localStorage.OFFLINE_SIMULATE : void 0) === state;
    } catch (_error) {
      e = _error;
      simulate = false;
    }
  }

  if (simulate) {
    if (Offline.options == null) {
      Offline.options = {};
    }
    if ((base = Offline.options).checks == null) {
      base.checks = {};
    }
    Offline.options.checks.active = state;
  }

}).call(this);


================================================
FILE: js/snake.js
================================================
(function() {
  var canvas, dot, fill, hide, keyHandler, move, randDot, render, score, show, snake, speed, stop;

  canvas = dot = score = speed = stop = snake = randDot = fill = null;

  render = function() {
    canvas = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
    canvas.setAttribute('style', 'width: 100%; height: 100%; margin: -8px; position: absolute; top: 0; left: 0; z-index: 1000');
    canvas.setAttribute('viewBox', '0 0 1000 1000');
    document.body.appendChild(canvas);
    dot = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
    dot.setAttribute('r', 20);
    (randDot = function() {
      dot.setAttribute('cx', (Math.random() * 960) | 0 + 20);
      return dot.setAttribute('cy', (Math.random() * 960) | 0 + 20);
    })();
    canvas.appendChild(dot);
    snake = {
      direction: 0,
      nodes: []
    };
    score = 0;
    speed = 10;
    stop = false;
    return move();
  };

  move = function() {
    var dotX, dotY, lastNode, lastX, lastY, nX, nY, node, old;
    if (stop) {
      return;
    }
    lastNode = snake.nodes[snake.nodes.length - 1];
    if (lastNode) {
      lastX = +lastNode.getAttribute('cx');
      lastY = +lastNode.getAttribute('cy');
    } else {
      lastX = 500;
      lastY = 500;
    }
    if (snake.nodes.length > score) {
      old = snake.nodes.shift();
      canvas.removeChild(old);
    }
    nX = lastX + Math.cos(snake.direction) * speed;
    nY = lastY + Math.sin(snake.direction) * speed;
    node = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
    node.setAttribute('r', 20);
    node.setAttribute('cx', nX);
    node.setAttribute('cy', nY);
    if (fill) {
      node.style.fill = fill;
    }
    dotX = +dot.getAttribute('cx');
    dotY = +dot.getAttribute('cy');
    if ((dotX - 20 < nX && nX < dotX + 20) && (dotY - 20 < nY && nY < dotY + 20)) {
      score++;
      speed++;
      randDot();
    }
    canvas.appendChild(node);
    snake.nodes.push(node);
    return requestAnimationFrame(move);
  };

  keyHandler = function(e) {
    var ref;
    if ((37 <= (ref = e.keyCode) && ref <= 40)) {
      snake.direction = Math.PI / 2 * ((e.keyCode - 35) % 4);
      return false;
    }
  };

  show = function() {
    document.addEventListener('keydown', keyHandler);
    return render();
  };

  hide = function() {
    document.removeEventListener('keydown', keyHandler);
    stop = true;
    return document.removeChild(canvas);
  };

  setTimeout(function() {
    if (Offline.getOption('game') && (document.addEventListener != null)) {
      Offline.on('down', show);
      Offline.on('up', hide);
      return Offline.on('reconnect:failure', function() {
        fill = '#ec8787';
        return setTimeout(function() {
          return fill = 'black';
        }, 2000);
      });
    }
  }, 0);

}).call(this);


================================================
FILE: js/ui.js
================================================
(function() {
  var RETRY_TEMPLATE, TEMPLATE, _onreadystatechange, addClass, content, createFromHTML, el, flashClass, flashTimeouts, init, removeClass, render, roundTime;

  if (!window.Offline) {
    throw new Error("Offline UI brought in without offline.js");
  }

  TEMPLATE = '<div class="offline-ui"><div class="offline-ui-content"></div></div>';

  RETRY_TEMPLATE = '<a href class="offline-ui-retry"></a>';

  createFromHTML = function(html) {
    var el;
    el = document.createElement('div');
    el.innerHTML = html;
    return el.children[0];
  };

  el = content = null;

  addClass = function(name) {
    removeClass(name);
    return el.className += " " + name;
  };

  removeClass = function(name) {
    return el.className = el.className.replace(new RegExp("(^| )" + (name.split(' ').join('|')) + "( |$)", 'gi'), ' ');
  };

  flashTimeouts = {};

  flashClass = function(name, time) {
    addClass(name);
    if (flashTimeouts[name] != null) {
      clearTimeout(flashTimeouts[name]);
    }
    return flashTimeouts[name] = setTimeout(function() {
      removeClass(name);
      return delete flashTimeouts[name];
    }, time * 1000);
  };

  roundTime = function(sec) {
    var mult, unit, units, val;
    units = {
      'day': 86400,
      'hour': 3600,
      'minute': 60,
      'second': 1
    };
    for (unit in units) {
      mult = units[unit];
      if (sec >= mult) {
        val = Math.floor(sec / mult);
        return [val, unit];
      }
    }
    return ['now', ''];
  };

  render = function() {
    var button, handler;
    el = createFromHTML(TEMPLATE);
    document.body.appendChild(el);
    if ((Offline.reconnect != null) && Offline.getOption('reconnect')) {
      el.appendChild(createFromHTML(RETRY_TEMPLATE));
      button = el.querySelector('.offline-ui-retry');
      handler = function(e) {
        e.preventDefault();
        return Offline.reconnect.tryNow();
      };
      if (button.addEventListener != null) {
        button.addEventListener('click', handler, false);
      } else {
        button.attachEvent('click', handler);
      }
    }
    addClass("offline-ui-" + Offline.state);
    return content = el.querySelector('.offline-ui-content');
  };

  init = function() {
    render();
    Offline.on('up', function() {
      removeClass('offline-ui-down');
      addClass('offline-ui-up');
      flashClass('offline-ui-up-2s', 2);
      return flashClass('offline-ui-up-5s', 5);
    });
    Offline.on('down', function() {
      removeClass('offline-ui-up');
      addClass('offline-ui-down');
      flashClass('offline-ui-down-2s', 2);
      return flashClass('offline-ui-down-5s', 5);
    });
    Offline.on('reconnect:connecting', function() {
      addClass('offline-ui-connecting');
      return removeClass('offline-ui-waiting');
    });
    Offline.on('reconnect:tick', function() {
      var ref, time, unit;
      addClass('offline-ui-waiting');
      removeClass('offline-ui-connecting');
      ref = roundTime(Offline.reconnect.remaining), time = ref[0], unit = ref[1];
      content.setAttribute('data-retry-in-value', time);
      return content.setAttribute('data-retry-in-unit', unit);
    });
    Offline.on('reconnect:stopped', function() {
      removeClass('offline-ui-connecting offline-ui-waiting');
      content.setAttribute('data-retry-in-value', null);
      return content.setAttribute('data-retry-in-unit', null);
    });
    Offline.on('reconnect:failure', function() {
      flashClass('offline-ui-reconnect-failed-2s', 2);
      return flashClass('offline-ui-reconnect-failed-5s', 5);
    });
    return Offline.on('reconnect:success', function() {
      flashClass('offline-ui-reconnect-succeeded-2s', 2);
      return flashClass('offline-ui-reconnect-succeeded-5s', 5);
    });
  };

  if (document.readyState === 'complete') {
    init();
  } else if (document.addEventListener != null) {
    document.addEventListener('DOMContentLoaded', init, false);
  } else {
    _onreadystatechange = document.onreadystatechange;
    document.onreadystatechange = function() {
      if (document.readyState === 'complete') {
        init();
      }
      return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0;
    };
  }

}).call(this);


================================================
FILE: offline.js
================================================
/*! offline-js 0.7.19 */
(function() {
  var Offline, checkXHR, defaultOptions, extendNative, grab, handlers, init;
  extendNative = function(to, from) {
    var key, results, val;
    results = [];
    for (key in from.prototype) try {
      val = from.prototype[key], null == to[key] && "function" != typeof val ? results.push(to[key] = val) :results.push(void 0);
    } catch (_error) {
      _error;
    }
    return results;
  }, Offline = {}, Offline.options = window.Offline ? window.Offline.options || {} :{}, 
  defaultOptions = {
    checks:{
      xhr:{
        url:function() {
          return "/favicon.ico?_=" + new Date().getTime();
        },
        timeout:5e3,
        type:"HEAD"
      },
      image:{
        url:function() {
          return "/favicon.ico?_=" + new Date().getTime();
        }
      },
      active:"xhr"
    },
    checkOnLoad:!1,
    interceptRequests:!0,
    reconnect:!0,
    deDupBody:!1
  }, grab = function(obj, key) {
    var cur, i, j, len, part, parts;
    for (cur = obj, parts = key.split("."), i = j = 0, len = parts.length; j < len && (part = parts[i], 
    "object" == typeof (cur = cur[part])); i = ++j) ;
    return i === parts.length - 1 ? cur :void 0;
  }, Offline.getOption = function(key) {
    var ref, val;
    return val = null != (ref = grab(Offline.options, key)) ? ref :grab(defaultOptions, key), 
    "function" == typeof val ? val() :val;
  }, "function" == typeof window.addEventListener && window.addEventListener("online", function() {
    return setTimeout(Offline.confirmUp, 100);
  }, !1), "function" == typeof window.addEventListener && window.addEventListener("offline", function() {
    return Offline.confirmDown();
  }, !1), Offline.state = "up", Offline.markUp = function() {
    if (Offline.trigger("confirmed-up"), "up" !== Offline.state) return Offline.state = "up", 
    Offline.trigger("up");
  }, Offline.markDown = function() {
    if (Offline.trigger("confirmed-down"), "down" !== Offline.state) return Offline.state = "down", 
    Offline.trigger("down");
  }, handlers = {}, Offline.on = function(event, handler, ctx) {
    var e, events, j, len, results;
    if (events = event.split(" "), events.length > 1) {
      for (results = [], j = 0, len = events.length; j < len; j++) e = events[j], results.push(Offline.on(e, handler, ctx));
      return results;
    }
    return null == handlers[event] && (handlers[event] = []), handlers[event].push([ ctx, handler ]);
  }, Offline.off = function(event, handler) {
    var _handler, i, ref, results;
    if (null != handlers[event]) {
      if (handler) {
        for (i = 0, results = []; i < handlers[event].length; ) ref = handlers[event][i], 
        ref[0], _handler = ref[1], _handler === handler ? results.push(handlers[event].splice(i, 1)) :results.push(i++);
        return results;
      }
      return handlers[event] = [];
    }
  }, Offline.trigger = function(event) {
    var ctx, handler, j, len, ref, ref1, results;
    if (null != handlers[event]) {
      for (ref = handlers[event].slice(0), results = [], j = 0, len = ref.length; j < len; j++) ref1 = ref[j], 
      ctx = ref1[0], handler = ref1[1], results.push(handler.call(ctx));
      return results;
    }
  }, checkXHR = function(xhr, onUp, onDown) {
    var _onerror, _onload, _onreadystatechange, _ontimeout, checkStatus;
    return checkStatus = function() {
      return xhr.status && xhr.status < 12e3 ? onUp() :onDown();
    }, null === xhr.onprogress ? (_onerror = xhr.onerror, xhr.onerror = function() {
      return onDown(), "function" == typeof _onerror ? _onerror.apply(null, arguments) :void 0;
    }, _ontimeout = xhr.ontimeout, xhr.ontimeout = function() {
      return onDown(), "function" == typeof _ontimeout ? _ontimeout.apply(null, arguments) :void 0;
    }, _onload = xhr.onload, xhr.onload = function() {
      return checkStatus(), "function" == typeof _onload ? _onload.apply(null, arguments) :void 0;
    }) :(_onreadystatechange = xhr.onreadystatechange, xhr.onreadystatechange = function() {
      return 4 === xhr.readyState ? checkStatus() :0 === xhr.readyState && onDown(), "function" == typeof _onreadystatechange ? _onreadystatechange.apply(null, arguments) :void 0;
    });
  }, Offline.checks = {}, Offline.checks.xhr = function() {
    var xhr;
    xhr = new XMLHttpRequest(), xhr.offline = !1, xhr.open(Offline.getOption("checks.xhr.type"), Offline.getOption("checks.xhr.url"), !0), 
    null != xhr.timeout && (xhr.timeout = Offline.getOption("checks.xhr.timeout")), 
    checkXHR(xhr, Offline.markUp, Offline.markDown);
    try {
      xhr.send();
    } catch (_error) {
      _error, Offline.markDown();
    }
    return xhr;
  }, Offline.checks.image = function() {
    var img;
    img = document.createElement("img"), img.onerror = Offline.markDown, img.onload = Offline.markUp, 
    img.src = Offline.getOption("checks.image.url");
  }, Offline.checks.down = Offline.markDown, Offline.checks.up = Offline.markUp, Offline.check = function() {
    return Offline.trigger("checking"), Offline.checks[Offline.getOption("checks.active")]();
  }, Offline.confirmUp = Offline.confirmDown = Offline.check, Offline.onXHR = function(cb) {
    var _XDomainRequest, _XMLHttpRequest, monitorXHR;
    if (monitorXHR = function(req, flags) {
      var _open;
      return _open = req.open, req.open = function(type, url, async, user, password) {
        return cb({
          type:type,
          url:url,
          async:async,
          flags:flags,
          user:user,
          password:password,
          xhr:req
        }), _open.apply(req, arguments);
      };
    }, _XMLHttpRequest = window.XMLHttpRequest, window.XMLHttpRequest = function(flags) {
      var _overrideMimeType, _setRequestHeader, req;
      return req = new _XMLHttpRequest(flags), monitorXHR(req, flags), _setRequestHeader = req.setRequestHeader, 
      req.headers = {}, req.setRequestHeader = function(name, value) {
        return req.headers[name] = value, _setRequestHeader.call(req, name, value);
      }, _overrideMimeType = req.overrideMimeType, req.overrideMimeType = function(type) {
        return req.mimeType = type, _overrideMimeType.call(req, type);
      }, req;
    }, extendNative(window.XMLHttpRequest, _XMLHttpRequest), null != window.XDomainRequest) return _XDomainRequest = window.XDomainRequest, 
    window.XDomainRequest = function() {
      var req;
      return req = new _XDomainRequest(), monitorXHR(req), req;
    }, extendNative(window.XDomainRequest, _XDomainRequest);
  }, init = function() {
    if (Offline.getOption("interceptRequests") && Offline.onXHR(function(arg) {
      var xhr;
      if (xhr = arg.xhr, !1 !== xhr.offline) return checkXHR(xhr, Offline.markUp, Offline.confirmDown);
    }), Offline.getOption("checkOnLoad")) return Offline.check();
  }, setTimeout(init, 0), window.Offline = Offline;
}).call(this), function() {
  var down, next, nope, rc, reset, retryIntv, tick, tryNow, up;
  if (!window.Offline) throw new Error("Offline Reconnect brought in without offline.js");
  rc = Offline.reconnect = {}, retryIntv = null, reset = function() {
    var ref;
    return null != rc.state && "inactive" !== rc.state && Offline.trigger("reconnect:stopped"), 
    rc.state = "inactive", rc.remaining = rc.delay = null != (ref = Offline.getOption("reconnect.initialDelay")) ? ref :3;
  }, next = function() {
    var delay, ref;
    return delay = null != (ref = Offline.getOption("reconnect.delay")) ? ref :Math.min(Math.ceil(1.5 * rc.delay), 3600), 
    rc.remaining = rc.delay = delay;
  }, tick = function() {
    if ("connecting" !== rc.state) return rc.remaining -= 1, Offline.trigger("reconnect:tick"), 
    0 === rc.remaining ? tryNow() :void 0;
  }, tryNow = function() {
    if ("waiting" === rc.state) return Offline.trigger("reconnect:connecting"), rc.state = "connecting", 
    Offline.check();
  }, down = function() {
    if (Offline.getOption("reconnect")) return reset(), rc.state = "waiting", Offline.trigger("reconnect:started"), 
    retryIntv = setInterval(tick, 1e3);
  }, up = function() {
    return null != retryIntv && clearInterval(retryIntv), reset();
  }, nope = function() {
    if (Offline.getOption("reconnect")) return "connecting" === rc.state ? (Offline.trigger("reconnect:failure"), 
    rc.state = "waiting", next()) :void 0;
  }, rc.tryNow = tryNow, reset(), Offline.on("down", down), Offline.on("confirmed-down", nope), 
  Offline.on("up", up);
}.call(this), function() {
  var clear, flush, held, holdRequest, makeRequest, waitingOnConfirm;
  if (!window.Offline) throw new Error("Requests module brought in without offline.js");
  held = [], waitingOnConfirm = !1, holdRequest = function(req) {
    if (!1 !== Offline.getOption("requests")) return Offline.trigger("requests:capture"), 
    "down" !== Offline.state && (waitingOnConfirm = !0), held.push(req);
  }, makeRequest = function(arg) {
    var body, name, password, ref, type, url, user, val, xhr;
    if (xhr = arg.xhr, url = arg.url, type = arg.type, user = arg.user, password = arg.password, 
    body = arg.body, !1 !== Offline.getOption("requests")) {
      xhr.abort(), xhr.open(type, url, !0, user, password), ref = xhr.headers;
      for (name in ref) val = ref[name], xhr.setRequestHeader(name, val);
      return xhr.mimeType && xhr.overrideMimeType(xhr.mimeType), xhr.send(body);
    }
  }, clear = function() {
    return held = [];
  }, flush = function() {
    var body, i, key, len, request, requests, url;
    if (!1 !== Offline.getOption("requests")) {
      for (Offline.trigger("requests:flush"), requests = {}, i = 0, len = held.length; i < len; i++) request = held[i], 
      url = request.url.replace(/(\?|&)_=[0-9]+/, function(match, chr) {
        return "?" === chr ? chr :"";
      }), Offline.getOption("deDupBody") ? (body = request.body, body = "[object Object]" === body.toString() ? JSON.stringify(body) :body.toString(), 
      requests[request.type.toUpperCase() + " - " + url + " - " + body] = request) :requests[request.type.toUpperCase() + " - " + url] = request;
      for (key in requests) request = requests[key], makeRequest(request);
      return clear();
    }
  }, setTimeout(function() {
    if (!1 !== Offline.getOption("requests")) return Offline.on("confirmed-up", function() {
      if (waitingOnConfirm) return waitingOnConfirm = !1, clear();
    }), Offline.on("up", flush), Offline.on("down", function() {
      return waitingOnConfirm = !1;
    }), Offline.onXHR(function(request) {
      var _onreadystatechange, _send, async, hold, xhr;
      if (xhr = request.xhr, async = request.async, !1 !== xhr.offline && (hold = function() {
        return holdRequest(request);
      }, _send = xhr.send, xhr.send = function(body) {
        return request.body = body, _send.apply(xhr, arguments);
      }, async)) return null === xhr.onprogress ? (xhr.addEventListener("error", hold, !1), 
      xhr.addEventListener("timeout", hold, !1)) :(_onreadystatechange = xhr.onreadystatechange, 
      xhr.onreadystatechange = function() {
        return 0 === xhr.readyState ? hold() :4 === xhr.readyState && (0 === xhr.status || xhr.status >= 12e3) && hold(), 
        "function" == typeof _onreadystatechange ? _onreadystatechange.apply(null, arguments) :void 0;
      });
    }), Offline.requests = {
      flush:flush,
      clear:clear
    };
  }, 0);
}.call(this), function() {
  var base, i, len, ref, simulate, state;
  if (!Offline) throw new Error("Offline simulate brought in without offline.js");
  for (ref = [ "up", "down" ], i = 0, len = ref.length; i < len; i++) {
    state = ref[i];
    try {
      simulate = document.querySelector("script[data-simulate='" + state + "']") || ("undefined" != typeof localStorage && null !== localStorage ? localStorage.OFFLINE_SIMULATE :void 0) === state;
    } catch (_error) {
      _error, simulate = !1;
    }
  }
  simulate && (null == Offline.options && (Offline.options = {}), null == (base = Offline.options).checks && (base.checks = {}), 
  Offline.options.checks.active = state);
}.call(this), function() {
  var RETRY_TEMPLATE, TEMPLATE, _onreadystatechange, addClass, content, createFromHTML, el, flashClass, flashTimeouts, init, removeClass, render, roundTime;
  if (!window.Offline) throw new Error("Offline UI brought in without offline.js");
  TEMPLATE = '<div class="offline-ui"><div class="offline-ui-content"></div></div>', 
  RETRY_TEMPLATE = '<a href class="offline-ui-retry"></a>', createFromHTML = function(html) {
    var el;
    return el = document.createElement("div"), el.innerHTML = html, el.children[0];
  }, el = content = null, addClass = function(name) {
    return removeClass(name), el.className += " " + name;
  }, removeClass = function(name) {
    return el.className = el.className.replace(new RegExp("(^| )" + name.split(" ").join("|") + "( |$)", "gi"), " ");
  }, flashTimeouts = {}, flashClass = function(name, time) {
    return addClass(name), null != flashTimeouts[name] && clearTimeout(flashTimeouts[name]), 
    flashTimeouts[name] = setTimeout(function() {
      return removeClass(name), delete flashTimeouts[name];
    }, 1e3 * time);
  }, roundTime = function(sec) {
    var mult, unit, units, val;
    units = {
      day:86400,
      hour:3600,
      minute:60,
      second:1
    };
    for (unit in units) if (mult = units[unit], sec >= mult) return val = Math.floor(sec / mult), 
    [ val, unit ];
    return [ "now", "" ];
  }, render = function() {
    var button, handler;
    return el = createFromHTML(TEMPLATE), document.body.appendChild(el), null != Offline.reconnect && Offline.getOption("reconnect") && (el.appendChild(createFromHTML(RETRY_TEMPLATE)), 
    button = el.querySelector(".offline-ui-retry"), handler = function(e) {
      return e.preventDefault(), Offline.reconnect.tryNow();
    }, null != button.addEventListener ? button.addEventListener("click", handler, !1) :button.attachEvent("click", handler)), 
    addClass("offline-ui-" + Offline.state), content = el.querySelector(".offline-ui-content");
  }, init = function() {
    return render(), Offline.on("up", function() {
      return removeClass("offline-ui-down"), addClass("offline-ui-up"), flashClass("offline-ui-up-2s", 2), 
      flashClass("offline-ui-up-5s", 5);
    }), Offline.on("down", function() {
      return removeClass("offline-ui-up"), addClass("offline-ui-down"), flashClass("offline-ui-down-2s", 2), 
      flashClass("offline-ui-down-5s", 5);
    }), Offline.on("reconnect:connecting", function() {
      return addClass("offline-ui-connecting"), removeClass("offline-ui-waiting");
    }), Offline.on("reconnect:tick", function() {
      var ref, time, unit;
      return addClass("offline-ui-waiting"), removeClass("offline-ui-connecting"), ref = roundTime(Offline.reconnect.remaining), 
      time = ref[0], unit = ref[1], content.setAttribute("data-retry-in-value", time), 
      content.setAttribute("data-retry-in-unit", unit);
    }), Offline.on("reconnect:stopped", function() {
      return removeClass("offline-ui-connecting offline-ui-waiting"), content.setAttribute("data-retry-in-value", null), 
      content.setAttribute("data-retry-in-unit", null);
    }), Offline.on("reconnect:failure", function() {
      return flashClass("offline-ui-reconnect-failed-2s", 2), flashClass("offline-ui-reconnect-failed-5s", 5);
    }), Offline.on("reconnect:success", function() {
      return flashClass("offline-ui-reconnect-succeeded-2s", 2), flashClass("offline-ui-reconnect-succeeded-5s", 5);
    });
  }, "complete" === document.readyState ? init() :null != document.addEventListener ? document.addEventListener("DOMContentLoaded", init, !1) :(_onreadystatechange = document.onreadystatechange, 
  document.onreadystatechange = function() {
    return "complete" === document.readyState && init(), "function" == typeof _onreadystatechange ? _onreadystatechange.apply(null, arguments) :void 0;
  });
}.call(this);

================================================
FILE: package.json
================================================
{
  "name": "offline-js",
  "version": "0.7.19",
  "description": "Automatically detect when a browser is offline",
  "authors": [
    "Adam Schwartz <adam.flynn.schwartz@gmail.com>",
    "Zack Bloom <zackbloom@gmail.com>"
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/HubSpot/offline.git"
  },
  "main": "offline.js",
  "license": "MIT",
  "devDependencies": {
    "coffee-script": "^1.9.3",
    "color": "^0.9.0",
    "grunt": "^0.4.1",
    "grunt-cli": "^0.1.9",
    "grunt-contrib-coffee": "^0.13.0",
    "grunt-contrib-compass": "^1.0.3",
    "grunt-contrib-uglify": "^0.9.1",
    "grunt-contrib-watch": "^0.6.1"
  },
  "scripts": {
    "build": "grunt"
  }
}


================================================
FILE: sass/_arabic.sass
================================================
@charset "utf-8"
$upComputer: "الحاسوب متصل بالإنترنت."
$upDevice: "جهازك متصل بالإنترنت"
$upDeviceSmall: ".جهازك متصل"


$downComputer: ".الحاسوب فقد الاتصال بالإنترنت"
$downDevice: ".جهازك فقد الاتصال بالإنترنت"
$downDeviceSmall: ".جهازك غير متصل"

$connecting: "...محاولة إعادة الاتصال"

$retryButton: " إعادة الاتصال"

$reconnectFailed: ".فشلت محاولة الاتصال"

$retryingSecondBeforeValueSingularComputer: " الاتصال فقد إعادة الاتصال في"
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: " إعادة الاتصال في"
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " ...ثانية"
$retryingSecondAfterValuePluralComputer: " ...ثواني"

$retryingSecondAfterValueSingularDeviceSmall: "...ث"
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " ...دقيقة"
$retryingMinuteAfterValuePluralComputer: " ...دقائق"

$retryingMinuteAfterValueSingularDeviceSmall: "...د"
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " ...ساعه"
$retryingHourAfterValuePluralComputer: " ...ساعات"

$retryingHourAfterValueSingularDeviceSmall: "...س"
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_chinese-simplified.sass
================================================
@charset "utf-8"

$upComputer: "您的电脑已经连接到网络。"
$upDevice: "您的设备已经连接到网络。"
$upDeviceSmall: "您的设备已经连接到网络。"

$downComputer: "您的电脑失去了网络连接。"
$downDevice: "您的设备失去了网络连接。"
$downDeviceSmall: "您的设备失去了网络连接。"

$connecting: "正在尝试重连..."

$retryButton: "重连"

$reconnectFailed: "尝试连接网络失败。"

$retryingSecondBeforeValueSingularComputer: "失去网络连接。 即将重连:"
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "即将重连:"
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: "秒..."
$retryingSecondAfterValuePluralComputer: "秒..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: "分钟..."
$retryingMinuteAfterValuePluralComputer: "分钟..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: "小时..."
$retryingHourAfterValuePluralComputer: "小时..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_chinese-traditional.sass
================================================
@charset "utf-8"

$upComputer: "您的電腦已經連接到網絡。"
$upDevice: "您的設備已經連接到網絡。"
$upDeviceSmall: "您的設備已經連接到網絡。"

$downComputer: "您的電腦失去了網絡連接。"
$downDevice: "您的設備失去了網絡連接。"
$downDeviceSmall: "您的設備失去了網絡連接。"

$connecting: "正在嘗試重連..."

$retryButton: "重連"

$reconnectFailed: "嘗試連接網絡失敗。"

$retryingSecondBeforeValueSingularComputer: "失去網絡連接。即將重連:"
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "即將重連:"
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: "秒..."
$retryingSecondAfterValuePluralComputer: "秒..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: "分鐘..."
$retryingMinuteAfterValuePluralComputer: "分鐘..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: "小時..."
$retryingHourAfterValuePluralComputer: "小時..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_content.sass
================================================
=offline-content
    .offline-ui

        .offline-ui-retry

            &:before
                content: $retryButton

        &.offline-ui-up

            .offline-ui-content:before
                content: $upComputer

                @media (max-width: 1024px)
                    content: $upDevice

                @media (max-width: 568px)
                    content: $upDeviceSmall

        &.offline-ui-down

            .offline-ui-content:before
                content: $downComputer

                @media (max-width: 1024px)
                    content: $downDevice

                @media (max-width: 568px)
                    content: $downDeviceSmall

            &.offline-ui-connecting, &.offline-ui-connecting-2s

                .offline-ui-content:before
                    content: $connecting

            &.offline-ui-waiting

                .offline-ui-content

                    &[data-retry-in-unit="second"]

                        &:before
                            content: $retryingSecondBeforeValuePluralComputer attr(data-retry-in-value) $retryingSecondAfterValuePluralComputer

                            @media (max-width: 568px)
                                content: $retryingSecondBeforeValuePluralDeviceSmall attr(data-retry-in-value) $retryingSecondAfterValuePluralDeviceSmall

                        &[data-retry-in-value="1"]

                            &:before
                                content: $retryingSecondBeforeValueSingularComputer attr(data-retry-in-value) $retryingSecondAfterValueSingularComputer

                                @media (max-width: 568px)
                                    content: $retryingSecondBeforeValueSingularDeviceSmall attr(data-retry-in-value) $retryingSecondAfterValueSingularDeviceSmall

                    &[data-retry-in-unit="minute"]

                        &:before
                            content: $retryingMinuteBeforeValuePluralComputer attr(data-retry-in-value) $retryingMinuteAfterValuePluralComputer

                            @media (max-width: 568px)
                                content: $retryingMinuteBeforeValuePluralDeviceSmall attr(data-retry-in-value) $retryingMinuteAfterValuePluralDeviceSmall

                        &[data-retry-in-value="1"]

                            &:before
                                content: $retryingMinuteBeforeValueSingularComputer attr(data-retry-in-value) $retryingMinuteAfterValueSingularComputer

                                @media (max-width: 568px)
                                    content: $retryingMinuteBeforeValueSingularDeviceSmall attr(data-retry-in-value) $retryingMinuteAfterValueSingularDeviceSmall

                    &[data-retry-in-unit="hour"]

                        &:before
                            content: $retryingHourBeforeValuePluralComputer attr(data-retry-in-value) $retryingHourAfterValuePluralComputer

                            @media (max-width: 568px)
                                content: $retryingHourBeforeValuePluralDeviceSmall attr(data-retry-in-value) $retryingHourAfterValuePluralDeviceSmall

                        &[data-retry-in-value="1"]

                            &:before
                                content: $retryingHourBeforeValueSingularComputer attr(data-retry-in-value) $retryingHourAfterValueSingularComputer

                                @media (max-width: 568px)
                                    content: $retryingHourBeforeValueSingularDeviceSmall attr(data-retry-in-value) $retryingHourAfterValueSingularDeviceSmall

            &.offline-ui-reconnect-failed-2s

                &.offline-ui-waiting .offline-ui-retry
                    display: none

                .offline-ui-content:before
                    content: $reconnectFailed

================================================
FILE: sass/_czech.sass
================================================
@charset "utf-8"

$upComputer: "Váš počítač je připojen k internetu."
$upDevice: "Vaše zařízení je připojeno k internetu."
$upDeviceSmall: "Vaše zařízení je připojeno."

$downComputer: "Váš počítač ztratil připojení k internetu."
$downDevice: "Vaše zařízení ztratilo připojení k internetu."
$downDeviceSmall: "Vaše zařízení není připojeno."

$connecting: "Zkouším se znovu připojit..."

$retryButton: "Znovu připojit"

$reconnectFailed: "Pokus o připojení selhal."

$retryingSecondBeforeValueSingularComputer: "Připojení ztraceno. Znovu zkusím za "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "Znovu zkusím za "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " sekundu..."
$retryingSecondAfterValuePluralComputer: " sekund..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " minutu..."
$retryingMinuteAfterValuePluralComputer: " minut..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " hodinu..."
$retryingHourAfterValuePluralComputer: " hodin..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_dutch.sass
================================================
@charset "utf-8"

$upComputer: "Computer verbonden met internet."
$upDevice: "Apparaat verbonden met internet."
$upDeviceSmall: "Apparaat verbonden met internet."

$downComputer: "Computer niet verbonden met internet."
$downDevice: "Apparaat niet verbonden met internet."
$downDeviceSmall: "Apparaat niet verbonden met internet."

$connecting: "Opnieuw proberen..."

$retryButton: "Opnieuw"

$reconnectFailed: "Poging mislukt."

$retryingSecondBeforeValueSingularComputer: "Internetverbinding kwijt. Opnieuw proberen over "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "Opnieuw proberen over "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " seconde..."
$retryingSecondAfterValuePluralComputer: " seconden..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " minuut..."
$retryingMinuteAfterValuePluralComputer: " minuten..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " uur..."
$retryingHourAfterValuePluralComputer: " uren..."

$retryingHourAfterValueSingularDeviceSmall: "u..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_english.sass
================================================
@charset "utf-8"
$upComputer: "Your computer is connected to the internet."
$upDevice: "Your device is connected to the internet."
$upDeviceSmall: "Your device is connected."

$downComputer: "Your computer lost its internet connection."
$downDevice: "Your device lost its internet connection."
$downDeviceSmall: "Your device isn't connected."

$connecting: "Attempting to reconnect..."

$retryButton: "Reconnect"

$reconnectFailed: "Connection attempt failed."

$retryingSecondBeforeValueSingularComputer: "Connection lost. Reconnecting in "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "Reconnecting in "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " second..."
$retryingSecondAfterValuePluralComputer: " seconds..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " minute..."
$retryingMinuteAfterValuePluralComputer: " minutes..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " hour..."
$retryingHourAfterValuePluralComputer: " hours..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_french.sass
================================================
@charset "utf-8"
$upComputer: "Votre ordinateur est connecté à Internet."
$upDevice: "Votre appareil est connecté à Internet."
$upDeviceSmall: "Votre appareil est connecté."

$downComputer: "Votre ordinateur a perdu sa connexion Internet."
$downDevice: "Votre appareil a perdu sa connexion Internet."
$downDeviceSmall: "Votre appareil n'est pas branché."

$connecting: "Tentative de reconnexion..."

$retryButton: "Reconnecter"

$reconnectFailed: "La tentative de connexion a échoué."

$retryingSecondBeforeValueSingularComputer: "Connexion perdue. Reconnexion dans "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "Reconnexion dans "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " seconde..."
$retryingSecondAfterValuePluralComputer: " secondes..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " minute..."
$retryingMinuteAfterValuePluralComputer: " minutes..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " heure..."
$retryingHourAfterValuePluralComputer: " heures..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_german.sass
================================================
@charset "utf-8"
$upComputer: "Dein Computer ist mit dem Internet verbunden."
$upDevice: "Deing Gerät ist mit dem Internet verbunden."
$upDeviceSmall: "Dein Gerät ist online."

$downComputer: "Dein Computer wurde vom Internet getrennt."
$downDevice: "Dein Gerät wurde vom Internet getrennt."
$downDeviceSmall: "Keine Internetverbindung."

$connecting: "Versuche Verbindung wiederherzustellen..."

$retryButton: "Verbinden"

$reconnectFailed: "Verbindung Fehlgeschlagen."

$retryingSecondBeforeValueSingularComputer: "Keine Verbindung. Verbinde nochmal in "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "Verbinde in "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " Sekunde..."
$retryingSecondAfterValuePluralComputer: " Sekunden..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " Minute..."
$retryingMinuteAfterValuePluralComputer: " Minuten..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " Stunde..."
$retryingHourAfterValuePluralComputer: " Stunden..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_italian.sass
================================================
@charset "utf-8"
$upComputer: "Il tuo computer è connesso ad internet."
$upDevice: "Il tuo device è connesso ad internet."
$upDeviceSmall: "Il tuo device è connesso."

$downComputer: "Il tuo computer si è disconnesso da internet."
$downDevice: "Il tuo device si è disconnesso da internet."
$downDeviceSmall: "Il tuo device si è disconnesso."

$connecting: "Connessione in corso..."

$retryButton: "Riconnetti"

$reconnectFailed: "Tentativo di connessione fallito."

$retryingSecondBeforeValueSingularComputer: "Connessione persa. Riconnessione tra "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "Riconnessione tra "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " secondo..."
$retryingSecondAfterValuePluralComputer: " secondi..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " minuto..."
$retryingMinuteAfterValuePluralComputer: " minuti..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " ora..."
$retryingHourAfterValuePluralComputer: " ore..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_keyframes.sass
================================================
@import compass/css3
@import mixins

=keyframes-offline-fadein
    +offline-keyframes("offline-fadein")
        0%
            opacity: 0
        100%
            opacity: 1

=keyframes-offline-fadeout
    +offline-keyframes("offline-fadeout")
        0%
            opacity: 1
        100%
            opacity: 0

=keyframes-offline-fadeout-and-hide
    +offline-keyframes("offline-fadeout-and-hide")
        0%
            opacity: 1
            display: block
        99%
            opacity: 0
            display: block
        100%
            opacity: 0
            display: none

=keyframes-offline-dropin
    +offline-keyframes("offline-dropin")
        // We start at 0 first and, while hidden
        // move to -800px, where the animation
        // really begins. This was necessary because
        // otherwise, when starting the animation
        // at -800px, the browser scrolls up 800px
        // to try to display this object positioned
        // above the page.
        // https://github.com/HubSpot/vex/issues/21
        0%
            +offline-transform(translateY(0))
            opacity: 0
        1%
            +offline-transform(translateY(-800px))
            opacity: 0

        // Real animation begins here
        2%
            +offline-transform(translateY(-800px))
            opacity: 1
        100%
            +offline-transform(translateY(0))
            opacity: 1

=keyframes-offline-dropout
    +offline-keyframes("offline-dropout")
        0%
            +offline-transform(translateY(0))
        100%
            +offline-transform(translateY(-800px))

=keyframes-offline-rotation
    +offline-keyframes("offline-rotation")
        0%
            +offline-transform(rotate(0deg))
        100%
            +offline-transform(rotate(359deg))

================================================
FILE: sass/_mixins.sass
================================================
=offline-keyframes($name)
    @-webkit-keyframes #{$name}
        @content
    @-moz-keyframes #{$name}
        @content
    @-ms-keyframes #{$name}
        @content
    @-o-keyframes #{$name}
        @content
    @keyframes #{$name}
        @content

=offline-animation($animation)
    -webkit-animation: $animation
    -moz-animation: $animation
    -ms-animation: $animation
    -o-animation: $animation
    animation: $animation
    -webkit-backface-visibility: hidden

=offline-transform($transform)
    transform: $transform
    -webkit-transform: $transform
    -moz-transform: $transform
    -ms-transform: $transform
    -o-transform: $transform

=offline-preserve-3d
    -webkit-transform-style: preserve-3d
    -moz-transform-style: preserve-3d
    transform-style: preserve-3d

================================================
FILE: sass/_offline-theme-base-indicator.sass
================================================
@import compass/css3

.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:after, .offline-ui *:before, .offline-ui *:after
    +box-sizing(border-box)

.offline-ui
    display: none
    position: fixed
    background: #fff
    z-index: 2000
    display: inline-block

    .offline-ui-retry
        display: none

    &.offline-ui-up
        display: block

    &.offline-ui-down
        display: block

================================================
FILE: sass/_offline-theme-base.sass
================================================
@import compass/css3
@import compass/css3/user-interface

.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:after, .offline-ui *:before, .offline-ui *:after
    +box-sizing(border-box)

.offline-ui
    display: none
    position: fixed
    background: #fff
    z-index: 2000
    margin: auto
    top: 0
    left: 0
    right: 0

    .offline-ui-content:before
        display: inline

    .offline-ui-retry
        +user-select(none)
        display: none

        &:before
            display: inline

    &.offline-ui-up

        &.offline-ui-up-5s
            display: block

    &.offline-ui-down
        display: block

        &.offline-ui-waiting

            .offline-ui-retry
                display: block

        &.offline-ui-reconnect-failed-2s

            &.offline-ui-waiting .offline-ui-retry
                display: none


================================================
FILE: sass/_pashto.sass
================================================
@charset "utf-8"
$upComputer: "ستاسو د کمپيوټر له انټرنيټ سره وصل دی."
$upDevice: "ستاسو وسيله چې د انټرنټ سره نښلي."
$upDeviceSmall: "ستاسو آله سره نښلي."

$downComputer: "ستاسو د کمپيوټر د خپل د انټرنېټ پیوستون له لاسه ورکړ."
$downDevice: "ستاسو آله خپل د انټرنېټ پیوستون له لاسه ورکړ."
$downDeviceSmall: "ستاسو آله نه نښلي."

$connecting: "هڅه کوي تر څو یو ځل بیا سره نښلوي"

$retryButton: "بيا ونښلوي"

$reconnectFailed: "پیوستون هڅه ناکامه شوه."

$retryingSecondBeforeValueSingularComputer: "پیوستون له لاسه ورکړ. بيا په سره نښلوي"
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "بيا په سره نښلوي"
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: "دوهم..."
$retryingSecondAfterValuePluralComputer: "ثانيو ..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: "دقیقه ..."
$retryingMinuteAfterValuePluralComputer: "دقیقو ..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: "ساعت ..."
$retryingHourAfterValuePluralComputer: "ساعتونو کې ..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_persian.sass
================================================
@charset "utf-8"
$upComputer: "ارتباط کامپیوتر شما با اینترنت برقرار است."
$upDevice: "ارتباط دستگاه شما با اینترنت برقرار است."
$upDeviceSmall: "دستگاه شما متصل است."

$downComputer: "ازتباط کامپیوتر شما با اینترنت قطع شده است."
$downDevice: "ارتباط دستگاه شما با اینترنت قطع شده است."
$downDeviceSmall: "دستگاه شما متصل نیست."

$connecting: "تلاش برای اتصال مجدد..."

$retryButton: "اتصال مجدد"

$reconnectFailed: "تلاش برای اتصال مجدد بی نتیجه بود."

$retryingSecondBeforeValueSingularComputer: "اتصال قطع شد. اتصال مجدد در "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "اتصال مجدد در "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " ثانیه..."
$retryingSecondAfterValuePluralComputer: " ثانیه..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " دقیقه..."
$retryingMinuteAfterValuePluralComputer: " دقیقه..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " ساعت..."
$retryingHourAfterValuePluralComputer: " ساعت..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_polish.sass
================================================
@charset "utf-8"
$upComputer: "Twój komputer jest podłączony do internetu."
$upDevice: "Twoje urządzenie jest podłączone do internetu."
$upDeviceSmall: "Twoje urządzenie jest podłączone."

$downComputer: "Twój komputer stracił połączenie z internetem."
$downDevice: "Twoje urządzenie straciło połączenie z internetem."
$downDeviceSmall: "Twoje urządzenie nie jest podłączone."

$connecting: "Próbuję połączyć..."

$retryButton: "Połącz teraz"

$reconnectFailed: "Nieudana próba podłączenia."

$retryingSecondBeforeValueSingularComputer: "Połączenie utracone. Ponawiam za "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "Ponawiam za "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " sekundę..."
$retryingSecondAfterValuePluralComputer: " sekund..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " minutę..."
$retryingMinuteAfterValuePluralComputer: " minut..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " godzinę..."
$retryingHourAfterValuePluralComputer: " godzin..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_portuguese-brazil.sass
================================================
@charset "utf-8"
$upComputer: "Seu computador está conectado à internet."
$upDevice: "O dispositivo está conectado à internet."
$upDeviceSmall: "O dispositivo está conectado."

$downComputer: "O computador perdeu sua conexão com a internet."
$downDevice: "O dispositivo perdeu sua conexão com a internet."
$downDeviceSmall: "Seu dispositivo não está conectado."

$connecting: "Tentando reconectar..."

$retryButton: "Reconectar"

$reconnectFailed: "Tentativa de conexão falhou."

$retryingSecondBeforeValueSingularComputer: "Conexão perdida. Reconectando em "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "Reconectando em "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " segundo..."
$retryingSecondAfterValuePluralComputer: " segundos..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " minuto..."
$retryingMinuteAfterValuePluralComputer: " minutos..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " hora..."
$retryingHourAfterValuePluralComputer: " horas..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_spanish.sass
================================================
@charset "utf-8"
$upComputer: "Tu computador está conectado a internet."
$upDevice: "Tu dispositivo está conectado a internet."
$upDeviceSmall: "Tu dispositivo está conectado."

$downComputer: "Tu computador perdió su conexión a internet."
$downDevice: "Tu dispositivo perdió su conexión a internet."
$downDeviceSmall: "Tu dispositivo no está conectado."

$connecting: "Intentando reconectar..."

$retryButton: "Reconectar"

$reconnectFailed: "Intento fallido."

$retryingSecondBeforeValueSingularComputer: "Conexión perdida. Reconectando en "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: "Reconectando en "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " segundo..."
$retryingSecondAfterValuePluralComputer: " segundos..."

$retryingSecondAfterValueSingularDeviceSmall: "s..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " minuto..."
$retryingMinuteAfterValuePluralComputer: " minutos..."

$retryingMinuteAfterValueSingularDeviceSmall: "m..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " hora..."
$retryingHourAfterValuePluralComputer: " horas..."

$retryingHourAfterValueSingularDeviceSmall: "h..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/_turkish.sass
================================================
@charset "utf-8"
$upComputer: "Bilgisayarınız internete bağlı."
$upDevice: "Cihazınız internete bağlı."
$upDeviceSmall: "Cihazınız bağlı."

$downComputer: "Bilgisayarınız internet bağlantısı kesildi."
$downDevice: "Cihazınızın internet bağlantısı kesildi."
$downDeviceSmall: "Cihazınız internete bağlı değil."

$connecting: "Yeniden bağlanmaya çalışıyor..."

$retryButton: "Yeniden bağlan"

$reconnectFailed: "Bağlantı denemesi başarısız oldu."

$retryingSecondBeforeValueSingularComputer: "Bağlantı kesildi. "
$retryingSecondBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingMinuteBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingMinuteBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingHourBeforeValueSingularComputer: $retryingSecondBeforeValueSingularComputer
$retryingHourBeforeValuePluralComputer: $retryingSecondBeforeValueSingularComputer

$retryingSecondBeforeValueSingularDeviceSmall: " "
$retryingSecondBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingMinuteBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingMinuteBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingHourBeforeValueSingularDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall
$retryingHourBeforeValuePluralDeviceSmall: $retryingSecondBeforeValueSingularDeviceSmall

$retryingSecondAfterValueSingularComputer: " saniye içinde tekrar bağlanmayı deneyecek..."
$retryingSecondAfterValuePluralComputer: " saniye içinde tekrar bağlanmayı deneyecek..."

$retryingSecondAfterValueSingularDeviceSmall: "saniye içinde tekrar bağlanmayı deneyecek..."
$retryingSecondAfterValuePluralDeviceSmall: $retryingSecondAfterValueSingularDeviceSmall

$retryingMinuteAfterValueSingularComputer: " dakika içersinde tekrar bağlanmayı deneyecek..."
$retryingMinuteAfterValuePluralComputer: " dakika içersinde tekrar bağlanmayı deneyecek..."

$retryingMinuteAfterValueSingularDeviceSmall: "dakika içersinde tekrar bağlanmayı deneyecek..."
$retryingMinuteAfterValuePluralDeviceSmall: $retryingMinuteAfterValueSingularDeviceSmall

$retryingHourAfterValueSingularComputer: " saat içersinde tekrar bağlanmayı deneyecek..."
$retryingHourAfterValuePluralComputer: " saat içersinde tekrar bağlanmayı deneyecek..."

$retryingHourAfterValueSingularDeviceSmall: "saat içersinde tekrar bağlanmayı deneyecek..."
$retryingHourAfterValuePluralDeviceSmall: $retryingHourAfterValueSingularDeviceSmall


================================================
FILE: sass/offline-language-arabic-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "متصل."

    &.offline-ui-down

        .offline-ui-content:before
            content: "غير متصل."

================================================
FILE: sass/offline-language-arabic.sass
================================================
@import content
@import arabic

+offline-content

================================================
FILE: sass/offline-language-chinese-simplified-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "在线"

    &.offline-ui-down

        .offline-ui-content:before
            content: "离线"


================================================
FILE: sass/offline-language-chinese-simplified.sass
================================================
@import content
@import chinese-simplified

+offline-content


================================================
FILE: sass/offline-language-chinese-traditional-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "在線"

    &.offline-ui-down

        .offline-ui-content:before
            content: "離線"


================================================
FILE: sass/offline-language-chinese-traditional.sass
================================================
@import content
@import chinese-traditional

+offline-content


================================================
FILE: sass/offline-language-czech-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "Online"

    &.offline-ui-down

        .offline-ui-content:before
            content: "Offline"


================================================
FILE: sass/offline-language-czech.sass
================================================
@import content
@import czech

+offline-content


================================================
FILE: sass/offline-language-dutch-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "Online"

    &.offline-ui-down

        .offline-ui-content:before
            content: "Offline"


================================================
FILE: sass/offline-language-dutch.sass
================================================
@import content
@import dutch

+offline-content


================================================
FILE: sass/offline-language-english-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "Online"

    &.offline-ui-down

        .offline-ui-content:before
            content: "Offline"

================================================
FILE: sass/offline-language-english.sass
================================================
@import content
@import english

+offline-content

================================================
FILE: sass/offline-language-french-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "Connecté"

    &.offline-ui-down

        .offline-ui-content:before
            content: "Pas connecté"

================================================
FILE: sass/offline-language-french.sass
================================================
@import content
@import french

+offline-content

================================================
FILE: sass/offline-language-german-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "Online"

    &.offline-ui-down

        .offline-ui-content:before
            content: "Offline"

================================================
FILE: sass/offline-language-german.sass
================================================
@import content
@import german


+offline-content

================================================
FILE: sass/offline-language-italian-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "Online"

    &.offline-ui-down

        .offline-ui-content:before
            content: "Offline"

================================================
FILE: sass/offline-language-italian.sass
================================================
@import content
@import italian

+offline-content


================================================
FILE: sass/offline-language-pashto-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "Online"

    &.offline-ui-down

        .offline-ui-content:before
            content: "Offline"

================================================
FILE: sass/offline-language-pashto.sass
================================================
@import content
@import pashto

+offline-content


================================================
FILE: sass/offline-language-polish-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "Połączony"

    &.offline-ui-down

        .offline-ui-content:before
            content: "Rozłączony"


================================================
FILE: sass/offline-language-polish.sass
================================================
@import content
@import polish

+offline-content


================================================
FILE: sass/offline-language-portuguese-brazil-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "Conectado"

    &.offline-ui-down

        .offline-ui-content:before
            content: "Desconectado"


================================================
FILE: sass/offline-language-portuguese-brazil.sass
================================================
@import content
@import portuguese-brazil

+offline-content


================================================
FILE: sass/offline-language-simplified-chinese-indicator.sass
================================================
@charset "utf-8"
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "在线"

    &.offline-ui-down

        .offline-ui-content:before
            content: "离线"

================================================
FILE: sass/offline-language-spanish-indicator.sass
================================================
.offline-ui
    &.offline-ui-up
        .offline-ui-content:before
            content: "En línea"
    &.offline-ui-down
        .offline-ui-content:before
            content: "Fuera de línea"


================================================
FILE: sass/offline-language-spanish.sass
================================================
@import content
@import spanish

+offline-content


================================================
FILE: sass/offline-language-turkish-indicator.sass
================================================
.offline-ui

    &.offline-ui-up

        .offline-ui-content:before
            content: "Çevrimiçi"

    &.offline-ui-down

        .offline-ui-content:before
            content: "Çevrimdışı"


================================================
FILE: sass/offline-language-turkish.sass
================================================
@import content
@import turkish

+offline-content


================================================
FILE: sass/offline-theme-chrome-indicator.sass
================================================
@import compass/css3

@import offline-theme-base-indicator

$green: #80d580
$red: #ec8787

.offline-ui
    +box-shadow(0 0 0 1px rgba(0, 0, 0, .15))
    +border-radius(4px 4px 0 0)
    font-family: "Lucida Grande", sans-serif
    font-size: 12px
    padding: 7px
    background: #f6f6f6
    color: #888
    bottom: 0
    left: 20px

    .offline-ui-content
        padding-left: 16px

        &:after
            +border-radius(50%)
            content: " "
            display: block
            position: absolute
            top: 0
            bottom: 1px
            left: 8px
            margin: auto
            height: 9px
            width: 9px

    &.offline-ui-up

        .offline-ui-content:after
            background: $green

    &.offline-ui-down

        .offline-ui-content:after
            background: $red

================================================
FILE: sass/offline-theme-chrome.sass
================================================
@import compass/css3

@import mixins
@import keyframes

@import offline-theme-base

$green: #80d580
$red: #ec8787

+keyframes-offline-dropin
+keyframes-offline-dropout

+keyframes-offline-rotation

.offline-ui
    +box-shadow(0 0 0 1px rgba(0, 0, 0, .15), 0 0 1em rgba(0, 0, 0, .3))
    font-family: "Lucida Grande", sans-serif
    font-size: 14px
    padding: 1em
    width: 38em
    max-width: 100%
    background: #f6f6f6
    color: #444
    overflow: hidden

    .offline-ui-content
        padding-left: 2em

        &:before
            line-height: 1.25em

        &:after
            +border-radius(50%)
            content: " "
            display: block
            position: absolute
            top: 0
            bottom: 0
            left: 1em
            margin: auto
            height: 1em
            width: 1em

    .offline-ui-retry
        +box-shadow(0 1px 0 rgba(0, 0, 0, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.75))
        +border-radius(2px)
        +background-image(linear-gradient(#ededed, #ededed 38%, #dedede))
        position: absolute
        right: 4em
        top: 1em
        bottom: 1em
        border: 1px solid rgba(0, 0, 0, 0.25)
        text-shadow: 0 1px 0 #f0f0f0
        padding: 0 1em
        line-height: 1.6em
        height: 1.7em
        margin: auto
        font-size: 12px
        text-decoration: none
        color: inherit

    &.offline-ui-up
        +offline-animation(offline-dropout forwards .5s 2s)

        .offline-ui-content:after
            background: $green

    &.offline-ui-down
        +offline-animation(offline-dropin .5s)

        .offline-ui-content:after
            background: $red

        &.offline-ui-connecting, &.offline-ui-waiting
            padding-right: 3em

            .offline-ui-content:after
                background: $red

            &:after
                +offline-animation(offline-rotation .7s linear infinite)
                +border-radius(50%)
                content: " "
                display: block
                position: absolute
                right: 1em
                top: 0
                bottom: 0
                margin: auto
                height: 1em
                width: 1em
                border: 2px solid rgba(0, 0, 0, 0)
                border-top-color: rgba(0, 0, 0, .5)
                border-left-color: rgba(0, 0, 0, .5)
                opacity: 0.7

        &.offline-ui-waiting
            padding-right: 11em

            &.offline-ui-reconnect-failed-2s
                padding-right: 0

================================================
FILE: sass/offline-theme-dark-indicator.sass
================================================
@import compass/css3

@import offline-theme-base-indicator

$green: #80d580
$red: #e24949

.offline-ui
    +box-shadow(0 0 0 1px rgba(0, 0, 0, .15))
    +border-radius(4px 4px 0 0)
    font-family: "Helvetica Neue", sans-serif
    font-weight: 300
    padding: 1em
    background: #000
    color: #ccc
    bottom: 0
    left: 20px

    .offline-ui-content
        padding-left: 1.5em

        &:after
            +border-radius(50%)
            content: " "
            display: block
            position: absolute
            top: 0
            bottom: 0
            left: 1em
            margin: auto
            height: .8em
            width: .8em

    &.offline-ui-up

        .offline-ui-content:after
            background: $green

    &.offline-ui-down

        .offline-ui-content:after
            background: $red


================================================
FILE: sass/offline-theme-dark.sass
================================================
@import compass/css3

@import mixins
@import keyframes

@import offline-theme-base

$green: #80d580
$red: #e24949

+keyframes-offline-dropin
+keyframes-offline-dropout

+keyframes-offline-rotation

.offline-ui
    +border-radius(0 0 4px 4px)
    font-family: "Helvetica Neue", sans-serif
    font-weight: 300
    padding: 1em
    width: 38em
    max-width: 100%
    background: #000
    color: #ccc
    overflow: hidden

    @media (max-width: 38em)
        +border-radius(0)

    .offline-ui-content
        padding-left: 2em

        &:before
            line-height: 1.25em

        &:after
            +border-radius(50%)
            content: " "
            display: block
            position: absolute
            top: 0
            bottom: 0
            left: 1em
            margin: auto
            height: 1em
            width: 1em

    .offline-ui-retry
        position: absolute
        right: 3em
        top: 0
        bottom: 0
        background: rgba(255, 255, 255, .2)
        text-decoration: none
        color: inherit
        line-height: 3.5em
        height: 3.5em
        margin: auto
        padding: 0 1em

    &.offline-ui-up
        +offline-animation(offline-dropout forwards .5s 2s)

        .offline-ui-content:after
            background: $green

    &.offline-ui-down
        +offline-animation(offline-dropin .5s)

        .offline-ui-content:after
            background: $red

        &.offline-ui-connecting, &.offline-ui-waiting
            padding-right: 3em

            .offline-ui-content:after
                background: $red

            &:after
                +offline-animation(offline-rotation .7s linear infinite)
                +border-radius(50%)
                content: " "
                display: block
                position: absolute
                right: 1em
                top: 0
                bottom: 0
                margin: auto
                height: 1em
                width: 1em
                border: 2px solid transparent
                border-top-color: rgba(255, 255, 255, .5)
                border-left-color: rgba(255, 255, 255, .5)
                opacity: 0.7

        &.offline-ui-waiting
            padding-right: 11em

            &.offline-ui-reconnect-failed-2s
                padding-right: 0


================================================
FILE: sass/offline-theme-default-indicator.sass
================================================
@import compass/css3

@import offline-theme-base-indicator

$red: #ec8787
$green: #d6e9c6

$darkRed: #551313
$darkGreen: #468847

.offline-ui
    +border-radius(4px)
    font-family: "Helvetica Neue", sans-serif
    padding: 1em
    max-width: 100%
    bottom: 1em
    left: 1em

    &.offline-ui-up
        background: $green
        color: $darkGreen

    &.offline-ui-down
        background: $red
        color: $darkRed

================================================
FILE: sass/offline-theme-default.sass
================================================
@import compass/css3

@import mixins
@import keyframes

@import offline-theme-base

$red: #ec8787
$green: #d6e9c6
$yellow: #f8ecad

$darkRed: #551313
$darkGreen: #468847
$darkYellow: #7c6d1f

+keyframes-offline-fadein
+keyframes-offline-fadeout-and-hide

+keyframes-offline-rotation

.offline-ui
    +border-radius(4px)
    font-family: "Helvetica Neue", sans-serif
    padding: 1em
    top: 1em
    width: 38em
    max-width: 100%
    overflow: hidden

    @media (max-width: 38em)
        +border-radius(0)
        top: 0

    .offline-ui-content:before
        line-height: 1.25em

    .offline-ui-retry
        position: absolute
        right: 3em
        top: 0
        bottom: 0
        background: rgba(0, 0, 0, .1)
        text-decoration: none
        color: inherit
        line-height: 3.5em
        height: 3.5em
        margin: auto
        padding: 0 1em

    &.offline-ui-up
        +offline-animation(offline-fadeout-and-hide forwards .5s 2s)
        background: $green
        color: $darkGreen

    &.offline-ui-down
        +offline-animation(offline-fadein .5s)
        background: $red
        color: $darkRed

        &.offline-ui-connecting, &.offline-ui-waiting
            background: $yellow
            color: $darkYellow
            padding-right: 3em

            &:after
                +offline-animation(offline-rotation .7s linear infinite)
                +border-radius(50%)
                content: " "
                display: block
                position: absolute
                right: 1em
                top: 0
                bottom: 0
                margin: auto
                height: 1em
                width: 1em
                border: 2px solid rgba(0, 0, 0, 0)
                border-top-color: $darkYellow
                border-left-color: $darkYellow
                opacity: 0.7

        &.offline-ui-waiting
            padding-right: 11em

            &.offline-ui-reconnect-failed-2s
                padding-right: 0


================================================
FILE: sass/offline-theme-hubspot.sass
================================================
@import compass/css3

@import offline-theme-default

.offline-ui
    +border-radius(0 0 4px 4px)
    +box-shadow(inset 0 0 0 1px rgba(0, 0, 0, .15), 0 2px 8px rgba(0, 0, 0, .1))
    font-family: "Helvetica Neue", Helvetica, sans-serif, sans-serif
    font-size: 13px
    top: 42px

================================================
FILE: sass/offline-theme-slide-indicator.sass
================================================
@import compass/css3

@import offline-theme-base-indicator

$red: #ec8787
$green: #d6e9c6

$darkRed: #551313
$darkGreen: #468847

.offline-ui
    +border-radius(4px 4px 0 0)
    font-family: "Helvetica Neue", sans-serif
    padding: 1em
    max-width: 100%
    bottom: 0
    left: 1em

    &.offline-ui-up
        background: $green
        color: $darkGreen

    &.offline-ui-down
        background: $red
        color: $darkRed

================================================
FILE: sass/offline-theme-slide.sass
================================================
@import compass/css3

@import mixins
@import keyframes

@import offline-theme-base

$red: #ec8787
$green: #d6e9c6
$yellow: #f8ecad

$darkRed: #551313
$darkGreen: #468847
$darkYellow: #7c6d1f

+keyframes-offline-dropin
+keyframes-offline-dropout

+keyframes-offline-rotation

.offline-ui
    +border-radius(0 0 4px 4px)
    font-family: "Helvetica Neue", sans-serif
    padding: 1em
    width: 38em
    max-width: 100%
    overflow: hidden

    @media (max-width: 38em)
        +border-radius(0)

    .offline-ui-retry
        position: absolute
        right: 3em
        top: 0
        bottom: 0
        background: rgba(0, 0, 0, .1)
        text-decoration: none
        color: inherit
        line-height: 3.5em
        height: 3.5em
        margin: auto
        padding: 0 1em

    &.offline-ui-up
        +offline-animation(offline-dropout forwards .5s 2s)
        background: $green
        color: $darkGreen

    &.offline-ui-down
        +offline-animation(offline-dropin .5s)
        background: $red
        color: $darkRed

        &.offline-ui-connecting, &.offline-ui-waiting
            background: $yellow
            color: $darkYellow
            padding-right: 3em

            &:after
                +offline-animation(offline-rotation .7s linear infinite)
                +border-radius(50%)
                content: " "
                display: block
                position: absolute
                right: 1em
                top: 0
                bottom: 0
                margin: auto
                height: 1em
                width: 1em
                border: 2px solid rgba(0, 0, 0, 0)
                border-top-color: $darkYellow
                border-left-color: $darkYellow
                opacity: 0.7

        &.offline-ui-waiting
            padding-right: 11em

            &.offline-ui-reconnect-failed-2s
                padding-right: 0


================================================
FILE: test/index.html
================================================
<head>
<script src="../offline.min.js"></script>

<!--
Themes:
<link rel="stylesheet" href="./themes/offline-theme-default.css" />
<link rel="stylesheet" href="./themes/offline-theme-default-indicator.css" />
<link rel="stylesheet" href="./themes/offline-theme-slide.css" />
<link rel="stylesheet" href="./themes/offline-theme-slide-indicator.css" />
<link rel="stylesheet" href="./themes/offline-theme-chrome.css" />
<link rel="stylesheet" href="./themes/offline-theme-chrome-indicator.css" />
<link rel="stylesheet" href="./themes/offline-theme-hubspot.css" />
-->

<link rel="stylesheet" href="../themes/offline-theme-chrome.css" />
<link rel="stylesheet" href="../themes/offline-language-english.css" />

<script>
var run = function(){
  var req = new XMLHttpRequest();
  req.timeout = 5000;
  req.open('GET', 'http://localhost:8888/walter/0', true);
  req.send();
}

setInterval(run, 3000);
</script>
</head>
<body>
</body>


================================================
FILE: test/snake.html
================================================
<head>
<script src="../offline.min.js"></script>
<script src="../js/snake.js"></script>

<!--
Themes:
<link rel="stylesheet" href="./themes/offline-theme-default.css" />
<link rel="stylesheet" href="./themes/offline-theme-default-indicator.css" />
<link rel="stylesheet" href="./themes/offline-theme-slide.css" />
<link rel="stylesheet" href="./themes/offline-theme-slide-indicator.css" />
<link rel="stylesheet" href="./themes/offline-theme-chrome.css" />
<link rel="stylesheet" href="./themes/offline-theme-chrome-indicator.css" />
<link rel="stylesheet" href="./themes/offline-theme-hubspot.css" />
-->

<link rel="stylesheet" href="../themes/offline-theme-chrome.css" />

<script>
Offline.options = {
  game: true
}

var run = function(){
  if (Offline.state === 'up')
    Offline.check();
}
setInterval(run, 5000);
</script>
</head>
<body>
  <h1 style="margin-top: 100px; text-align: center; font-family: helvetica;">Disable your internet connection to play!</h1>
</body>


================================================
FILE: themes/offline-language-arabic-indicator.css
================================================
@charset "UTF-8";
/* line 5, ../sass/offline-language-arabic-indicator.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "متصل.";
}
/* line 10, ../sass/offline-language-arabic-indicator.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "غير متصل.";
}


================================================
FILE: themes/offline-language-arabic.css
================================================
@charset "UTF-8";
/* line 6, ../sass/_content.sass */
.offline-ui .offline-ui-retry:before {
  content: " إعادة الاتصال";
}
/* line 11, ../sass/_content.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "الحاسوب متصل بالإنترنت.";
}
@media (max-width: 1024px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "جهازك متصل بالإنترنت";
  }
}
@media (max-width: 568px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: ".جهازك متصل";
  }
}
/* line 22, ../sass/_content.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: ".الحاسوب فقد الاتصال بالإنترنت";
}
@media (max-width: 1024px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: ".جهازك فقد الاتصال بالإنترنت";
  }
}
@media (max-width: 568px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: ".جهازك غير متصل";
  }
}
/* line 33, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-connecting .offline-ui-content:before, .offline-ui.offline-ui-down.offline-ui-connecting-2s .offline-ui-content:before {
  content: "...محاولة إعادة الاتصال";
}
/* line 42, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
  content: " الاتصال فقد إعادة الاتصال في" attr(data-retry-in-value) " ...ثواني";
}
@media (max-width: 568px) {
  /* line 42, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
    content: " إعادة الاتصال في" attr(data-retry-in-value) "...ث";
  }
}
/* line 50, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
  content: " الاتصال فقد إعادة الاتصال في" attr(data-retry-in-value) " ...ثانية";
}
@media (max-width: 568px) {
  /* line 50, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
    content: " إعادة الاتصال في" attr(data-retry-in-value) "...ث";
  }
}
/* line 58, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
  content: " الاتصال فقد إعادة الاتصال في" attr(data-retry-in-value) " ...دقائق";
}
@media (max-width: 568px) {
  /* line 58, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
    content: " إعادة الاتصال في" attr(data-retry-in-value) "...د";
  }
}
/* line 66, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
  content: " الاتصال فقد إعادة الاتصال في" attr(data-retry-in-value) " ...دقيقة";
}
@media (max-width: 568px) {
  /* line 66, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
    content: " إعادة الاتصال في" attr(data-retry-in-value) "...د";
  }
}
/* line 74, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
  content: " الاتصال فقد إعادة الاتصال في" attr(data-retry-in-value) " ...ساعات";
}
@media (max-width: 568px) {
  /* line 74, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
    content: " إعادة الاتصال في" attr(data-retry-in-value) "...س";
  }
}
/* line 82, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
  content: " الاتصال فقد إعادة الاتصال في" attr(data-retry-in-value) " ...ساعه";
}
@media (max-width: 568px) {
  /* line 82, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
    content: " إعادة الاتصال في" attr(data-retry-in-value) "...س";
  }
}
/* line 90, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s.offline-ui-waiting .offline-ui-retry {
  display: none;
}
/* line 93, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s .offline-ui-content:before {
  content: ".فشلت محاولة الاتصال";
}


================================================
FILE: themes/offline-language-chinese-simplified-indicator.css
================================================
@charset "UTF-8";
/* line 5, ../sass/offline-language-chinese-simplified-indicator.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "鍦ㄧ嚎";
}
/* line 10, ../sass/offline-language-chinese-simplified-indicator.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "绂荤嚎";
}


================================================
FILE: themes/offline-language-chinese-simplified.css
================================================
@charset "UTF-8";
/* line 6, ../sass/_content.sass */
.offline-ui .offline-ui-retry:before {
  content: "重连";
}
/* line 11, ../sass/_content.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "您的电脑已经连接到网络。";
}
@media (max-width: 1024px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "您的设备已经连接到网络。";
  }
}
@media (max-width: 568px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "您的设备已经连接到网络。";
  }
}
/* line 22, ../sass/_content.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "您的电脑失去了网络连接。";
}
@media (max-width: 1024px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "您的设备失去了网络连接。";
  }
}
@media (max-width: 568px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "您的设备失去了网络连接。";
  }
}
/* line 33, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-connecting .offline-ui-content:before, .offline-ui.offline-ui-down.offline-ui-connecting-2s .offline-ui-content:before {
  content: "正在尝试重连...";
}
/* line 42, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
  content: "失去网络连接。 即将重连:" attr(data-retry-in-value) "秒...";
}
@media (max-width: 568px) {
  /* line 42, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
    content: "即将重连:" attr(data-retry-in-value) "s...";
  }
}
/* line 50, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
  content: "失去网络连接。 即将重连:" attr(data-retry-in-value) "秒...";
}
@media (max-width: 568px) {
  /* line 50, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
    content: "即将重连:" attr(data-retry-in-value) "s...";
  }
}
/* line 58, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
  content: "失去网络连接。 即将重连:" attr(data-retry-in-value) "分钟...";
}
@media (max-width: 568px) {
  /* line 58, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
    content: "即将重连:" attr(data-retry-in-value) "m...";
  }
}
/* line 66, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
  content: "失去网络连接。 即将重连:" attr(data-retry-in-value) "分钟...";
}
@media (max-width: 568px) {
  /* line 66, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
    content: "即将重连:" attr(data-retry-in-value) "m...";
  }
}
/* line 74, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
  content: "失去网络连接。 即将重连:" attr(data-retry-in-value) "小时...";
}
@media (max-width: 568px) {
  /* line 74, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
    content: "即将重连:" attr(data-retry-in-value) "h...";
  }
}
/* line 82, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
  content: "失去网络连接。 即将重连:" attr(data-retry-in-value) "小时...";
}
@media (max-width: 568px) {
  /* line 82, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
    content: "即将重连:" attr(data-retry-in-value) "h...";
  }
}
/* line 90, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s.offline-ui-waiting .offline-ui-retry {
  display: none;
}
/* line 93, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s .offline-ui-content:before {
  content: "尝试连接网络失败。";
}


================================================
FILE: themes/offline-language-chinese-traditional-indicator.css
================================================
@charset "UTF-8";
/* line 5, ../sass/offline-language-chinese-traditional-indicator.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "鍦ㄧ窔";
}
/* line 10, ../sass/offline-language-chinese-traditional-indicator.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "闆㈢窔";
}


================================================
FILE: themes/offline-language-chinese-traditional.css
================================================
@charset "UTF-8";
/* line 6, ../sass/_content.sass */
.offline-ui .offline-ui-retry:before {
  content: "重連";
}
/* line 11, ../sass/_content.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "您的電腦已經連接到網絡。";
}
@media (max-width: 1024px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "您的設備已經連接到網絡。";
  }
}
@media (max-width: 568px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "您的設備已經連接到網絡。";
  }
}
/* line 22, ../sass/_content.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "您的電腦失去了網絡連接。";
}
@media (max-width: 1024px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "您的設備失去了網絡連接。";
  }
}
@media (max-width: 568px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "您的設備失去了網絡連接。";
  }
}
/* line 33, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-connecting .offline-ui-content:before, .offline-ui.offline-ui-down.offline-ui-connecting-2s .offline-ui-content:before {
  content: "正在嘗試重連...";
}
/* line 42, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
  content: "失去網絡連接。即將重連:" attr(data-retry-in-value) "秒...";
}
@media (max-width: 568px) {
  /* line 42, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
    content: "即將重連:" attr(data-retry-in-value) "s...";
  }
}
/* line 50, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
  content: "失去網絡連接。即將重連:" attr(data-retry-in-value) "秒...";
}
@media (max-width: 568px) {
  /* line 50, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
    content: "即將重連:" attr(data-retry-in-value) "s...";
  }
}
/* line 58, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
  content: "失去網絡連接。即將重連:" attr(data-retry-in-value) "分鐘...";
}
@media (max-width: 568px) {
  /* line 58, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
    content: "即將重連:" attr(data-retry-in-value) "m...";
  }
}
/* line 66, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
  content: "失去網絡連接。即將重連:" attr(data-retry-in-value) "分鐘...";
}
@media (max-width: 568px) {
  /* line 66, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
    content: "即將重連:" attr(data-retry-in-value) "m...";
  }
}
/* line 74, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
  content: "失去網絡連接。即將重連:" attr(data-retry-in-value) "小時...";
}
@media (max-width: 568px) {
  /* line 74, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
    content: "即將重連:" attr(data-retry-in-value) "h...";
  }
}
/* line 82, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
  content: "失去網絡連接。即將重連:" attr(data-retry-in-value) "小時...";
}
@media (max-width: 568px) {
  /* line 82, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
    content: "即將重連:" attr(data-retry-in-value) "h...";
  }
}
/* line 90, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s.offline-ui-waiting .offline-ui-retry {
  display: none;
}
/* line 93, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s .offline-ui-content:before {
  content: "嘗試連接網絡失敗。";
}


================================================
FILE: themes/offline-language-czech-indicator.css
================================================
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "Online"; }
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "Offline"; }


================================================
FILE: themes/offline-language-czech.css
================================================
@charset "UTF-8";
/* line 6, ../sass/_content.sass */
.offline-ui .offline-ui-retry:before {
  content: "Znovu připojit";
}
/* line 11, ../sass/_content.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "Váš počítač je připojen k internetu.";
}
@media (max-width: 1024px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "Vaše zařízení je připojeno k internetu.";
  }
}
@media (max-width: 568px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "Vaše zařízení je připojeno.";
  }
}
/* line 22, ../sass/_content.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "Váš počítač ztratil připojení k internetu.";
}
@media (max-width: 1024px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "Vaše zařízení ztratilo připojení k internetu.";
  }
}
@media (max-width: 568px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "Vaše zařízení není připojeno.";
  }
}
/* line 33, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-connecting .offline-ui-content:before, .offline-ui.offline-ui-down.offline-ui-connecting-2s .offline-ui-content:before {
  content: "Zkouším se znovu připojit...";
}
/* line 42, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
  content: "Připojení ztraceno. Znovu zkusím za " attr(data-retry-in-value) " sekund...";
}
@media (max-width: 568px) {
  /* line 42, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
    content: "Znovu zkusím za " attr(data-retry-in-value) "s...";
  }
}
/* line 50, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
  content: "Připojení ztraceno. Znovu zkusím za " attr(data-retry-in-value) " sekundu...";
}
@media (max-width: 568px) {
  /* line 50, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
    content: "Znovu zkusím za " attr(data-retry-in-value) "s...";
  }
}
/* line 58, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
  content: "Připojení ztraceno. Znovu zkusím za " attr(data-retry-in-value) " minut...";
}
@media (max-width: 568px) {
  /* line 58, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
    content: "Znovu zkusím za " attr(data-retry-in-value) "m...";
  }
}
/* line 66, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
  content: "Připojení ztraceno. Znovu zkusím za " attr(data-retry-in-value) " minutu...";
}
@media (max-width: 568px) {
  /* line 66, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
    content: "Znovu zkusím za " attr(data-retry-in-value) "m...";
  }
}
/* line 74, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
  content: "Připojení ztraceno. Znovu zkusím za " attr(data-retry-in-value) " hodin...";
}
@media (max-width: 568px) {
  /* line 74, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
    content: "Znovu zkusím za " attr(data-retry-in-value) "h...";
  }
}
/* line 82, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
  content: "Připojení ztraceno. Znovu zkusím za " attr(data-retry-in-value) " hodinu...";
}
@media (max-width: 568px) {
  /* line 82, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
    content: "Znovu zkusím za " attr(data-retry-in-value) "h...";
  }
}
/* line 90, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s.offline-ui-waiting .offline-ui-retry {
  display: none;
}
/* line 93, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s .offline-ui-content:before {
  content: "Pokus o připojení selhal.";
}


================================================
FILE: themes/offline-language-dutch-indicator.css
================================================
/* line 5, ../sass/offline-language-dutch-indicator.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "Online";
}
/* line 10, ../sass/offline-language-dutch-indicator.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "Offline";
}


================================================
FILE: themes/offline-language-dutch.css
================================================
/* line 6, ../sass/_content.sass */
.offline-ui .offline-ui-retry:before {
  content: "Opnieuw";
}
/* line 11, ../sass/_content.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "Computer verbonden met internet.";
}
@media (max-width: 1024px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "Apparaat verbonden met internet.";
  }
}
@media (max-width: 568px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "Apparaat verbonden met internet.";
  }
}
/* line 22, ../sass/_content.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "Computer niet verbonden met internet.";
}
@media (max-width: 1024px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "Apparaat niet verbonden met internet.";
  }
}
@media (max-width: 568px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "Apparaat niet verbonden met internet.";
  }
}
/* line 33, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-connecting .offline-ui-content:before, .offline-ui.offline-ui-down.offline-ui-connecting-2s .offline-ui-content:before {
  content: "Opnieuw proberen...";
}
/* line 42, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
  content: "Internetverbinding kwijt. Opnieuw proberen over " attr(data-retry-in-value) " seconden...";
}
@media (max-width: 568px) {
  /* line 42, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
    content: "Opnieuw proberen over " attr(data-retry-in-value) "s...";
  }
}
/* line 50, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
  content: "Internetverbinding kwijt. Opnieuw proberen over " attr(data-retry-in-value) " seconde...";
}
@media (max-width: 568px) {
  /* line 50, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
    content: "Opnieuw proberen over " attr(data-retry-in-value) "s...";
  }
}
/* line 58, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
  content: "Internetverbinding kwijt. Opnieuw proberen over " attr(data-retry-in-value) " minuten...";
}
@media (max-width: 568px) {
  /* line 58, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
    content: "Opnieuw proberen over " attr(data-retry-in-value) "m...";
  }
}
/* line 66, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
  content: "Internetverbinding kwijt. Opnieuw proberen over " attr(data-retry-in-value) " minuut...";
}
@media (max-width: 568px) {
  /* line 66, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
    content: "Opnieuw proberen over " attr(data-retry-in-value) "m...";
  }
}
/* line 74, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
  content: "Internetverbinding kwijt. Opnieuw proberen over " attr(data-retry-in-value) " uren...";
}
@media (max-width: 568px) {
  /* line 74, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
    content: "Opnieuw proberen over " attr(data-retry-in-value) "u...";
  }
}
/* line 82, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
  content: "Internetverbinding kwijt. Opnieuw proberen over " attr(data-retry-in-value) " uur...";
}
@media (max-width: 568px) {
  /* line 82, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
    content: "Opnieuw proberen over " attr(data-retry-in-value) "u...";
  }
}
/* line 90, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s.offline-ui-waiting .offline-ui-retry {
  display: none;
}
/* line 93, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s .offline-ui-content:before {
  content: "Poging mislukt.";
}


================================================
FILE: themes/offline-language-english-indicator.css
================================================
/* line 5, ../sass/offline-language-english-indicator.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "Online";
}
/* line 10, ../sass/offline-language-english-indicator.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "Offline";
}


================================================
FILE: themes/offline-language-english.css
================================================
/* line 6, ../sass/_content.sass */
.offline-ui .offline-ui-retry:before {
  content: "Reconnect";
}
/* line 11, ../sass/_content.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "Your computer is connected to the internet.";
}
@media (max-width: 1024px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "Your device is connected to the internet.";
  }
}
@media (max-width: 568px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "Your device is connected.";
  }
}
/* line 22, ../sass/_content.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "Your computer lost its internet connection.";
}
@media (max-width: 1024px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "Your device lost its internet connection.";
  }
}
@media (max-width: 568px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "Your device isn't connected.";
  }
}
/* line 33, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-connecting .offline-ui-content:before, .offline-ui.offline-ui-down.offline-ui-connecting-2s .offline-ui-content:before {
  content: "Attempting to reconnect...";
}
/* line 42, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
  content: "Connection lost. Reconnecting in " attr(data-retry-in-value) " seconds...";
}
@media (max-width: 568px) {
  /* line 42, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
    content: "Reconnecting in " attr(data-retry-in-value) "s...";
  }
}
/* line 50, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
  content: "Connection lost. Reconnecting in " attr(data-retry-in-value) " second...";
}
@media (max-width: 568px) {
  /* line 50, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
    content: "Reconnecting in " attr(data-retry-in-value) "s...";
  }
}
/* line 58, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
  content: "Connection lost. Reconnecting in " attr(data-retry-in-value) " minutes...";
}
@media (max-width: 568px) {
  /* line 58, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
    content: "Reconnecting in " attr(data-retry-in-value) "m...";
  }
}
/* line 66, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
  content: "Connection lost. Reconnecting in " attr(data-retry-in-value) " minute...";
}
@media (max-width: 568px) {
  /* line 66, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
    content: "Reconnecting in " attr(data-retry-in-value) "m...";
  }
}
/* line 74, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
  content: "Connection lost. Reconnecting in " attr(data-retry-in-value) " hours...";
}
@media (max-width: 568px) {
  /* line 74, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
    content: "Reconnecting in " attr(data-retry-in-value) "h...";
  }
}
/* line 82, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
  content: "Connection lost. Reconnecting in " attr(data-retry-in-value) " hour...";
}
@media (max-width: 568px) {
  /* line 82, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
    content: "Reconnecting in " attr(data-retry-in-value) "h...";
  }
}
/* line 90, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s.offline-ui-waiting .offline-ui-retry {
  display: none;
}
/* line 93, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s .offline-ui-content:before {
  content: "Connection attempt failed.";
}


================================================
FILE: themes/offline-language-french-indicator.css
================================================
@charset "UTF-8";
/* line 5, ../sass/offline-language-french-indicator.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "Connecté";
}
/* line 10, ../sass/offline-language-french-indicator.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "Pas connecté";
}


================================================
FILE: themes/offline-language-french.css
================================================
@charset "UTF-8";
/* line 6, ../sass/_content.sass */
.offline-ui .offline-ui-retry:before {
  content: "Reconnecter";
}
/* line 11, ../sass/_content.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "Votre ordinateur est connecté à Internet.";
}
@media (max-width: 1024px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "Votre appareil est connecté à Internet.";
  }
}
@media (max-width: 568px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "Votre appareil est connecté.";
  }
}
/* line 22, ../sass/_content.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "Votre ordinateur a perdu sa connexion Internet.";
}
@media (max-width: 1024px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "Votre appareil a perdu sa connexion Internet.";
  }
}
@media (max-width: 568px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "Votre appareil n'est pas branché.";
  }
}
/* line 33, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-connecting .offline-ui-content:before, .offline-ui.offline-ui-down.offline-ui-connecting-2s .offline-ui-content:before {
  content: "Tentative de reconnexion...";
}
/* line 42, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
  content: "Connexion perdue. Reconnexion dans " attr(data-retry-in-value) " secondes...";
}
@media (max-width: 568px) {
  /* line 42, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
    content: "Reconnexion dans " attr(data-retry-in-value) "s...";
  }
}
/* line 50, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
  content: "Connexion perdue. Reconnexion dans " attr(data-retry-in-value) " seconde...";
}
@media (max-width: 568px) {
  /* line 50, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
    content: "Reconnexion dans " attr(data-retry-in-value) "s...";
  }
}
/* line 58, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
  content: "Connexion perdue. Reconnexion dans " attr(data-retry-in-value) " minutes...";
}
@media (max-width: 568px) {
  /* line 58, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
    content: "Reconnexion dans " attr(data-retry-in-value) "m...";
  }
}
/* line 66, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
  content: "Connexion perdue. Reconnexion dans " attr(data-retry-in-value) " minute...";
}
@media (max-width: 568px) {
  /* line 66, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
    content: "Reconnexion dans " attr(data-retry-in-value) "m...";
  }
}
/* line 74, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
  content: "Connexion perdue. Reconnexion dans " attr(data-retry-in-value) " heures...";
}
@media (max-width: 568px) {
  /* line 74, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
    content: "Reconnexion dans " attr(data-retry-in-value) "h...";
  }
}
/* line 82, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
  content: "Connexion perdue. Reconnexion dans " attr(data-retry-in-value) " heure...";
}
@media (max-width: 568px) {
  /* line 82, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
    content: "Reconnexion dans " attr(data-retry-in-value) "h...";
  }
}
/* line 90, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s.offline-ui-waiting .offline-ui-retry {
  display: none;
}
/* line 93, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s .offline-ui-content:before {
  content: "La tentative de connexion a échoué.";
}


================================================
FILE: themes/offline-language-german-indicator.css
================================================
/* line 5, ../sass/offline-language-german-indicator.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "Online";
}
/* line 10, ../sass/offline-language-german-indicator.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "Offline";
}


================================================
FILE: themes/offline-language-german.css
================================================
@charset "UTF-8";
/* line 6, ../sass/_content.sass */
.offline-ui .offline-ui-retry:before {
  content: "Verbinden";
}
/* line 11, ../sass/_content.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "Dein Computer ist mit dem Internet verbunden.";
}
@media (max-width: 1024px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "Deing Gerät ist mit dem Internet verbunden.";
  }
}
@media (max-width: 568px) {
  /* line 11, ../sass/_content.sass */
  .offline-ui.offline-ui-up .offline-ui-content:before {
    content: "Dein Gerät ist online.";
  }
}
/* line 22, ../sass/_content.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "Dein Computer wurde vom Internet getrennt.";
}
@media (max-width: 1024px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "Dein Gerät wurde vom Internet getrennt.";
  }
}
@media (max-width: 568px) {
  /* line 22, ../sass/_content.sass */
  .offline-ui.offline-ui-down .offline-ui-content:before {
    content: "Keine Internetverbindung.";
  }
}
/* line 33, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-connecting .offline-ui-content:before, .offline-ui.offline-ui-down.offline-ui-connecting-2s .offline-ui-content:before {
  content: "Versuche Verbindung wiederherzustellen...";
}
/* line 42, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
  content: "Keine Verbindung. Verbinde nochmal in " attr(data-retry-in-value) " Sekunden...";
}
@media (max-width: 568px) {
  /* line 42, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"]:before {
    content: "Verbinde in " attr(data-retry-in-value) "s...";
  }
}
/* line 50, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
  content: "Keine Verbindung. Verbinde nochmal in " attr(data-retry-in-value) " Sekunde...";
}
@media (max-width: 568px) {
  /* line 50, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="second"][data-retry-in-value="1"]:before {
    content: "Verbinde in " attr(data-retry-in-value) "s...";
  }
}
/* line 58, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
  content: "Keine Verbindung. Verbinde nochmal in " attr(data-retry-in-value) " Minuten...";
}
@media (max-width: 568px) {
  /* line 58, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"]:before {
    content: "Verbinde in " attr(data-retry-in-value) "m...";
  }
}
/* line 66, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
  content: "Keine Verbindung. Verbinde nochmal in " attr(data-retry-in-value) " Minute...";
}
@media (max-width: 568px) {
  /* line 66, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="minute"][data-retry-in-value="1"]:before {
    content: "Verbinde in " attr(data-retry-in-value) "m...";
  }
}
/* line 74, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
  content: "Keine Verbindung. Verbinde nochmal in " attr(data-retry-in-value) " Stunden...";
}
@media (max-width: 568px) {
  /* line 74, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"]:before {
    content: "Verbinde in " attr(data-retry-in-value) "h...";
  }
}
/* line 82, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
  content: "Keine Verbindung. Verbinde nochmal in " attr(data-retry-in-value) " Stunde...";
}
@media (max-width: 568px) {
  /* line 82, ../sass/_content.sass */
  .offline-ui.offline-ui-down.offline-ui-waiting .offline-ui-content[data-retry-in-unit="hour"][data-retry-in-value="1"]:before {
    content: "Verbinde in " attr(data-retry-in-value) "h...";
  }
}
/* line 90, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s.offline-ui-waiting .offline-ui-retry {
  display: none;
}
/* line 93, ../sass/_content.sass */
.offline-ui.offline-ui-down.offline-ui-reconnect-failed-2s .offline-ui-content:before {
  content: "Verbindung Fehlgeschlagen.";
}


================================================
FILE: themes/offline-language-hebrew-indicator.css
================================================
/* line 5, ../sass/offline-language-english-indicator.sass */
.offline-ui.offline-ui-up .offline-ui-content:before {
  content: "מחובר";
}
/* line 10, ../sass/offline-language-english-indicator.sass */
.offline-ui.offline-ui-down .offline-ui-content:before {
  content: "מנותק";
}


================================================
FILE: themes/offline-language-hebrew.css
================================================
/* line 6, ../sass/_content.sass */

.offline-ui .offline-ui-retry:before {
    content: "מתחבר";
}
/* line 11, ../sass/_content.sass */

.offline-ui.offline-ui-up .offline-ui-content:before {
    content: "המחשב לא מחובר לאינטרנט.";
}

@media (max-width: 1024px) { /* line 11, ../sass/_content.sass */

    .offline-ui.offline-ui-up .offline-ui-content:before {
        content: "המכשיר לא מחובר לאינטרנט.";
    }
}

@media (max-width: 568px) { /* line 11, ../sass/_content.sass */

    .offline-ui.offline-ui-up .offline-ui-content:before {
        content: "המכשיר מחובר.";
    }
}
/* line 22, ../sass/_content.sass */

.offline-ui.offline-ui-down .offline-ui-content:before {
    content: "המחשב איבד את החיבור לאינטרנט.";
}

@media (max-width: 1024px) { /* line 22, ../sass/_content.sass */

    .offline-ui.offline-ui-down .offline-ui-content:before {
        content: "המכשיר איבד את החיבור לאינטרנט.";
    }
}

@media (max-width: 568px) { /* line 22, ../sass/_content.sass */

    .offline-ui.offline-ui-down .offline-ui-content:before {
        content: "המכשיר מחובר.";
    }
}
/* line 33, ../sass/_content.sass */

.offline-ui.offline-ui-down.offline-ui-connecting .offline-ui-
Download .txt
gitextract_8akg9yce/

├── .github/
│   ├── ISSUE_TEMPLATE
│   └── PULL_REQUEST_TEMPLATE
├── .gitignore
├── .hsdoc
├── Gruntfile.coffee
├── LICENSE
├── README.md
├── bower.json
├── coffee/
│   ├── offline.coffee
│   ├── reconnect.coffee
│   ├── requests.coffee
│   ├── simulate.coffee
│   ├── snake.coffee
│   └── ui.coffee
├── docs/
│   └── welcome/
│       ├── app.js
│       ├── images/
│       │   ├── ethernet-cable.sketch/
│       │   │   ├── Data
│       │   │   ├── fonts
│       │   │   └── version
│       │   ├── macbook-pro-top.sketch/
│       │   │   ├── Data
│       │   │   ├── fonts
│       │   │   └── version
│       │   └── macbook-pro.sketch/
│       │       ├── Data
│       │       ├── fonts
│       │       └── version
│       └── index.html
├── install.json
├── js/
│   ├── offline.js
│   ├── reconnect.js
│   ├── requests.js
│   ├── simulate.js
│   ├── snake.js
│   └── ui.js
├── offline.js
├── package.json
├── sass/
│   ├── _arabic.sass
│   ├── _chinese-simplified.sass
│   ├── _chinese-traditional.sass
│   ├── _content.sass
│   ├── _czech.sass
│   ├── _dutch.sass
│   ├── _english.sass
│   ├── _french.sass
│   ├── _german.sass
│   ├── _italian.sass
│   ├── _keyframes.sass
│   ├── _mixins.sass
│   ├── _offline-theme-base-indicator.sass
│   ├── _offline-theme-base.sass
│   ├── _pashto.sass
│   ├── _persian.sass
│   ├── _polish.sass
│   ├── _portuguese-brazil.sass
│   ├── _spanish.sass
│   ├── _turkish.sass
│   ├── offline-language-arabic-indicator.sass
│   ├── offline-language-arabic.sass
│   ├── offline-language-chinese-simplified-indicator.sass
│   ├── offline-language-chinese-simplified.sass
│   ├── offline-language-chinese-traditional-indicator.sass
│   ├── offline-language-chinese-traditional.sass
│   ├── offline-language-czech-indicator.sass
│   ├── offline-language-czech.sass
│   ├── offline-language-dutch-indicator.sass
│   ├── offline-language-dutch.sass
│   ├── offline-language-english-indicator.sass
│   ├── offline-language-english.sass
│   ├── offline-language-french-indicator.sass
│   ├── offline-language-french.sass
│   ├── offline-language-german-indicator.sass
│   ├── offline-language-german.sass
│   ├── offline-language-italian-indicator.sass
│   ├── offline-language-italian.sass
│   ├── offline-language-pashto-indicator.sass
│   ├── offline-language-pashto.sass
│   ├── offline-language-polish-indicator.sass
│   ├── offline-language-polish.sass
│   ├── offline-language-portuguese-brazil-indicator.sass
│   ├── offline-language-portuguese-brazil.sass
│   ├── offline-language-simplified-chinese-indicator.sass
│   ├── offline-language-spanish-indicator.sass
│   ├── offline-language-spanish.sass
│   ├── offline-language-turkish-indicator.sass
│   ├── offline-language-turkish.sass
│   ├── offline-theme-chrome-indicator.sass
│   ├── offline-theme-chrome.sass
│   ├── offline-theme-dark-indicator.sass
│   ├── offline-theme-dark.sass
│   ├── offline-theme-default-indicator.sass
│   ├── offline-theme-default.sass
│   ├── offline-theme-hubspot.sass
│   ├── offline-theme-slide-indicator.sass
│   └── offline-theme-slide.sass
├── test/
│   ├── index.html
│   └── snake.html
└── themes/
    ├── offline-language-arabic-indicator.css
    ├── offline-language-arabic.css
    ├── offline-language-chinese-simplified-indicator.css
    ├── offline-language-chinese-simplified.css
    ├── offline-language-chinese-traditional-indicator.css
    ├── offline-language-chinese-traditional.css
    ├── offline-language-czech-indicator.css
    ├── offline-language-czech.css
    ├── offline-language-dutch-indicator.css
    ├── offline-language-dutch.css
    ├── offline-language-english-indicator.css
    ├── offline-language-english.css
    ├── offline-language-french-indicator.css
    ├── offline-language-french.css
    ├── offline-language-german-indicator.css
    ├── offline-language-german.css
    ├── offline-language-hebrew-indicator.css
    ├── offline-language-hebrew.css
    ├── offline-language-italian-indicator.css
    ├── offline-language-italian.css
    ├── offline-language-pashto-indicator.css
    ├── offline-language-pashto.css
    ├── offline-language-persian-indicator.css
    ├── offline-language-persian.css
    ├── offline-language-polish-indicator.css
    ├── offline-language-polish.css
    ├── offline-language-portuguese-brazil-indicator.css
    ├── offline-language-portuguese-brazil.css
    ├── offline-language-simplified-chinese-indicator.css
    ├── offline-language-spanish-indicator.css
    ├── offline-language-spanish.css
    ├── offline-language-turkish-indicator.css
    ├── offline-language-turkish.css
    ├── offline-theme-chrome-indicator.css
    ├── offline-theme-chrome.css
    ├── offline-theme-dark-indicator.css
    ├── offline-theme-dark.css
    ├── offline-theme-default-indicator.css
    ├── offline-theme-default.css
    ├── offline-theme-hubspot.css
    ├── offline-theme-slide-indicator.css
    └── offline-theme-slide.css
Condensed preview — 136 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (317K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE",
    "chars": 121,
    "preview": "<!--\n\n    This project isn't actively maintained.\n\n    Issues and pull requests will likely not receive a response.\n\n-->"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE",
    "chars": 121,
    "preview": "<!--\n\n    This project isn't actively maintained.\n\n    Issues and pull requests will likely not receive a response.\n\n-->"
  },
  {
    "path": ".gitignore",
    "chars": 26,
    "preview": "node_modules/\n.sass-cache/"
  },
  {
    "path": ".hsdoc",
    "chars": 108,
    "preview": "title: \"Offline\"\nsource: \"{coffee/*,sass/*}\"\nassets: \"{js/*,themes/*,offline.min.js,docs/welcome/*,test/*}\"\n"
  },
  {
    "path": "Gruntfile.coffee",
    "chars": 1136,
    "preview": "module.exports = (grunt) ->\n  grunt.initConfig\n    pkg: grunt.file.readJSON('package.json')\n\n    coffee:\n      compile:\n"
  },
  {
    "path": "LICENSE",
    "chars": 1058,
    "preview": "Copyright (c) 2014 HubSpot, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this s"
  },
  {
    "path": "README.md",
    "chars": 5727,
    "preview": "___\n\n**This project isn't actively maintained.**\n___\n\nOffline\n======\n\n**Note to users pre-0.6.0:  Offline previously use"
  },
  {
    "path": "bower.json",
    "chars": 713,
    "preview": "{\n  \"name\": \"offline\",\n  \"homepage\": \"http://github.hubspot.com/offline/docs/welcome\",\n  \"authors\": [\n    \"Zack Bloom <z"
  },
  {
    "path": "coffee/offline.coffee",
    "chars": 6105,
    "preview": "# We get a clue that the browser might be offline from suspicious requests or\n# the HTML5 offline api.  If we suspect it"
  },
  {
    "path": "coffee/reconnect.coffee",
    "chars": 1255,
    "preview": "unless window.Offline\n  throw new Error \"Offline Reconnect brought in without offline.js\"\n\nrc = Offline.reconnect = {}\n\n"
  },
  {
    "path": "coffee/requests.coffee",
    "chars": 2473,
    "preview": "unless window.Offline\n  throw new Error \"Requests module brought in without offline.js\"\n\nheld = []\n\nwaitingOnConfirm = f"
  },
  {
    "path": "coffee/simulate.coffee",
    "chars": 392,
    "preview": "unless Offline\n  throw new Error(\"Offline simulate brought in without offline.js\")\n\nfor state in ['up', 'down']\n    try\n"
  },
  {
    "path": "coffee/snake.coffee",
    "chars": 2122,
    "preview": "canvas = dot = score = speed = stop = snake = randDot = fill = null\n\nrender = ->\n  canvas = document.createElementNS('ht"
  },
  {
    "path": "coffee/ui.coffee",
    "chars": 3127,
    "preview": "unless window.Offline\n  throw new Error \"Offline UI brought in without offline.js\"\n\nTEMPLATE = '<div class=\"offline-ui\">"
  },
  {
    "path": "docs/welcome/app.js",
    "chars": 3227,
    "preview": "$(function(){\n    var themes = [{\n        name: 'default',\n        title: 'Default'\n    }, {\n        name: 'slide',\n    "
  },
  {
    "path": "docs/welcome/images/ethernet-cable.sketch/fonts",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/welcome/images/ethernet-cable.sketch/version",
    "chars": 2,
    "preview": "14"
  },
  {
    "path": "docs/welcome/images/macbook-pro-top.sketch/fonts",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/welcome/images/macbook-pro-top.sketch/version",
    "chars": 2,
    "preview": "14"
  },
  {
    "path": "docs/welcome/images/macbook-pro.sketch/fonts",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/welcome/images/macbook-pro.sketch/version",
    "chars": 2,
    "preview": "14"
  },
  {
    "path": "docs/welcome/index.html",
    "chars": 17845,
    "preview": "<!DOCTYPE html>\n<!--[if lt IE 7]> <html class=\"no-js ie6 ie9-and-less ie8-and-less ie7-and-less\" lang=\"en\"> <![endif]-->"
  },
  {
    "path": "install.json",
    "chars": 2660,
    "preview": "{\n  \"resources\": {\n    \"head\": [\n      {\n        \"type\": \"script\",\n        \"src\": \"./offline.min.js\"\n      },\n      {\n  "
  },
  {
    "path": "js/offline.js",
    "chars": 8022,
    "preview": "(function() {\n  var Offline, checkXHR, defaultOptions, extendNative, grab, handlers, init;\n\n  extendNative = function(to"
  },
  {
    "path": "js/reconnect.js",
    "chars": 1821,
    "preview": "(function() {\n  var down, next, nope, rc, reset, retryIntv, tick, tryNow, up;\n\n  if (!window.Offline) {\n    throw new Er"
  },
  {
    "path": "js/requests.js",
    "chars": 3668,
    "preview": "(function() {\n  var clear, flush, held, holdRequest, makeRequest, waitingOnConfirm;\n\n  if (!window.Offline) {\n    throw "
  },
  {
    "path": "js/simulate.js",
    "chars": 762,
    "preview": "(function() {\n  var base, e, i, len, ref, simulate, state;\n\n  if (!Offline) {\n    throw new Error(\"Offline simulate brou"
  },
  {
    "path": "js/snake.js",
    "chars": 2844,
    "preview": "(function() {\n  var canvas, dot, fill, hide, keyHandler, move, randDot, render, score, show, snake, speed, stop;\n\n  canv"
  },
  {
    "path": "js/ui.js",
    "chars": 4266,
    "preview": "(function() {\n  var RETRY_TEMPLATE, TEMPLATE, _onreadystatechange, addClass, content, createFromHTML, el, flashClass, fl"
  },
  {
    "path": "offline.js",
    "chars": 15930,
    "preview": "/*! offline-js 0.7.19 */\n(function() {\n  var Offline, checkXHR, defaultOptions, extendNative, grab, handlers, init;\n  ex"
  },
  {
    "path": "package.json",
    "chars": 690,
    "preview": "{\n  \"name\": \"offline-js\",\n  \"version\": \"0.7.19\",\n  \"description\": \"Automatically detect when a browser is offline\",\n  \"a"
  },
  {
    "path": "sass/_arabic.sass",
    "chars": 2189,
    "preview": "@charset \"utf-8\"\r\n$upComputer: \"الحاسوب متصل بالإنترنت.\"\r\n$upDevice: \"جهازك متصل بالإنترنت\"\r\n$upDeviceSmall: \".جهازك متص"
  },
  {
    "path": "sass/_chinese-simplified.sass",
    "chars": 1993,
    "preview": "@charset \"utf-8\"\n\n$upComputer: \"您的电脑已经连接到网络。\"\n$upDevice: \"您的设备已经连接到网络。\"\n$upDeviceSmall: \"您的设备已经连接到网络。\"\n\n$downComputer: \""
  },
  {
    "path": "sass/_chinese-traditional.sass",
    "chars": 1992,
    "preview": "@charset \"utf-8\"\n\n$upComputer: \"您的電腦已經連接到網絡。\"\n$upDevice: \"您的設備已經連接到網絡。\"\n$upDeviceSmall: \"您的設備已經連接到網絡。\"\n\n$downComputer: \""
  },
  {
    "path": "sass/_content.sass",
    "chars": 3806,
    "preview": "=offline-content\n    .offline-ui\n\n        .offline-ui-retry\n\n            &:before\n                content: $retryButton\n"
  },
  {
    "path": "sass/_czech.sass",
    "chars": 2251,
    "preview": "@charset \"utf-8\"\n\n$upComputer: \"Váš počítač je připojen k internetu.\"\n$upDevice: \"Vaše zařízení je připojeno k internetu"
  },
  {
    "path": "sass/_dutch.sass",
    "chars": 2232,
    "preview": "@charset \"utf-8\"\n\n$upComputer: \"Computer verbonden met internet.\"\n$upDevice: \"Apparaat verbonden met internet.\"\n$upDevic"
  },
  {
    "path": "sass/_english.sass",
    "chars": 2244,
    "preview": "@charset \"utf-8\"\n$upComputer: \"Your computer is connected to the internet.\"\n$upDevice: \"Your device is connected to the "
  },
  {
    "path": "sass/_french.sass",
    "chars": 2275,
    "preview": "@charset \"utf-8\"\n$upComputer: \"Votre ordinateur est connecté à Internet.\"\n$upDevice: \"Votre appareil est connecté à Inte"
  },
  {
    "path": "sass/_german.sass",
    "chars": 2261,
    "preview": "@charset \"utf-8\"\n$upComputer: \"Dein Computer ist mit dem Internet verbunden.\"\n$upDevice: \"Deing Gerät ist mit dem Intern"
  },
  {
    "path": "sass/_italian.sass",
    "chars": 2251,
    "preview": "@charset \"utf-8\"\n$upComputer: \"Il tuo computer è connesso ad internet.\"\n$upDevice: \"Il tuo device è connesso ad internet"
  },
  {
    "path": "sass/_keyframes.sass",
    "chars": 1785,
    "preview": "@import compass/css3\n@import mixins\n\n=keyframes-offline-fadein\n    +offline-keyframes(\"offline-fadein\")\n        0%\n     "
  },
  {
    "path": "sass/_mixins.sass",
    "chars": 788,
    "preview": "=offline-keyframes($name)\n    @-webkit-keyframes #{$name}\n        @content\n    @-moz-keyframes #{$name}\n        @content"
  },
  {
    "path": "sass/_offline-theme-base-indicator.sass",
    "chars": 409,
    "preview": "@import compass/css3\n\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:after, .offline-ui *:before, .offline-"
  },
  {
    "path": "sass/_offline-theme-base.sass",
    "chars": 850,
    "preview": "@import compass/css3\n@import compass/css3/user-interface\n\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:af"
  },
  {
    "path": "sass/_pashto.sass",
    "chars": 2236,
    "preview": "@charset \"utf-8\"\n$upComputer: \"ستاسو د کمپيوټر له انټرنيټ سره وصل دی.\"\n$upDevice: \"ستاسو وسيله چې د انټرنټ سره نښلي.\"\n$u"
  },
  {
    "path": "sass/_persian.sass",
    "chars": 2222,
    "preview": "@charset \"utf-8\"\n$upComputer: \"ارتباط کامپیوتر شما با اینترنت برقرار است.\"\n$upDevice: \"ارتباط دستگاه شما با اینترنت برقر"
  },
  {
    "path": "sass/_polish.sass",
    "chars": 2273,
    "preview": "@charset \"utf-8\"\n$upComputer: \"Twój komputer jest podłączony do internetu.\"\n$upDevice: \"Twoje urządzenie jest podłączone"
  },
  {
    "path": "sass/_portuguese-brazil.sass",
    "chars": 2264,
    "preview": "@charset \"utf-8\"\n$upComputer: \"Seu computador está conectado à internet.\"\n$upDevice: \"O dispositivo está conectado à int"
  },
  {
    "path": "sass/_spanish.sass",
    "chars": 2248,
    "preview": "@charset \"utf-8\"\n$upComputer: \"Tu computador está conectado a internet.\"\n$upDevice: \"Tu dispositivo está conectado a int"
  },
  {
    "path": "sass/_turkish.sass",
    "chars": 2541,
    "preview": "@charset \"utf-8\"\n$upComputer: \"Bilgisayarınız internete bağlı.\"\n$upDevice: \"Cihazınız internete bağlı.\"\n$upDeviceSmall: "
  },
  {
    "path": "sass/offline-language-arabic-indicator.sass",
    "chars": 199,
    "preview": ".offline-ui\r\n\r\n    &.offline-ui-up\r\n\r\n        .offline-ui-content:before\r\n            content: \"متصل.\"\r\n\r\n    &.offline-"
  },
  {
    "path": "sass/offline-language-arabic.sass",
    "chars": 51,
    "preview": "@import content\r\n@import arabic\r\n\r\n+offline-content"
  },
  {
    "path": "sass/offline-language-chinese-simplified-indicator.sass",
    "chars": 180,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"在线\"\n\n    &.offline-ui-down\n\n "
  },
  {
    "path": "sass/offline-language-chinese-simplified.sass",
    "chars": 61,
    "preview": "@import content\n@import chinese-simplified\n\n+offline-content\n"
  },
  {
    "path": "sass/offline-language-chinese-traditional-indicator.sass",
    "chars": 180,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"在線\"\n\n    &.offline-ui-down\n\n "
  },
  {
    "path": "sass/offline-language-chinese-traditional.sass",
    "chars": 62,
    "preview": "@import content\n@import chinese-traditional\n\n+offline-content\n"
  },
  {
    "path": "sass/offline-language-czech-indicator.sass",
    "chars": 189,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"Online\"\n\n    &.offline-ui-dow"
  },
  {
    "path": "sass/offline-language-czech.sass",
    "chars": 48,
    "preview": "@import content\n@import czech\n\n+offline-content\n"
  },
  {
    "path": "sass/offline-language-dutch-indicator.sass",
    "chars": 189,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"Online\"\n\n    &.offline-ui-dow"
  },
  {
    "path": "sass/offline-language-dutch.sass",
    "chars": 48,
    "preview": "@import content\n@import dutch\n\n+offline-content\n"
  },
  {
    "path": "sass/offline-language-english-indicator.sass",
    "chars": 188,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"Online\"\n\n    &.offline-ui-dow"
  },
  {
    "path": "sass/offline-language-english.sass",
    "chars": 49,
    "preview": "@import content\n@import english\n\n+offline-content"
  },
  {
    "path": "sass/offline-language-french-indicator.sass",
    "chars": 195,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"Connecté\"\n\n    &.offline-ui-d"
  },
  {
    "path": "sass/offline-language-french.sass",
    "chars": 48,
    "preview": "@import content\n@import french\n\n+offline-content"
  },
  {
    "path": "sass/offline-language-german-indicator.sass",
    "chars": 188,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"Online\"\n\n    &.offline-ui-dow"
  },
  {
    "path": "sass/offline-language-german.sass",
    "chars": 49,
    "preview": "@import content\n@import german\n\n\n+offline-content"
  },
  {
    "path": "sass/offline-language-italian-indicator.sass",
    "chars": 188,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"Online\"\n\n    &.offline-ui-dow"
  },
  {
    "path": "sass/offline-language-italian.sass",
    "chars": 50,
    "preview": "@import content\n@import italian\n\n+offline-content\n"
  },
  {
    "path": "sass/offline-language-pashto-indicator.sass",
    "chars": 188,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"Online\"\n\n    &.offline-ui-dow"
  },
  {
    "path": "sass/offline-language-pashto.sass",
    "chars": 49,
    "preview": "@import content\n@import pashto\n\n+offline-content\n"
  },
  {
    "path": "sass/offline-language-polish-indicator.sass",
    "chars": 195,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"Połączony\"\n\n    &.offline-ui-"
  },
  {
    "path": "sass/offline-language-polish.sass",
    "chars": 49,
    "preview": "@import content\n@import polish\n\n+offline-content\n"
  },
  {
    "path": "sass/offline-language-portuguese-brazil-indicator.sass",
    "chars": 197,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"Conectado\"\n\n    &.offline-ui-"
  },
  {
    "path": "sass/offline-language-portuguese-brazil.sass",
    "chars": 60,
    "preview": "@import content\n@import portuguese-brazil\n\n+offline-content\n"
  },
  {
    "path": "sass/offline-language-simplified-chinese-indicator.sass",
    "chars": 196,
    "preview": "@charset \"utf-8\"\n.offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"在线\"\n\n    &.o"
  },
  {
    "path": "sass/offline-language-spanish-indicator.sass",
    "chars": 194,
    "preview": ".offline-ui\n    &.offline-ui-up\n        .offline-ui-content:before\n            content: \"En línea\"\n    &.offline-ui-down"
  },
  {
    "path": "sass/offline-language-spanish.sass",
    "chars": 50,
    "preview": "@import content\n@import spanish\n\n+offline-content\n"
  },
  {
    "path": "sass/offline-language-turkish-indicator.sass",
    "chars": 195,
    "preview": ".offline-ui\n\n    &.offline-ui-up\n\n        .offline-ui-content:before\n            content: \"Çevrimiçi\"\n\n    &.offline-ui-"
  },
  {
    "path": "sass/offline-language-turkish.sass",
    "chars": 50,
    "preview": "@import content\n@import turkish\n\n+offline-content\n"
  },
  {
    "path": "sass/offline-theme-chrome-indicator.sass",
    "chars": 826,
    "preview": "@import compass/css3\n\n@import offline-theme-base-indicator\n\n$green: #80d580\n$red: #ec8787\n\n.offline-ui\n    +box-shadow(0"
  },
  {
    "path": "sass/offline-theme-chrome.sass",
    "chars": 2532,
    "preview": "@import compass/css3\n\n@import mixins\n@import keyframes\n\n@import offline-theme-base\n\n$green: #80d580\n$red: #ec8787\n\n+keyf"
  },
  {
    "path": "sass/offline-theme-dark-indicator.sass",
    "chars": 827,
    "preview": "@import compass/css3\n\n@import offline-theme-base-indicator\n\n$green: #80d580\n$red: #e24949\n\n.offline-ui\n    +box-shadow(0"
  },
  {
    "path": "sass/offline-theme-dark.sass",
    "chars": 2293,
    "preview": "@import compass/css3\n\n@import mixins\n@import keyframes\n\n@import offline-theme-base\n\n$green: #80d580\n$red: #e24949\n\n+keyf"
  },
  {
    "path": "sass/offline-theme-default-indicator.sass",
    "chars": 424,
    "preview": "@import compass/css3\n\n@import offline-theme-base-indicator\n\n$red: #ec8787\n$green: #d6e9c6\n\n$darkRed: #551313\n$darkGreen:"
  },
  {
    "path": "sass/offline-theme-default.sass",
    "chars": 1980,
    "preview": "@import compass/css3\n\n@import mixins\n@import keyframes\n\n@import offline-theme-base\n\n$red: #ec8787\n$green: #d6e9c6\n$yello"
  },
  {
    "path": "sass/offline-theme-hubspot.sass",
    "chars": 280,
    "preview": "@import compass/css3\n\n@import offline-theme-default\n\n.offline-ui\n    +border-radius(0 0 4px 4px)\n    +box-shadow(inset 0"
  },
  {
    "path": "sass/offline-theme-slide-indicator.sass",
    "chars": 430,
    "preview": "@import compass/css3\n\n@import offline-theme-base-indicator\n\n$red: #ec8787\n$green: #d6e9c6\n\n$darkRed: #551313\n$darkGreen:"
  },
  {
    "path": "sass/offline-theme-slide.sass",
    "chars": 1882,
    "preview": "@import compass/css3\n\n@import mixins\n@import keyframes\n\n@import offline-theme-base\n\n$red: #ec8787\n$green: #d6e9c6\n$yello"
  },
  {
    "path": "test/index.html",
    "chars": 929,
    "preview": "<head>\n<script src=\"../offline.min.js\"></script>\n\n<!--\nThemes:\n<link rel=\"stylesheet\" href=\"./themes/offline-theme-defau"
  },
  {
    "path": "test/snake.html",
    "chars": 977,
    "preview": "<head>\n<script src=\"../offline.min.js\"></script>\n<script src=\"../js/snake.js\"></script>\n\n<!--\nThemes:\n<link rel=\"stylesh"
  },
  {
    "path": "themes/offline-language-arabic-indicator.css",
    "chars": 301,
    "preview": "@charset \"UTF-8\";\n/* line 5, ../sass/offline-language-arabic-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-con"
  },
  {
    "path": "themes/offline-language-arabic.css",
    "chars": 4597,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \" إعادة الاتصال\""
  },
  {
    "path": "themes/offline-language-chinese-simplified-indicator.css",
    "chars": 317,
    "preview": "@charset \"UTF-8\";\n/* line 5, ../sass/offline-language-chinese-simplified-indicator.sass */\n.offline-ui.offline-ui-up .of"
  },
  {
    "path": "themes/offline-language-chinese-simplified.css",
    "chars": 4312,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"重连\";\n}\n/* line "
  },
  {
    "path": "themes/offline-language-chinese-traditional-indicator.css",
    "chars": 319,
    "preview": "@charset \"UTF-8\";\n/* line 5, ../sass/offline-language-chinese-traditional-indicator.sass */\n.offline-ui.offline-ui-up .o"
  },
  {
    "path": "themes/offline-language-chinese-traditional.css",
    "chars": 4306,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"重連\";\n}\n/* line "
  },
  {
    "path": "themes/offline-language-czech-indicator.css",
    "chars": 159,
    "preview": ".offline-ui.offline-ui-up .offline-ui-content:before {\n  content: \"Online\"; }\n.offline-ui.offline-ui-down .offline-ui-co"
  },
  {
    "path": "themes/offline-language-czech.css",
    "chars": 4740,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"Znovu připojit\""
  },
  {
    "path": "themes/offline-language-dutch-indicator.css",
    "chars": 280,
    "preview": "/* line 5, ../sass/offline-language-dutch-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-content:before {\n  con"
  },
  {
    "path": "themes/offline-language-dutch.css",
    "chars": 4793,
    "preview": "/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"Opnieuw\";\n}\n/* line 11, ../sass/_"
  },
  {
    "path": "themes/offline-language-english-indicator.css",
    "chars": 284,
    "preview": "/* line 5, ../sass/offline-language-english-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-content:before {\n  c"
  },
  {
    "path": "themes/offline-language-english.css",
    "chars": 4701,
    "preview": "/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"Reconnect\";\n}\n/* line 11, ../sass"
  },
  {
    "path": "themes/offline-language-french-indicator.css",
    "chars": 307,
    "preview": "@charset \"UTF-8\";\n/* line 5, ../sass/offline-language-french-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-con"
  },
  {
    "path": "themes/offline-language-french.css",
    "chars": 4765,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"Reconnecter\";\n}"
  },
  {
    "path": "themes/offline-language-german-indicator.css",
    "chars": 282,
    "preview": "/* line 5, ../sass/offline-language-german-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-content:before {\n  co"
  },
  {
    "path": "themes/offline-language-german.css",
    "chars": 4741,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"Verbinden\";\n}\n/"
  },
  {
    "path": "themes/offline-language-hebrew-indicator.css",
    "chars": 281,
    "preview": "/* line 5, ../sass/offline-language-english-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-content:before {\n  c"
  },
  {
    "path": "themes/offline-language-hebrew.css",
    "chars": 4609,
    "preview": "/* line 6, ../sass/_content.sass */\n\n.offline-ui .offline-ui-retry:before {\n    content: \"מתחבר\";\n}\n/* line 11, ../sass/"
  },
  {
    "path": "themes/offline-language-italian-indicator.css",
    "chars": 284,
    "preview": "/* line 5, ../sass/offline-language-italian-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-content:before {\n  c"
  },
  {
    "path": "themes/offline-language-italian.css",
    "chars": 4756,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"Riconnetti\";\n}\n"
  },
  {
    "path": "themes/offline-language-pashto-indicator.css",
    "chars": 282,
    "preview": "/* line 5, ../sass/offline-language-pashto-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-content:before {\n  co"
  },
  {
    "path": "themes/offline-language-pashto.css",
    "chars": 4736,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"بيا ونښلوي\";\n}\n"
  },
  {
    "path": "themes/offline-language-persian-indicator.css",
    "chars": 282,
    "preview": "* line 5, ../sass/offline-language-english-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-content:before {\n  co"
  },
  {
    "path": "themes/offline-language-persian.css",
    "chars": 4644,
    "preview": "/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"اتصال مجدد\";\n}\n/* line 11, ../sas"
  },
  {
    "path": "themes/offline-language-polish-indicator.css",
    "chars": 306,
    "preview": "@charset \"UTF-8\";\n/* line 5, ../sass/offline-language-polish-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-con"
  },
  {
    "path": "themes/offline-language-polish.css",
    "chars": 4728,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"Połącz teraz\";\n"
  },
  {
    "path": "themes/offline-language-portuguese-brazil-indicator.css",
    "chars": 312,
    "preview": "/* line 5, ../sass/offline-language-portuguese-brazil-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-content:be"
  },
  {
    "path": "themes/offline-language-portuguese-brazil.css",
    "chars": 4739,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"Reconectar\";\n}\n"
  },
  {
    "path": "themes/offline-language-simplified-chinese-indicator.css",
    "chars": 315,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/offline-language-simplified-chinese-indicator.sass */\n.offline-ui.offline-ui-up .of"
  },
  {
    "path": "themes/offline-language-spanish-indicator.css",
    "chars": 310,
    "preview": "@charset \"UTF-8\";\n/* line 3, ../sass/offline-language-spanish-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-co"
  },
  {
    "path": "themes/offline-language-spanish.css",
    "chars": 4728,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"Reconectar\";\n}\n"
  },
  {
    "path": "themes/offline-language-turkish-indicator.css",
    "chars": 308,
    "preview": "@charset \"UTF-8\";\n/* line 5, ../sass/offline-language-turkish-indicator.sass */\n.offline-ui.offline-ui-up .offline-ui-co"
  },
  {
    "path": "themes/offline-language-turkish.css",
    "chars": 4990,
    "preview": "@charset \"UTF-8\";\n/* line 6, ../sass/_content.sass */\n.offline-ui .offline-ui-retry:before {\n  content: \"Yeniden bağlan\""
  },
  {
    "path": "themes/offline-theme-chrome-indicator.css",
    "chars": 2062,
    "preview": "/* line 3, ../sass/_offline-theme-base-indicator.sass */\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:aft"
  },
  {
    "path": "themes/offline-theme-chrome.css",
    "chars": 16248,
    "preview": "/* line 4, ../sass/_offline-theme-base.sass */\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:after, .offli"
  },
  {
    "path": "themes/offline-theme-dark-indicator.css",
    "chars": 2055,
    "preview": "/* line 3, ../sass/_offline-theme-base-indicator.sass */\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:aft"
  },
  {
    "path": "themes/offline-theme-dark.css",
    "chars": 15505,
    "preview": "/* line 4, ../sass/_offline-theme-base.sass */\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:after, .offli"
  },
  {
    "path": "themes/offline-theme-default-indicator.css",
    "chars": 1336,
    "preview": "/* line 3, ../sass/_offline-theme-base-indicator.sass */\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:aft"
  },
  {
    "path": "themes/offline-theme-default.css",
    "chars": 9330,
    "preview": "/* line 4, ../sass/_offline-theme-base.sass */\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:after, .offli"
  },
  {
    "path": "themes/offline-theme-hubspot.css",
    "chars": 9922,
    "preview": "/* line 4, ../sass/_offline-theme-base.sass */\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:after, .offli"
  },
  {
    "path": "themes/offline-theme-slide-indicator.css",
    "chars": 1368,
    "preview": "/* line 3, ../sass/_offline-theme-base-indicator.sass */\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:aft"
  },
  {
    "path": "themes/offline-theme-slide.css",
    "chars": 14492,
    "preview": "/* line 4, ../sass/_offline-theme-base.sass */\n.offline-ui, .offline-ui *, .offline-ui:before, .offline-ui:after, .offli"
  }
]

// ... and 3 more files (download for full content)

About this extraction

This page contains the full source code of the HubSpot/offline GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 136 files (289.5 KB), approximately 87.2k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!