diff --git a/atom.xml b/atom.xml index c11774d74d..6981282c0c 100644 --- a/atom.xml +++ b/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Home Assistant]]> - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 https://home-assistant.io/ @@ -13,6 +13,178 @@ Octopress + + <![CDATA[0.7: Better UI and improved distribution]]> + + 2015-08-31T14:12:00-07:00 + https://home-assistant.io/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution + As Home Assistant is gaining more and more users we started to feel the pain from not having a +proper release mechanism. We had no version numbering and required users to checkout the source +using Git to get started. On top of that, as the number of devices that we support keeps raising, so +did the number of dependencies that are used. That’s why we decided to change the way we roll. From +now on:

+ +
    +
  • Each release will have a version number, starting with version 0.7. This was chosen because it +shows that we have been around for some time but are not considering ourselves to be fully +stable.
  • +
  • Each release will be pushed to PyPi. This will be the only supported method of distribution.
  • +
  • Home Assistant is available after installation as a command-line utility hass.
  • +
  • The default configuration location has been moved from config in the current working directory +to ~/.homeassistant (%APPDATA%/.homeassistant on Windows).
  • +
  • Requirements for components and platforms are no longer installed into the current Python +environment (being virtual or not) but will be installed in <config-dir>/lib.
  • +
+ + +

A huge shout out to Ryan Kraus for making this all possible. Please +make sure you read the full blog post for details on how to migrate your existing setup.

+ +

And while Ryan was fixing distribution, I have been hard at work in giving Home Assistant a face +lift. We already looked pretty good but lacked proper form of organization for users with many +devices. The new UI moves away from a card per entity and has cards per group and domain instead. +The demo has been updated so give it a spin.

+ +

+ + + + Screenshots of the new UI +

+ + + + + + + +

Migration to version 0.7

+ +

For this example, let’s say we have an old Home Assistant installation in +/home/paulus/home-assistant.

+ +

If you want to migrate your existing configuration to be used as the default configuration:

+ +
1
+
cp -r /home/paulus/home-assistant ~/.homeassistant
+
+ + +

It If you want to have the configuration in a different location, for example +/home/paulus/home-assistant-config, you will have to point Home Assistant at this configuration +folder when launching:

+ +
1
+
hass --config /home/paulus/home-assistant-config
+
+ + +

New platforms

+ +

And last, but not least: new platforms!

+ +

MQTT Sensors and Switches
+ +@sfam has blessed us with two more MQTT platforms to extend our +integration with MQTTT: sensor and switch. Both platforms require the +MQTT component to be connected to a broker.

+ +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+
# Example configuration.yml entr
+sensor:
+  platform: mqtt
+  name: "MQTT Sensor"
+  state_topic: "home/bedroom/temperature"
+  unit_of_measurement: "ºC"
+
+switch:
+  platform: mqtt
+  name: "Bedroom Switch"
+  state_topic: "home/bedroom/switch1"
+  command_topic: "home/bedroom/switch1/set"
+  payload_on: "ON"
+  payload_off: "OFF"
+  optimistic: false
+
+ + +

Actiontec MI424WR Verizon FIOS Wireless router
+ +Nolan has contributed support for Actiontec wireless routers.

+ +
1
+2
+3
+4
+5
+6
+
# Example configuration.yaml entry
+device_tracker:
+  platform: actiontec
+  host: YOUR_ROUTER_IP
+  username: YOUR_ADMIN_USERNAME
+  password: YOUR_ADMIN_PASSWORD
+
+ + +

DHT temperature and humidty sensors
+@MakeMeASandwich has contributed support for DHT temperature +and humidity sensors. It allows you to get the current temperature and humidity from a DHT11, DHT22, +or AM2302 device.

+ +
1
+2
+3
+4
+5
+6
+7
+8
+
# Example configuration.yaml entry
+sensor:
+  platform: dht
+  sensor: DHT22
+  pin: 23
+  monitored_conditions:
+    - temperature
+    - humidity
+
+ + +

Aruba device tracker
+Michael Arnauts has contributed support for Aruba wireless routers for presence detection.

+ +
1
+2
+3
+4
+5
+6
+
# Example configuration.yaml entry
+device_tracker:
+  platform: aruba
+  host: YOUR_ACCESS_POINT_IP
+  username: YOUR_ADMIN_USERNAME
+  password: YOUR_ADMIN_PASSWORD
+
+ +]]>
+
+ <![CDATA[Laundry Automation: insight and notifications]]> @@ -1790,13 +1962,4 @@ This article will try to explain how they all relate.

]]>
- - <![CDATA[Website launched!]]> - - 2014-12-18T23:24:45-08:00 - https://home-assistant.io/blog/2014/12/18/website-launched - I finally took the time to setup a simple website to help people getting started with Home Assistant. The process was super smooth thanks to the great tools Jekyll and Octopress and the great services GitHub Pages and CloudFlare.

-]]>
-
- diff --git a/blog/2014/12/18/website-launched/index.html b/blog/2014/12/18/website-launched/index.html index bdd32e9076..c463dd8e68 100644 --- a/blog/2014/12/18/website-launched/index.html +++ b/blog/2014/12/18/website-launched/index.html @@ -212,6 +212,12 @@ diff --git a/blog/2014/12/26/home-control-home-automation-and-the-smart-home/index.html b/blog/2014/12/26/home-control-home-automation-and-the-smart-home/index.html index b639c93f68..ec0942fc62 100644 --- a/blog/2014/12/26/home-control-home-automation-and-the-smart-home/index.html +++ b/blog/2014/12/26/home-control-home-automation-and-the-smart-home/index.html @@ -274,6 +274,12 @@ This article will try to explain how they all relate.

diff --git a/blog/2015/01/04/hey-pushbullet-nice-talking-to-you/index.html b/blog/2015/01/04/hey-pushbullet-nice-talking-to-you/index.html index f40a7e88fb..658bb93c28 100644 --- a/blog/2015/01/04/hey-pushbullet-nice-talking-to-you/index.html +++ b/blog/2015/01/04/hey-pushbullet-nice-talking-to-you/index.html @@ -256,6 +256,12 @@ diff --git a/blog/2015/01/11/bootstrapping-your-setup-with-discovery/index.html b/blog/2015/01/11/bootstrapping-your-setup-with-discovery/index.html index c12bdb663b..3bd3ed517b 100644 --- a/blog/2015/01/11/bootstrapping-your-setup-with-discovery/index.html +++ b/blog/2015/01/11/bootstrapping-your-setup-with-discovery/index.html @@ -224,6 +224,12 @@ diff --git a/blog/2015/01/13/nest-in-da-house/index.html b/blog/2015/01/13/nest-in-da-house/index.html index 92d65e1195..514d96e2a4 100644 --- a/blog/2015/01/13/nest-in-da-house/index.html +++ b/blog/2015/01/13/nest-in-da-house/index.html @@ -231,6 +231,12 @@ diff --git a/blog/2015/01/24/release-notes/index.html b/blog/2015/01/24/release-notes/index.html index 2df34ef8ec..8a9ea12fc4 100644 --- a/blog/2015/01/24/release-notes/index.html +++ b/blog/2015/01/24/release-notes/index.html @@ -236,6 +236,12 @@ Home Assistant now supports --open-ui and --demo-mode diff --git a/blog/2015/02/08/looking-at-the-past/index.html b/blog/2015/02/08/looking-at-the-past/index.html index 0ac6468119..c813c73dcc 100644 --- a/blog/2015/02/08/looking-at-the-past/index.html +++ b/blog/2015/02/08/looking-at-the-past/index.html @@ -254,6 +254,12 @@ Events are saved in a local database. Google Graphs is used to draw the graph. D diff --git a/blog/2015/02/24/streaming-updates/index.html b/blog/2015/02/24/streaming-updates/index.html index 93973228e5..84464025da 100644 --- a/blog/2015/02/24/streaming-updates/index.html +++ b/blog/2015/02/24/streaming-updates/index.html @@ -232,6 +232,12 @@ diff --git a/blog/2015/03/01/home-assistant-migrating-to-yaml/index.html b/blog/2015/03/01/home-assistant-migrating-to-yaml/index.html index 50a634f440..695a11c023 100644 --- a/blog/2015/03/01/home-assistant-migrating-to-yaml/index.html +++ b/blog/2015/03/01/home-assistant-migrating-to-yaml/index.html @@ -219,6 +219,12 @@ YAML allows the use of lists, which should make the configuration file a bit mor diff --git a/blog/2015/03/08/new-logo/index.html b/blog/2015/03/08/new-logo/index.html index 4fe2bca588..2895069d51 100644 --- a/blog/2015/03/08/new-logo/index.html +++ b/blog/2015/03/08/new-logo/index.html @@ -220,6 +220,12 @@ The old logo, the new detailed logo and the new simple logo. diff --git a/blog/2015/03/11/release-notes/index.html b/blog/2015/03/11/release-notes/index.html index d1d1abeb0d..a2b5ee6deb 100644 --- a/blog/2015/03/11/release-notes/index.html +++ b/blog/2015/03/11/release-notes/index.html @@ -266,6 +266,12 @@ An initial version of voice control for Home Assistant has landed. The current i diff --git a/blog/2015/03/22/release-notes/index.html b/blog/2015/03/22/release-notes/index.html index 8e7d19519e..5aa65e0584 100644 --- a/blog/2015/03/22/release-notes/index.html +++ b/blog/2015/03/22/release-notes/index.html @@ -339,6 +339,12 @@ James Cole has also contributed support for the diff --git a/blog/2015/04/25/release-notes/index.html b/blog/2015/04/25/release-notes/index.html index ab72571fd2..67018db8b6 100644 --- a/blog/2015/04/25/release-notes/index.html +++ b/blog/2015/04/25/release-notes/index.html @@ -355,6 +355,12 @@ James has also contributed support for integrating Transmission into Home Assist diff --git a/blog/2015/05/09/utc-time-zone-awareness/index.html b/blog/2015/05/09/utc-time-zone-awareness/index.html index 073baa6de6..c4888699d4 100644 --- a/blog/2015/05/09/utc-time-zone-awareness/index.html +++ b/blog/2015/05/09/utc-time-zone-awareness/index.html @@ -244,6 +244,12 @@ diff --git a/blog/2015/05/14/release-notes/index.html b/blog/2015/05/14/release-notes/index.html index 7dbb930170..f601989676 100644 --- a/blog/2015/05/14/release-notes/index.html +++ b/blog/2015/05/14/release-notes/index.html @@ -381,6 +381,12 @@ Before diving into the newly supported devices and services, I want to highlight diff --git a/blog/2015/06/10/release-notes/index.html b/blog/2015/06/10/release-notes/index.html index 8afaaeead6..5212f987dd 100644 --- a/blog/2015/06/10/release-notes/index.html +++ b/blog/2015/06/10/release-notes/index.html @@ -460,6 +460,12 @@ This switch platform allows you to control your motion detection setting on your diff --git a/blog/2015/07/11/ip-cameras-arduino-kodi-efergy-support/index.html b/blog/2015/07/11/ip-cameras-arduino-kodi-efergy-support/index.html index 5469d5246a..b3e107ecef 100644 --- a/blog/2015/07/11/ip-cameras-arduino-kodi-efergy-support/index.html +++ b/blog/2015/07/11/ip-cameras-arduino-kodi-efergy-support/index.html @@ -404,6 +404,12 @@ Fabian has added support for Forecast.io to g diff --git a/blog/2015/08/09/mqtt-raspberry-pi-squeezebox-asuswrt-support/index.html b/blog/2015/08/09/mqtt-raspberry-pi-squeezebox-asuswrt-support/index.html index afc6da8050..a57d2f4ce4 100644 --- a/blog/2015/08/09/mqtt-raspberry-pi-squeezebox-asuswrt-support/index.html +++ b/blog/2015/08/09/mqtt-raspberry-pi-squeezebox-asuswrt-support/index.html @@ -367,6 +367,12 @@ Support for Temper temperature sensors has been contributed by +
  • + 0.7: Better UI and improved distribution +
  • + + +
  • Laundry Automation: insight and notifications
  • @@ -386,12 +392,6 @@ Support for Temper temperature sensors has been contributed by - Release notes for June 10, 2015 - - - diff --git a/blog/2015/08/17/verisure-and-modern-tp-link-router-support/index.html b/blog/2015/08/17/verisure-and-modern-tp-link-router-support/index.html index 419fe003f9..9be50fc7b8 100644 --- a/blog/2015/08/17/verisure-and-modern-tp-link-router-support/index.html +++ b/blog/2015/08/17/verisure-and-modern-tp-link-router-support/index.html @@ -245,6 +245,12 @@ Home Assistant support to integrate your Ver diff --git a/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/index.html b/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/index.html index be707393b3..ad97c1636f 100644 --- a/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/index.html +++ b/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/index.html @@ -429,6 +429,12 @@ diff --git a/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution/index.html b/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution/index.html new file mode 100644 index 0000000000..e3baa78fac --- /dev/null +++ b/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution/index.html @@ -0,0 +1,470 @@ + + + + + + + + + + + + 0.7: Better UI and improved distribution - Home Assistant + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    +
    + +
    + + +
    +
    + +

    0.7: Better UI and improved distribution

    + + + +
    + + + + + + + + + + + + + + + + + + + four minutes reading time + + + + + + + + + Comments + +
    + +
    + + + + +

    As Home Assistant is gaining more and more users we started to feel the pain from not having a +proper release mechanism. We had no version numbering and required users to checkout the source +using Git to get started. On top of that, as the number of devices that we support keeps raising, so +did the number of dependencies that are used. That’s why we decided to change the way we roll. From +now on:

    + +
      +
    • Each release will have a version number, starting with version 0.7. This was chosen because it +shows that we have been around for some time but are not considering ourselves to be fully +stable.
    • +
    • Each release will be pushed to PyPi. This will be the only supported method of distribution.
    • +
    • Home Assistant is available after installation as a command-line utility hass.
    • +
    • The default configuration location has been moved from config in the current working directory +to ~/.homeassistant (%APPDATA%/.homeassistant on Windows).
    • +
    • Requirements for components and platforms are no longer installed into the current Python +environment (being virtual or not) but will be installed in <config-dir>/lib.
    • +
    + + +

    A huge shout out to Ryan Kraus for making this all possible. Please +make sure you read the full blog post for details on how to migrate your existing setup.

    + +

    And while Ryan was fixing distribution, I have been hard at work in giving Home Assistant a face +lift. We already looked pretty good but lacked proper form of organization for users with many +devices. The new UI moves away from a card per entity and has cards per group and domain instead. +The demo has been updated so give it a spin.

    + +

    + + + + Screenshots of the new UI +

    + + + + + + + +

    Migration to version 0.7

    + +

    For this example, let’s say we have an old Home Assistant installation in +/home/paulus/home-assistant.

    + +

    If you want to migrate your existing configuration to be used as the default configuration:

    + +
    1
    +
    cp -r /home/paulus/home-assistant ~/.homeassistant
    +
    + + +

    It If you want to have the configuration in a different location, for example +/home/paulus/home-assistant-config, you will have to point Home Assistant at this configuration +folder when launching:

    + +
    1
    +
    hass --config /home/paulus/home-assistant-config
    +
    + + +

    New platforms

    + +

    And last, but not least: new platforms!

    + +

    MQTT Sensors and Switches
    + +@sfam has blessed us with two more MQTT platforms to extend our +integration with MQTTT: sensor and switch. Both platforms require the +MQTT component to be connected to a broker.

    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    +10
    +11
    +12
    +13
    +14
    +15
    +
    # Example configuration.yml entr
    +sensor:
    +  platform: mqtt
    +  name: "MQTT Sensor"
    +  state_topic: "home/bedroom/temperature"
    +  unit_of_measurement: "ºC"
    +
    +switch:
    +  platform: mqtt
    +  name: "Bedroom Switch"
    +  state_topic: "home/bedroom/switch1"
    +  command_topic: "home/bedroom/switch1/set"
    +  payload_on: "ON"
    +  payload_off: "OFF"
    +  optimistic: false
    +
    + + +

    Actiontec MI424WR Verizon FIOS Wireless router
    + +Nolan has contributed support for Actiontec wireless routers.

    + +
    1
    +2
    +3
    +4
    +5
    +6
    +
    # Example configuration.yaml entry
    +device_tracker:
    +  platform: actiontec
    +  host: YOUR_ROUTER_IP
    +  username: YOUR_ADMIN_USERNAME
    +  password: YOUR_ADMIN_PASSWORD
    +
    + + +

    DHT temperature and humidty sensors
    +@MakeMeASandwich has contributed support for DHT temperature +and humidity sensors. It allows you to get the current temperature and humidity from a DHT11, DHT22, +or AM2302 device.

    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +
    # Example configuration.yaml entry
    +sensor:
    +  platform: dht
    +  sensor: DHT22
    +  pin: 23
    +  monitored_conditions:
    +    - temperature
    +    - humidity
    +
    + + +

    Aruba device tracker
    +Michael Arnauts has contributed support for Aruba wireless routers for presence detection.

    + +
    1
    +2
    +3
    +4
    +5
    +6
    +
    # Example configuration.yaml entry
    +device_tracker:
    +  platform: aruba
    +  host: YOUR_ACCESS_POINT_IP
    +  username: YOUR_ADMIN_USERNAME
    +  password: YOUR_ADMIN_PASSWORD
    +
    + + + +
    + + +
    +

    Comments

    +
    +
    +
    + + +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/blog/archives/index.html b/blog/archives/index.html index 03d56c8212..390a29e2de 100644 --- a/blog/archives/index.html +++ b/blog/archives/index.html @@ -22,7 +22,7 @@ - + @@ -114,6 +114,43 @@
    +
    + +
    + +
    +
    +

    0.7: Better UI and improved distribution

    + + + +
    +
    + +
    +
    + + + +
    + +
    @@ -914,6 +951,12 @@ diff --git a/blog/categories/architecture/atom.xml b/blog/categories/architecture/atom.xml index d1a8ab52c5..51ef134019 100644 --- a/blog/categories/architecture/atom.xml +++ b/blog/categories/architecture/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: architecture | Home Assistant]]> - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 https://home-assistant.io/ diff --git a/blog/categories/architecture/index.html b/blog/categories/architecture/index.html index 58e177ce69..95dcab8ac5 100644 --- a/blog/categories/architecture/index.html +++ b/blog/categories/architecture/index.html @@ -206,6 +206,12 @@ diff --git a/blog/categories/branding/atom.xml b/blog/categories/branding/atom.xml index c83ad1a739..131b6e6b4c 100644 --- a/blog/categories/branding/atom.xml +++ b/blog/categories/branding/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: branding | Home Assistant]]> - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 https://home-assistant.io/ diff --git a/blog/categories/branding/index.html b/blog/categories/branding/index.html index b0f770579f..6613750abd 100644 --- a/blog/categories/branding/index.html +++ b/blog/categories/branding/index.html @@ -206,6 +206,12 @@ diff --git a/blog/categories/component/atom.xml b/blog/categories/component/atom.xml index 5cf78910a0..1fa8dbdce2 100644 --- a/blog/categories/component/atom.xml +++ b/blog/categories/component/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: component | Home Assistant]]> - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 https://home-assistant.io/ diff --git a/blog/categories/component/index.html b/blog/categories/component/index.html index a331d8ad26..ef8687a1e7 100644 --- a/blog/categories/component/index.html +++ b/blog/categories/component/index.html @@ -319,6 +319,12 @@ diff --git a/blog/categories/core/atom.xml b/blog/categories/core/atom.xml index 02a1bfa378..76867e97b2 100644 --- a/blog/categories/core/atom.xml +++ b/blog/categories/core/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: core | Home Assistant]]> - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 https://home-assistant.io/ diff --git a/blog/categories/core/index.html b/blog/categories/core/index.html index 279104af3c..ab48f9a05d 100644 --- a/blog/categories/core/index.html +++ b/blog/categories/core/index.html @@ -243,6 +243,12 @@ diff --git a/blog/categories/frontend/atom.xml b/blog/categories/frontend/atom.xml index 5a2bda276c..56bc7994ff 100644 --- a/blog/categories/frontend/atom.xml +++ b/blog/categories/frontend/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: frontend | Home Assistant]]> - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 https://home-assistant.io/ diff --git a/blog/categories/frontend/index.html b/blog/categories/frontend/index.html index 082ca8366b..a0aae00690 100644 --- a/blog/categories/frontend/index.html +++ b/blog/categories/frontend/index.html @@ -245,6 +245,12 @@ diff --git a/blog/categories/release-notes/atom.xml b/blog/categories/release-notes/atom.xml index f1cb39ffa1..bb7d50576d 100644 --- a/blog/categories/release-notes/atom.xml +++ b/blog/categories/release-notes/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: release-notes | Home Assistant]]> - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 https://home-assistant.io/ diff --git a/blog/categories/release-notes/index.html b/blog/categories/release-notes/index.html index f9008da91e..6c525c8d25 100644 --- a/blog/categories/release-notes/index.html +++ b/blog/categories/release-notes/index.html @@ -502,6 +502,12 @@ diff --git a/blog/categories/user-stories/atom.xml b/blog/categories/user-stories/atom.xml index 15deda7b7f..b5a7622b80 100644 --- a/blog/categories/user-stories/atom.xml +++ b/blog/categories/user-stories/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: user-stories | Home Assistant]]> - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 https://home-assistant.io/ @@ -13,6 +13,135 @@ Octopress + + <![CDATA[0.7: Better UI and improved distribution]]> + + 2015-08-31T14:12:00-07:00 + https://home-assistant.io/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution + As Home Assistant is gaining more and more users we started to feel the pain from not having a +proper release mechanism. We had no version numbering and required users to checkout the source +using Git to get started. On top of that, as the number of devices that we support keeps raising, so +did the number of dependencies that are used. That’s why we decided to change the way we roll. From +now on:

    + +
      +
    • Each release will have a version number, starting with version 0.7. This was chosen because it +shows that we have been around for some time but are not considering ourselves to be fully +stable.
    • +
    • Each release will be pushed to PyPi. This will be the only supported method of distribution.
    • +
    • Home Assistant is available after installation as a command-line utility hass.
    • +
    • The default configuration location has been moved from config in the current working directory +to ~/.homeassistant (%APPDATA%/.homeassistant on Windows).
    • +
    • Requirements for components and platforms are no longer installed into the current Python +environment (being virtual or not) but will be installed in <config-dir>/lib.
    • +
    + + +

    A huge shout out to Ryan Kraus for making this all possible. Please +make sure you read the full blog post for details on how to migrate your existing setup.

    + +

    And while Ryan was fixing distribution, I have been hard at work in giving Home Assistant a face +lift. We already looked pretty good but lacked proper form of organization for users with many +devices. The new UI moves away from a card per entity and has cards per group and domain instead. +The demo has been updated so give it a spin.

    + +

    + + + + Screenshots of the new UI +

    + + + + + + + +

    Migration to version 0.7

    + +

    For this example, let’s say we have an old Home Assistant installation in +/home/paulus/home-assistant.

    + +

    If you want to migrate your existing configuration to be used as the default configuration:

    + +
    cp -r /home/paulus/home-assistant ~/.homeassistant
    +
    + +

    It If you want to have the configuration in a different location, for example +/home/paulus/home-assistant-config, you will have to point Home Assistant at this configuration +folder when launching:

    + +
    hass --config /home/paulus/home-assistant-config
    +
    + +

    New platforms

    + +

    And last, but not least: new platforms!

    + +

    MQTT Sensors and Switches
    + +@sfam has blessed us with two more MQTT platforms to extend our +integration with MQTTT: sensor and switch. Both platforms require the +MQTT component to be connected to a broker.

    + +
    # Example configuration.yml entr
    +sensor:
    +  platform: mqtt
    +  name: "MQTT Sensor"
    +  state_topic: "home/bedroom/temperature"
    +  unit_of_measurement: "ºC"
    +
    +switch:
    +  platform: mqtt
    +  name: "Bedroom Switch"
    +  state_topic: "home/bedroom/switch1"
    +  command_topic: "home/bedroom/switch1/set"
    +  payload_on: "ON"
    +  payload_off: "OFF"
    +  optimistic: false
    +
    + +

    Actiontec MI424WR Verizon FIOS Wireless router
    + +Nolan has contributed support for Actiontec wireless routers.

    + +
    # Example configuration.yaml entry
    +device_tracker:
    +  platform: actiontec
    +  host: YOUR_ROUTER_IP
    +  username: YOUR_ADMIN_USERNAME
    +  password: YOUR_ADMIN_PASSWORD
    +
    + +

    DHT temperature and humidty sensors
    +@MakeMeASandwich has contributed support for DHT temperature +and humidity sensors. It allows you to get the current temperature and humidity from a DHT11, DHT22, +or AM2302 device.

    + +
    # Example configuration.yaml entry
    +sensor:
    +  platform: dht
    +  sensor: DHT22
    +  pin: 23
    +  monitored_conditions:
    +    - temperature
    +    - humidity
    +
    + +

    Aruba device tracker
    +Michael Arnauts has contributed support for Aruba wireless routers for presence detection.

    + +
    # Example configuration.yaml entry
    +device_tracker:
    +  platform: aruba
    +  host: YOUR_ACCESS_POINT_IP
    +  username: YOUR_ADMIN_USERNAME
    +  password: YOUR_ADMIN_PASSWORD
    +
    +]]>
    +
    + <![CDATA[Laundry Automation: insight and notifications]]> diff --git a/blog/categories/user-stories/index.html b/blog/categories/user-stories/index.html index bb2b63425f..ee0c6fe77f 100644 --- a/blog/categories/user-stories/index.html +++ b/blog/categories/user-stories/index.html @@ -114,6 +114,43 @@ + + + +
    + +
    @@ -206,6 +243,12 @@ diff --git a/blog/categories/website/atom.xml b/blog/categories/website/atom.xml index fccb2e01a1..bee64dc009 100644 --- a/blog/categories/website/atom.xml +++ b/blog/categories/website/atom.xml @@ -4,7 +4,7 @@ <![CDATA[Category: website | Home Assistant]]> - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 https://home-assistant.io/ diff --git a/blog/categories/website/index.html b/blog/categories/website/index.html index e38fbcf4f3..bad5a7733a 100644 --- a/blog/categories/website/index.html +++ b/blog/categories/website/index.html @@ -206,6 +206,12 @@ diff --git a/blog/index.html b/blog/index.html index 37a3321a22..c655337225 100644 --- a/blog/index.html +++ b/blog/index.html @@ -22,7 +22,7 @@ - + @@ -96,6 +96,106 @@ +
    +
    + +

    + 0.7: Better UI and improved distribution +

    + + + +
    + + + + + + + + + + + + + + + + + + + four minutes reading time + + + + + + + + + Comments + +
    + +
    + + + + +
    +

    As Home Assistant is gaining more and more users we started to feel the pain from not having a +proper release mechanism. We had no version numbering and required users to checkout the source +using Git to get started. On top of that, as the number of devices that we support keeps raising, so +did the number of dependencies that are used. That’s why we decided to change the way we roll. From +now on:

    + +
      +
    • Each release will have a version number, starting with version 0.7. This was chosen because it +shows that we have been around for some time but are not considering ourselves to be fully +stable.
    • +
    • Each release will be pushed to PyPi. This will be the only supported method of distribution.
    • +
    • Home Assistant is available after installation as a command-line utility hass.
    • +
    • The default configuration location has been moved from config in the current working directory +to ~/.homeassistant (%APPDATA%/.homeassistant on Windows).
    • +
    • Requirements for components and platforms are no longer installed into the current Python +environment (being virtual or not) but will be installed in <config-dir>/lib.
    • +
    + + +

    A huge shout out to Ryan Kraus for making this all possible. Please +make sure you read the full blog post for details on how to migrate your existing setup.

    + +

    And while Ryan was fixing distribution, I have been hard at work in giving Home Assistant a face +lift. We already looked pretty good but lacked proper form of organization for users with many +devices. The new UI moves away from a card per entity and has cards per group and domain instead. +The demo has been updated so give it a spin.

    + +

    + + + + Screenshots of the new UI +

    + + + + + + Read on → +
    + +
    +
    + +
    @@ -920,121 +1020,6 @@ Andythigpen has contributed a script component. This allows users to create a se

    - -
    -
    - -

    - Release notes for March 11, 2015 -

    - - - -
    - - - - - - - - - - - - - - - - - - - two minutes reading time - - - - - - - - - Comments - -
    - -
    - - - - -

    It has only been a little over a week since Theodor introduced YAML support for Home Assistant but so much has already happened that it is time for a summary of recent changes. Before mentioning the highlights I want to thank andythigpen, jamespcole and theolind for numerous bug fixes, enhancements and new contributions. Thanks!

    - -

    Monitor local resources.
    -Theodor has contributed a new sensor platform to allow you to monitor disk usage, memory usage, CPU usage and running processes. This platform has superseded the process component which is now considered deprecated.

    - -
    1
    -2
    -3
    -4
    -5
    -6
    -7
    -8
    -9
    -
    # Example configuration.yaml entry
    -sensor:
    -  - platform: systemmonitor
    -    resources:
    -      - type: disk_use_percent
    -        arg: /home
    -      - type: memory_free
    -      - type: process
    -        arg: kodi
    -
    - - -

    Experimental Z-Wave support
    -There is now experimental support for connecting Z-Wave networks using a Z-Wave USB stick. Right now it only integrates Z-Wave sensors into Home Assistant. Our goal is to get this tested by more people before adding support for other Z-Wave devices.

    - -

    The new component is built on top of python-openzwave. This package is currently not distributed on PyPi so we’ve added a script scripts/build_python_openzwave to install it on your machine. Alternatively you can use the Docker image which is ready to go.

    - -

    The development was done using an AEON Z-Wave USB stick and an AEON Z-Wave MultiSensor.

    - -
    1
    -2
    -3
    -
    # Example configuration.yaml entry
    -zwave:
    -  usb_path: /dev/ttyUSB0
    -
    - - -

    Voice control
    -An initial version of voice control for Home Assistant has landed. The current implementation consists of two parts.

    - -

    The first part is a component called conversation that exposes the service conversation/process. This service is capable of processing text and translating them into commands for devices. For now it will only support commands in the format of Turn <Friendly Name> <on/off>.

    - -

    The second part is an upgrade to the frontend to use the speech-to-text in Chrome to allow users to speak commands. If you’re using Chrome, you can test this out in the demo.

    - -
    1
    -2
    -
    # Example configuration.yaml entry
    -conversation:
    -
    - - - -
    -
    - +
    +
    + @@ -346,11 +417,9 @@ the manufacturers of these devices. Tellstick Vera Wink -ISY994

    - -

    Modbus -Arduino -Verisure

    +ISY994 +Modbus +Arduino

    Support for these devices is provided by the Home Assistant community and not @@ -360,140 +429,161 @@ the manufacturers of these devices.

    Services

    + + + +
    +
    + + + + + +
    +
    + diff --git a/components/mqtt.html b/components/mqtt.html index 4a628ad90e..46e58da237 100644 --- a/components/mqtt.html +++ b/components/mqtt.html @@ -141,7 +141,13 @@ The MQTT component has no TLS support at the moment. This means that only plain-

    Building on top of MQTT

    -

    There are two ways to integrate MQTT into your process. One is by using the MQTT-automation rule. The other one is by integrating it into a component. See the MQTT example component how to do this.

    + +

    Testing

    diff --git a/components/sensor.bitcoin.html b/components/sensor.bitcoin.html index 58c46ded8b..788bc248a2 100644 --- a/components/sensor.bitcoin.html +++ b/components/sensor.bitcoin.html @@ -12,7 +12,7 @@ Bitcoin support - Home Assistant - + @@ -22,7 +22,7 @@ - + diff --git a/components/sensor.dht.html b/components/sensor.dht.html new file mode 100644 index 0000000000..cf6af30277 --- /dev/null +++ b/components/sensor.dht.html @@ -0,0 +1,182 @@ + + + + + + + + + + + + DHT support - Home Assistant + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    +
    + +
    + + +
    + + +
    +

    + DHT Support +

    +
    +
    + + +

    The dht sensor platform allows you to get the current temperature and humidity from a DHT11, DHT22, or AM2302 device.

    + +

    To use your DHTxx sensor in your installation, add the following to your configuration.yaml file:

    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +
    # Example configuration.yaml entry
    +sensor:
    +  platform: dht
    +  sensor: DHT22
    +  pin: 23
    +  monitored_conditions:
    +    - temperature
    +    - humidity
    +
    + + +

    The name of the pin to which the sensor is connected has different names on different platforms. ‘P8_11’ for Beaglebone, ‘23’ for Raspberry Pi.

    + +

    +As this requires access to the GPIO, you will need to run Home Assistant as root. +

    + + + + + +
    + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/sensor.mqtt.html b/components/sensor.mqtt.html new file mode 100644 index 0000000000..5de787bd75 --- /dev/null +++ b/components/sensor.mqtt.html @@ -0,0 +1,177 @@ + + + + + + + + + + + + MQTT Sensor support - Home Assistant + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    +
    + +
    + + +
    + + +
    +

    + MQTT Sensor Support +

    +
    +
    + + +

    +This generic sensor implementation uses the MQTT message payload +as the sensor value. If messages in this state_topic are published +with RETAIN flag, the sensor will receive an instant update with +last known value. Otherwise, the initial state will be undefined.

    + +
    1
    +2
    +3
    +4
    +5
    +6
    +
    # Example configuration.yml entry
    +sensor:
    +  platform: mqtt
    +  name: "MQTT Sensor"
    +  state_topic: "home/bedroom/temperature"
    +  unit_of_measurement: "ºC"
    +
    + + +

    state_topic: The MQTT topic subscribed to receive sensor values. Required

    + +

    name: The name of the sensor. Default is ‘MQTT Sensor’. Optional

    + +

    unit_of_measurement: Defines the units of measurement of the sensor, if any. Optional

    + + +
    + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/sensor.rpi_gpio.html b/components/sensor.rpi_gpio.html new file mode 100644 index 0000000000..6c88d416a2 --- /dev/null +++ b/components/sensor.rpi_gpio.html @@ -0,0 +1,184 @@ + + + + + + + + + + + + Raspberry PI GPIO sensor support - Home Assistant + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    +
    + +
    + + +
    + + +
    +

    + Raspberry PI GPIO Sensor Support +

    +
    +
    + + +

    +The rpi_gpio sensor platform allows you to read sensor values of the GPIOs of your Raspberry Pi.

    + +

    To use your Raspberry Pi’s GPIO in your installation, add the following to your configuration.yaml file:

    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    +
    # Example configuration.yaml entry
    +sensor:
    +  platform: rpi_gpio
    +  pull_mode: "UP"
    +  value_high: "Active"
    +  value_low: "Inactive"
    +  ports:
    +    11: PIR Office
    +    12: PIR Bedroom
    + + +

    For more details about the GPIO layout, visit the Wikipedia article about the Raspberry Pi.

    + +

    +As this requires access to the GPIO, you will need to run Home Assistant as root. +

    + + + + + +
    + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/switch.mqtt.html b/components/switch.mqtt.html new file mode 100644 index 0000000000..7c07c2f0d0 --- /dev/null +++ b/components/switch.mqtt.html @@ -0,0 +1,198 @@ + + + + + + + + + + + + MQTT switch support - Home Assistant + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    +
    + +
    + + +
    + + +
    +

    + MQTT Switch Support +

    +
    +
    + + +

    +In an ideal scenario, the MQTT device will have a state topic to publish +state changes. If these messages are published with RETAIN flag, the MQTT +switch will receive an instant state update after subscription and will +start with correct state. Otherwise, the initial state of the switch will +be false/off.

    + +

    When a state topic is not available, the switch will work in optimistic mode. +In this mode, the switch will immediately change state after every command. +Otherwise, the switch will wait for state confirmation from device +(message from state_topic).

    + +

    Optimistic mode can be forced, even if state topic is available. +Try to enable it, if experiencing incorrect switch operation.

    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    +
    # Example configuration.yml entr
    +switch:
    +  platform: mqtt
    +  name: "Bedroom Switch"
    +  state_topic: "home/bedroom/switch1"
    +  command_topic: "home/bedroom/switch1/set"
    +  payload_on: "ON"
    +  payload_off: "OFF"
    +  optimistic: false
    +
    + + +

    command_topic: The MQTT topic to publish commands to change the switch state. Required

    + +

    name: The name of the switch. Default is ‘MQTT Switch’. Optional

    + +

    state_topic: The MQTT topic subscribed to receive state updates. Optional

    + +

    payload_on: The payload that represents enabled state. Default is “ON”. Optional

    + +

    payload_off: The payload that represents disabled state. Default is “OFF”. Optional

    + +

    optimistic: Flag that defines if switch works in optimistic mode. Default is true if no state topic defined, else false. Optional

    + + +
    + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/switch.rpi_gpio.html b/components/switch.rpi_gpio.html index 4680af5b7b..17210497cf 100644 --- a/components/switch.rpi_gpio.html +++ b/components/switch.rpi_gpio.html @@ -9,7 +9,7 @@ - Raspberry PI GPIO support - Home Assistant + Raspberry PI GPIO switch support - Home Assistant @@ -18,7 +18,7 @@ - + @@ -98,7 +98,7 @@

    - Raspberry PI GPIO Support + Raspberry PI GPIO Switch Support


    @@ -125,6 +125,13 @@ The rpi_gpio switch platform allows you to control the GPIOs of your article about the Raspberry Pi.

    +

    +As this requires access to the GPIO, you will need to run Home Assistant as root. +

    + + + +
    diff --git a/components/switch.wemo.html b/components/switch.wemo.html index d1b2f16395..5709b63f5d 100644 --- a/components/switch.wemo.html +++ b/components/switch.wemo.html @@ -104,10 +104,10 @@
    -

    +

    The wemo platform allows you to control your Belkin WeMo switches from within Home Assistant.

    -

    To add Wemo switches to your installation, add the following to your configuration.yaml file:

    +

    They will be automatically discovered if the discovery component is enabled.

    1
     2
    diff --git a/demo/frontend.html b/demo/frontend.html
    index ae077e87c5..d12500c287 100644
    --- a/demo/frontend.html
    +++ b/demo/frontend.html
    @@ -1,6 +1,6 @@
    -
    \ No newline at end of file
    +    }
    \ No newline at end of file
    diff --git a/demo/index.html b/demo/index.html
    index 8e8893470b..99b5c68851 100644
    --- a/demo/index.html
    +++ b/demo/index.html
    @@ -5,30 +5,53 @@
         Home Assistant
     
         
    -
    -    
    -    
    -
    -    
    -
         
         
         
    +    
    +    
    +    
         
    +    
       
       
    -      

    Initializing Home Assistant

    - - - - +
    + +
    Initializing
    +
    + + + + diff --git a/demo/webcomponents-lite.min.js b/demo/webcomponents-lite.min.js index 84acb55dd4..ec6063b7a5 100644 --- a/demo/webcomponents-lite.min.js +++ b/demo/webcomponents-lite.min.js @@ -7,7 +7,6 @@ * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt */ -// @version 0.7.6 -window.WebComponents=window.WebComponents||{},function(e){var t=e.flags||{},n="webcomponents-lite.js",r=document.querySelector('script[src*="'+n+'"]');if(!t.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var n,r=e.split("=");r[0]&&(n=r[0].match(/wc-(.+)/))&&(t[n[1]]=r[1]||!0)}),r)for(var o,i=0;o=r.attributes[i];i++)"src"!==o.name&&(t[o.name]=o.value||!0);if(t.log){var a=t.log.split(",");t.log={},a.forEach(function(e){t.log[e]=!0})}else t.log={}}t.shadow=t.shadow||t.shadowdom||t.polyfill,t.shadow="native"===t.shadow?!1:t.shadow||!HTMLElement.prototype.createShadowRoot,t.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=t.register),e.flags=t}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==h[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){g.push(e)}var d=a||"scheme start",u=0,l="",_=!1,w=!1,g=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var b=e[u];switch(d){case"scheme start":if(!b||!m.test(b)){if(a){c("Invalid scheme.");break e}l="",d="no scheme";continue}l+=b.toLowerCase(),d="scheme";break;case"scheme":if(b&&v.test(b))l+=b.toLowerCase();else{if(":"!=b){if(a){if(f==b)break e;c("Code point not allowed in scheme: "+b);break e}l="",u=0,d="no scheme";continue}if(this._scheme=l,l="",a)break e;t(this._scheme)&&(this._isRelative=!0),d="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==b?(this._query="?",d="query"):"#"==b?(this._fragment="#",d="fragment"):f!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._schemeData+=o(b));break;case"no scheme":if(s&&t(s._scheme)){d="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=b||"/"!=e[u+1]){c("Expected /, got: "+b),d="relative";continue}d="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==b){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==b||"\\"==b)"\\"==b&&c("\\ is an invalid code point."),d="relative slash";else if("?"==b)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,d="query";else{if("#"!=b){var y=e[u+1],E=e[u+2];("file"!=this._scheme||!m.test(b)||":"!=y&&"|"!=y||f!=E&&"/"!=E&&"\\"!=E&&"?"!=E&&"#"!=E)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),d="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,d="fragment"}break;case"relative slash":if("/"!=b&&"\\"!=b){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),d="relative path";continue}"\\"==b&&c("\\ is an invalid code point."),d="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=b){c("Expected '/', got: "+b),d="authority ignore slashes";continue}d="authority second slash";break;case"authority second slash":if(d="authority ignore slashes","/"!=b){c("Expected '/', got: "+b);continue}break;case"authority ignore slashes":if("/"!=b&&"\\"!=b){d="authority";continue}c("Expected authority, got: "+b);break;case"authority":if("@"==b){_&&(c("@ already seen."),l+="%40"),_=!0;for(var L=0;L>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){b.push(e),g||(g=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){g=!1;var e=b;b=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=v.get(n);if(r)for(var o=0;o0){var o=n[r-1],i=p(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;np&&(h=s[p]);p++)a(h)?(c++,n()):(h.addEventListener("load",r),h.addEventListener("error",i));else n()}function a(e){return l?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&d(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function d(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",l=Boolean(u in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),p=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=p(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return p(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var v=/Trident/.test(navigator.userAgent),_=v?"complete":"interactive",w="readystatechange";l&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)d(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=l,e.rootDocument=f,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=i.getResponseHeader("Location"),a=null;if(n)var a="/"===n.substr(0,1)?location.origin+n:n;r.call(o,!t.ok(i)&&i,i.response||i.responseText,a)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,d=e.isIE,u=e.IMPORT_LINK_TYPE,l="link[rel="+u+"]",h={documentSelectors:l,importsSelectors:[l,"link[rel=stylesheet]","style","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.dispatchEvent(e.__resource&&!e.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(r){t&&t(r),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),d&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r["import"],r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e["import"]?!1:!0}};e.parser=h,e.IMPORT_SELECTOR=l}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,d=e.Loader,u=e.Observer,l=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){p.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);p.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n["import"]=c}l.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),l.parseNext()},loadedAll:function(){l.parseNext()}},p=new d(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=h,e.importLoader=p}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(o)}var n=e.initializeModules,r=e.isIE;if(!e.useNative){r&&"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n.preventDefault=function(){Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})},n},window.CustomEvent.prototype=window.Event.prototype),n();var o=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;c>s&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function r(e,t){g(e,function(e){return n(e,t)?!0:void 0})}function o(e){L.push(e),E||(E=!0,setTimeout(i))}function i(){E=!1;for(var e,t=L,n=0,r=t.length;r>n&&(e=t[n]);n++)e();L=[]}function a(e){y?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){d(e),g(e,function(e){d(e)})}function d(e){y?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function l(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function h(e){if(e.shadowRoot&&!e.shadowRoot.__watched){w.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function p(e,n){if(w.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=l(e);n.forEach(function(e){"childList"===e.type&&(M(e.addedNodes,function(e){e.localName&&t(e,a)}),M(e.removedNodes,function(e){e.localName&&c(e)}))}),w.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(p(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(p.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),w.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),w.dom&&console.groupEnd()}function _(e){b(e,v)}var w=e.flags,g=e.forSubtree,b=e.forDocumentTree,y=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;e.hasPolyfillMutations=y;var E=!1,L=[],M=Array.prototype.forEach.call.bind(Array.prototype.forEach),T=Element.prototype.createShadowRoot;T&&(Element.prototype.createShadowRoot=function(){var e=T.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=h,e.upgradeDocumentTree=_,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if(!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(o||t.localName);if(i){if(o&&i.tag==t.localName)return n(t,i,r);if(!o&&!i["extends"])return n(t,i,r)}}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(d(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=l(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&_(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0; - -}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t=0&&b(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return w(e),e}}var m,v=e.isIE11OrOlder,_=e.upgradeDocumentTree,w=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],L={},M="http://www.w3.org/1999/xhtml",T=document.createElement.bind(document),O=document.createElementNS.bind(document);m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),v&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType==t.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}(),document.registerElement=t,document.createElement=p,document.createElementNS=h,e.registry=L,e["instanceof"]=m,e.reservedTagList=E,e.getRegisteredDefinition=d,document.register=document.registerElement}),function(e){function t(){a(window.wrap(document)),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){a(window.wrap(e["import"]))}),window.CustomElements.ready=!0,setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})}var n=e.useNative,r=e.initializeModules,o=/Trident/.test(navigator.userAgent);if(n){var i=function(){};e.watchShadow=i,e.upgrade=i,e.upgradeAll=i,e.upgradeDocumentTree=i,e.upgradeSubtree=i,e.takeRecords=i,e["instanceof"]=function(e,t){return e instanceof t}}else r();var a=e.upgradeDocumentTree;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),o&&"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n.preventDefault=function(){Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})},n},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t();e.isIE11OrOlder=o}(window.CustomElements),"undefined"==typeof HTMLTemplateElement&&!function(){var e="template";HTMLTemplateElement=function(){},HTMLTemplateElement.prototype=Object.create(HTMLElement.prototype),HTMLTemplateElement.decorate=function(e){e.content||(e.content=e.ownerDocument.createDocumentFragment());for(var t;t=e.firstChild;)e.content.appendChild(t)},HTMLTemplateElement.bootstrap=function(t){for(var n,r=t.querySelectorAll(e),o=0,i=r.length;i>o&&(n=r[o]);o++)HTMLTemplateElement.decorate(n)},window.addEventListener("DOMContentLoaded",function(){HTMLTemplateElement.bootstrap(document)});var t=document.createElement;document.createElement=function(){"use strict";var e=t.apply(document,arguments);return"template"==e.localName&&HTMLTemplateElement.decorate(e),e}}(),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents); \ No newline at end of file +// @version 0.7.12 +window.WebComponents=window.WebComponents||{},function(e){var t=e.flags||{},n="webcomponents-lite.js",r=document.querySelector('script[src*="'+n+'"]');if(!t.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var n,r=e.split("=");r[0]&&(n=r[0].match(/wc-(.+)/))&&(t[n[1]]=r[1]||!0)}),r)for(var o,i=0;o=r.attributes[i];i++)"src"!==o.name&&(t[o.name]=o.value||!0);if(t.log){var a=t.log.split(",");t.log={},a.forEach(function(e){t.log[e]=!0})}else t.log={}}t.shadow=t.shadow||t.shadowdom||t.polyfill,t.shadow="native"===t.shadow?!1:t.shadow||!HTMLElement.prototype.createShadowRoot,t.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=t.register),e.flags=t}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==h[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){g.push(e)}var d=a||"scheme start",u=0,l="",_=!1,w=!1,g=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var b=e[u];switch(d){case"scheme start":if(!b||!m.test(b)){if(a){c("Invalid scheme.");break e}l="",d="no scheme";continue}l+=b.toLowerCase(),d="scheme";break;case"scheme":if(b&&v.test(b))l+=b.toLowerCase();else{if(":"!=b){if(a){if(f==b)break e;c("Code point not allowed in scheme: "+b);break e}l="",u=0,d="no scheme";continue}if(this._scheme=l,l="",a)break e;t(this._scheme)&&(this._isRelative=!0),d="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==b?(this._query="?",d="query"):"#"==b?(this._fragment="#",d="fragment"):f!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._schemeData+=o(b));break;case"no scheme":if(s&&t(s._scheme)){d="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=b||"/"!=e[u+1]){c("Expected /, got: "+b),d="relative";continue}d="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==b){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==b||"\\"==b)"\\"==b&&c("\\ is an invalid code point."),d="relative slash";else if("?"==b)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,d="query";else{if("#"!=b){var y=e[u+1],E=e[u+2];("file"!=this._scheme||!m.test(b)||":"!=y&&"|"!=y||f!=E&&"/"!=E&&"\\"!=E&&"?"!=E&&"#"!=E)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),d="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,d="fragment"}break;case"relative slash":if("/"!=b&&"\\"!=b){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),d="relative path";continue}"\\"==b&&c("\\ is an invalid code point."),d="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=b){c("Expected '/', got: "+b),d="authority ignore slashes";continue}d="authority second slash";break;case"authority second slash":if(d="authority ignore slashes","/"!=b){c("Expected '/', got: "+b);continue}break;case"authority ignore slashes":if("/"!=b&&"\\"!=b){d="authority";continue}c("Expected authority, got: "+b);break;case"authority":if("@"==b){_&&(c("@ already seen."),l+="%40"),_=!0;for(var L=0;L>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){b.push(e),g||(g=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){g=!1;var e=b;b=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=v.get(n);if(r)for(var o=0;o0){var o=n[r-1],i=p(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;np&&(h=s[p]);p++)a(h)?(c++,n()):(h.addEventListener("load",r),h.addEventListener("error",i));else n()}function a(e){return l?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&d(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function d(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",l=Boolean(u in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),p=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=p(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return p(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var v=/Trident/.test(navigator.userAgent),_=v?"complete":"interactive",w="readystatechange";l&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)d(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=l,e.rootDocument=f,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=i.getResponseHeader("Location"),a=null;if(n)var a="/"===n.substr(0,1)?location.origin+n:n;r.call(o,!t.ok(i)&&i,i.response||i.responseText,a)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,d=e.isIE,u=e.IMPORT_LINK_TYPE,l="link[rel="+u+"]",h={documentSelectors:l,importsSelectors:[l,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.dispatchEvent(e.__resource&&!e.__error?new CustomEvent("load",{bubbles:!1}):new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),d&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e.__doc?!1:!0}};e.parser=h,e.IMPORT_SELECTOR=l}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,d=e.Loader,u=e.Observer,l=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){p.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);p.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}l.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),l.parseNext()},loadedAll:function(){l.parseNext()}},p=new d(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=h,e.importLoader=p}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(o)}var n=e.initializeModules,r=e.isIE;if(!e.useNative){r&&"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n.preventDefault=function(){Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})},n},window.CustomEvent.prototype=window.Event.prototype),n();var o=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;c>s&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function r(e,t){g(e,function(e){return n(e,t)?!0:void 0})}function o(e){L.push(e),E||(E=!0,setTimeout(i))}function i(){E=!1;for(var e,t=L,n=0,r=t.length;r>n&&(e=t[n]);n++)e();L=[]}function a(e){y?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){d(e),g(e,function(e){d(e)})}function d(e){y?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function l(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function h(e){if(e.shadowRoot&&!e.shadowRoot.__watched){w.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function p(e,n){if(w.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=l(e);n.forEach(function(e){"childList"===e.type&&(M(e.addedNodes,function(e){e.localName&&t(e,a)}),M(e.removedNodes,function(e){e.localName&&c(e)}))}),w.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(p(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(p.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),w.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),w.dom&&console.groupEnd()}function _(e){b(e,v)}var w=e.flags,g=e.forSubtree,b=e.forDocumentTree,y=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;e.hasPolyfillMutations=y;var E=!1,L=[],M=Array.prototype.forEach.call.bind(Array.prototype.forEach),T=Element.prototype.createShadowRoot;T&&(Element.prototype.createShadowRoot=function(){var e=T.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=h,e.upgradeDocumentTree=_,e.upgradeDocument=v,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if(!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(d(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=l(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&_(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){ +var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t=0&&b(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return w(e),e}}var m,v=e.isIE,_=e.upgradeDocumentTree,w=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],L={},M="http://www.w3.org/1999/xhtml",T=document.createElement.bind(document),N=document.createElementNS.bind(document);m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),v&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType==t.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}(),document.registerElement=t,document.createElement=p,document.createElementNS=h,e.registry=L,e["instanceof"]=m,e.reservedTagList=E,e.getRegisteredDefinition=d,document.register=document.registerElement}),function(e){function t(){a(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules,o=e.isIE;if(n){var i=function(){};e.watchShadow=i,e.upgrade=i,e.upgradeAll=i,e.upgradeDocumentTree=i,e.upgradeSubtree=i,e.takeRecords=i,e["instanceof"]=function(e,t){return e instanceof t}}else r();var a=e.upgradeDocumentTree,s=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&s(wrap(e["import"]))}),o&&"function"!=typeof window.CustomEvent&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n.preventDefault=function(){Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})},n},window.CustomEvent.prototype=window.Event.prototype),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var c=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(c,t)}else t()}(window.CustomElements),"undefined"==typeof HTMLTemplateElement&&!function(){function e(e){switch(e){case"&":return"&";case"<":return"<";case">":return">";case" ":return" "}}function t(t){return t.replace(a,e)}var n="template",r=document.implementation.createHTMLDocument("template"),o=!0;HTMLTemplateElement=function(){},HTMLTemplateElement.prototype=Object.create(HTMLElement.prototype),HTMLTemplateElement.decorate=function(e){e.content||(e.content=r.createDocumentFragment());for(var n;n=e.firstChild;)e.content.appendChild(n);if(o)try{Object.defineProperty(e,"innerHTML",{get:function(){for(var e="",n=this.content.firstChild;n;n=n.nextSibling)e+=n.outerHTML||t(n.data);return e},set:function(e){for(r.body.innerHTML=e,HTMLTemplateElement.bootstrap(r);this.content.firstChild;)this.content.removeChild(this.content.firstChild);for(;r.body.firstChild;)this.content.appendChild(r.body.firstChild)},configurable:!0})}catch(i){o=!1}},HTMLTemplateElement.bootstrap=function(e){for(var t,r=e.querySelectorAll(n),o=0,i=r.length;i>o&&(t=r[o]);o++)HTMLTemplateElement.decorate(t)},window.addEventListener("DOMContentLoaded",function(){HTMLTemplateElement.bootstrap(document)});var i=document.createElement;document.createElement=function(){"use strict";var e=i.apply(document,arguments);return"template"==e.localName&&HTMLTemplateElement.decorate(e),e};var a=/[&\u00A0<>]/g}(),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents); \ No newline at end of file diff --git a/developers/add_new_platform.html b/developers/add_new_platform.html index bb09d5ee0c..f8b06f5e81 100644 --- a/developers/add_new_platform.html +++ b/developers/add_new_platform.html @@ -134,12 +134,38 @@

    If you are planning to add support for a new type of device to an existing component, you can get away with only writing platform logic. Have a look at how the component works with other platforms and create a similar file for the platform that you would like to add.

    -

    -Platform logic should not interface directly with the devices but use a third-party Python 3 library that speaks the actual API. -

    +

    Interfacing with devices

    + +

    One of the rules for Home Assistant is that platform logic should never interface directly with +devices but use a third-party Python 3 library to do so. This way Home Assistant is able to share +code with the Python community and we can keep the project maintainable.

    + +

    Platforms can specify dependencies and requirements the same way as a component does. Please see +the component page for more information.

    + +

    Creating Entities

    + +

    Home Assistant will call a function with the following signature to initialize +your new platform. This function must exist in the platform module you create.

    + +
    1
    +
    def setup_platform(hass, config, add_devices, discovery_info=None)
    +
    -

    +

    In this function, your platform should create the appropriate entities and +register them with the Home Assistant core. Entities are Home Assistant’s +representation of lights, switches, sensors, etc. and are derived from the +Entity Abstract Class. +This abstract class contains logic for integrating most standard features into +your entities, such as visibility, entity IDs, updates, and many more.

    + +

    A list of entities can be registered with Home Assistant using the add_devices +function that is provided as an input to setup_platform. Once entities are +registered with with Home Assistant their updates will be provided to the core +and the core will have control over them. For more information on how Entities +can be customized, take a look at the Entity Abstract +Class.

    Allowing your platform to be discovered

    @@ -189,32 +215,6 @@ This option is currently limited to built-in components.

    -

    Creating Entities

    - -

    Home Assistant will call a function with the following signature to initialize -your new platform. This function must exist in the platform module you create.

    - -
    1
    -
    def setup_platform(hass, config, add_devices, discovery_info=None)
    -
    - - -

    In this function, your platform should create the appropriate entities and -register them with the Home Assistant core. Entities are Home Assistant’s -representation of lights, switches, sensors, etc. It is best practice for all -new entities to inherit the -Entity Abstract Class. -This abstract class contains logic for integrating most standard features into -your entities, such as visibility, entity IDs, updates, and many more. That is -why it is best practice to reference the existing class.

    - -

    A list of entities can be registered with Home Assistant using the add_devices -function that is provided as an input to setup_platform. Once entities are -registered with with Home Assistant their updates will be provided to the core -and the core will have control over them. For more information on how Entities -can be customized, take a look at the Entity Abstract -Class.

    - diff --git a/developers/creating_components.html b/developers/creating_components.html index c100f0e7c9..493efef845 100644 --- a/developers/creating_components.html +++ b/developers/creating_components.html @@ -147,6 +147,22 @@ Home Assistant will use the directory that contains your config file as the dire

    +

    Dependencies

    + +

    Home Assistant allows components and platforms to specify their dependencies and requirements using the variables +DEPENDENCIES and REQUIREMENTS. Both are lists that contain strings.

    + +

    Dependencies are other Home Assistant components that should be setup before the platform is loaded. +An example is the MQTT sensor component, which requires an active connection to a MQTT broker. If +Home Assistant is unable to load and setup the MQTT component, it will not setup the MQTT sensor +component.

    + +

    Requirements are Python libraries that you would normally install using pip. Each entry in a +requirement list is a pip compatible string. For example, the media player Cast platform depends +on the Python package PyChromecast thus REQUIREMENTS = ['pychromecast==0.6.12']. If Home +Assistant is unable to install the package or verify it is installed, the component will fail to +load.

    +

    Initializing components

    After loading, the bootstrapper will call setup(hass, config) method on the component to initialize it. The following parameters are passed in:

    diff --git a/developers/credits.html b/developers/credits.html index 9b800d01b7..355e405ffd 100644 --- a/developers/credits.html +++ b/developers/credits.html @@ -139,6 +139,7 @@
  • Joseph Piron
  • Julien Danjou
  • kixam
  • +
  • MakeMeASandwich
  • Markus Stenberg
  • Michael Arnauts
  • miniconfig
  • diff --git a/developers/index.html b/developers/index.html index 062fe398cd..58cddd1f26 100644 --- a/developers/index.html +++ b/developers/index.html @@ -104,9 +104,57 @@
    -

    Home Assistant is build from the ground-up to be easily extensible by other developers using components. It uses Python 3 for the backend and Polymer (Webcomponents) for the frontend.

    +

    Home Assistant is build from the ground-up to be easily extensible by other developers using +components. It uses Python 3 for the backend and +Polymer (Webcomponents) for the frontend.

    -

    For further reading, see:

    +

    Home Assistant is open-source and MIT licensed. The source can be found here:

    + + + + +

    Starting development

    + +

    You will need to setup a development environment if you want to start developing a new feature or +component for Home Assistant.

    + +
      +
    1. Clone the Home Assistant repository:
      +git clone https://github.com/balloob/home-assistant.git
    2. +
    3. Setup your computer for development:
      +python3 setup.py develop
    4. +
    + + +

    After following these steps, running hass will invoke your local installation.

    + +

    Submitting improvements

    + +

    Improvements to Home Assistant should be submitted one feature at a time using Github pull +requests.

    + +
      +
    1. Go to the Home Assistant repository +and click fork in the top right.
    2. +
    3. Follow steps in the previous section but with your forked repository.
    4. +
    5. Create a new branch to hold your changes
      +git checkout -b some-feature
    6. +
    7. Make the changes you want
    8. +
    9. Commit the changes
      +git add .
      +git commit -m "Added some-feature"
    10. +
    11. Push your commited changes back to your fork on Github
      +git push origin HEAD
    12. +
    13. Follow these steps to create your +pull request.
    14. +
    + + +

    Further reading

    -

    Password protecting the web interface

    +

    Password protecting the web interface

    The first thing you want to add is a password for the web interface. Use your favourite text editor to open the file /config/configuration.yaml and add the following to the bottom:

    @@ -165,7 +169,9 @@

    Adding devices and services

    -

    Home Assistant will be able to automatically discover and configure any Google Chromecasts, Belkin WeMo switches and Philips Hue bridges in your network if you have the discovery component enabled (which is by default).

    +

    Home Assistant will be able to automatically discover and configure any Google Chromecasts, Netgear routers, +Belkin WeMo switches and Philips Hue bridges in your network if you have +the discovery component enabled (which is by default).

    Not all devices can be discovered, so if you have any of the following devices or services, please see their respective pages for installation instructions:

    @@ -183,6 +189,25 @@

    See the components overview page for a complete list of supported devices.

    +

    Grouping devices

    + +

    Once you get a bunch of devices set up, it is time to organize them. This can be done using groups. +Each group exists of a name and a list of entity IDs. Entity IDs can be retrieved from the web interface +by using the Set State page in the Developer Tools (one in the middle).

    + +
    1
    +2
    +3
    +4
    +5
    +
    group:
    +  living_room: light.table_lamp, switch.ac
    +  bedroom:
    +    - light.bedroom
    +    - media_player.nexus_player
    +
    + +

    Customizing devices and services

    By default, most of your devices will be visible on the Home Assistant States @@ -190,8 +215,8 @@ page and have a default icon determined by their domain. You may find it desireable to customize the look and feel of your front page by altering some of these parameters.

    -

    By adding the following parameters to the homeassistant section of your -configuration.yaml file, you can customize the attributes of any state on +

    By adding the following parameters to the homeassistant: section of your +configuration.yaml, you can customize the attributes of any state on your front page.

    1
    @@ -208,15 +233,17 @@ your front page.

    # Add this to your existing configuration customize: - SOME_ENTITY_ID: + some.entity_id: hidden: true entity_picture: http://URL.TO/PICTURE friendly_name: SOME CUSTOM NAME
    -

    Entity IDs can be retrieved from the web interface by using the Set State page -in the Developer Tools.

    + + +

    Customizations are currently unavailable for device tracker entities.

    +

    Setting up Home Automation

    diff --git a/getting-started/index.html b/getting-started/index.html index d388fb90e8..5df69b5db0 100644 --- a/getting-started/index.html +++ b/getting-started/index.html @@ -125,20 +125,20 @@
    -Installing and running Home Assistant on your local machine is easy. Make sure you have Python 3.4 and git installed and execute the following code in a console: +Installing and running Home Assistant on your local machine is easy. Make sure you have Python 3.4 installed and execute the following code in a console:
    -

    The preparation of a Fedora 22 host will only take a couple of minutes. First install Python 3.4, git and the other needed packages out of the Fedora Package Collection. This ensure that you receive updates in the future.

    +

    The preparation of a Fedora 22 host will only take a couple of minutes. First install Python 3.4 and the other needed packages out of the Fedora Package Collection. This ensure that you receive updates in the future.

    It’s assumed that your user has an entry in the sudoers file. Otherwise, run the commands which needs more privileges as root.

    1
    -
    sudo dnf -y install python3 python3-devel git gcc
    +
    sudo dnf -y install python3 python3-devel gcc
     
    @@ -183,22 +183,13 @@ It’s assumed that your user has an entry in the sudoers file. Otherwise, r

    1
     2
    -3
    -4
    -5
    -
    git clone --recursive https://github.com/balloob/home-assistant.git
    -python3 -m venv home-assistant
    -cd home-assistant
    -source bin/activate
    -python3 -m homeassistant --open-ui
    +
    pip3 install homeassistant
    +hass --open-ui
     

    Running these commands will:

      -
    1. Download Home Assistant
    2. -
    3. Setup an isolated environment
    4. -
    5. Navigate to downloaded files
    6. -
    7. Activate the isolated environment (on Windows, run Scripts/activate.bat)
    8. +
    9. Install Home Assistant
    10. Launch Home Assistant and serve web interface on http://localhost:8123

    @@ -212,20 +203,15 @@ It’s assumed that your user has an entry in the sudoers file. Otherwise, r - +

    There is nothing else to do. If you run into any issues, please see the troubleshooting page.

    -

    - You can run Home Assistant in demo mode by appending --demo-mode to line 5. -

    - -

    - If you want to update to the latest version in the future, run: scripts/update. -

    +

    If you want to see what Home Assistant can do, you can start the demo mode by running hass --demo-mode.

    +

    In the future, if you want to update to the latest version, run pip3 install --upgrade home-assistant.

    @@ -239,7 +225,11 @@ It’s assumed that your user has an entry in the sudoers file. Otherwise, r

    Home Assistant will serve its web interface on http://[IP address of the host]:8123.

    -

    If you want that Home Assistant is lauched automatically, an extra step is needed to setup systemd. You need a service file to control Home Assistant with systemd. The WorkingDirectory and the PYTHONPATH must point to your clone git repository.

    +

    If you want that Home Assistant is lauched automatically, an extra step is needed to setup systemd. You need a service file to control Home Assistant with systemd. +

    1
     2
    @@ -253,8 +243,6 @@ It’s assumed that your user has an entry in the sudoers file. Otherwise, r
     10
     11
     12
    -13
    -14
     
    su -c 'cat <<EOF >> /lib/systemd/system/home-assistant.service
     [Unit]
     Description=Home Assistant
    @@ -262,8 +250,6 @@ It’s assumed that your user has an entry in the sudoers file. Otherwise, r
     
     [Service]
     Type=simple
    -WorkingDirectory=/home/fab/home-assistant/
    -Environment="PYTHONPATH=/home/fab/home-assistant/"
     ExecStart=/usr/bin/python3.4 -m homeassistant
     
     [Install]
    @@ -307,10 +293,7 @@ It’s assumed that your user has an entry in the sudoers file. Otherwise, r
     
    sudo journalctl -f -u home-assistant
     
    -

    - If you want to update to the latest version in the future, run: scripts/update and restart Home Assistant. -

    - +

    In the future, if you want to update to the latest version, run pip3 install --upgrade home-assistant.

    Those instructions were written for Fedora 22 Server and Workstation. They may work for Cloud flavor as well but this was not tested. @@ -401,28 +384,26 @@ NOTE: the rest of the commands are not being run as sudo and will install python

    pyenv virtualenv 3.4.2 homeassistant
     
    -

    Step 5. Clone the source

    -
    1
    -
    git clone --recursive https://github.com/balloob/home-assistant.git
    -
    - -

    Step 6. Set the virtual environment

    +

    Step 5. Set the virtual environment

    1
     2
     
    cd home-assistant
     pyenv local homeassistant
     
    +

    Step 6. Install Home Assistant

    +
    1
    +
    pip3 install homeassistant
    +
    +

    Step 7. Start it up

    1
    -
    python3 -m homeassistant
    +
    hass
     

    It will be up and running on port 8123

    -

    - If you want to update to the latest version in the future, run: scripts/update. -

    +

    In the future, if you want to update to the latest version, run pip3 install --upgrade home-assistant.

    diff --git a/getting-started/troubleshooting-configuration.html b/getting-started/troubleshooting-configuration.html new file mode 100644 index 0000000000..d51169378b --- /dev/null +++ b/getting-started/troubleshooting-configuration.html @@ -0,0 +1,212 @@ + + + + + + + + + + + + Troubleshooting your configuration - Home Assistant + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    +
    + +
    + + +
    + + +
    +

    + Troubleshooting Your Configuration +

    +
    +
    + + +

    It can happen that you run into trouble while configuring Home Assistant. A component is not +showing up or is acting weird. This page will discuss a few of the most common problems.

    + +

    Before we dive into common issues, make sure you know where your configuration directory is. +Home Assistant will print out the configuration directory it is using when starting up.

    + +

    Whenever a component or configuration option results in a warning, it will be stored in +home-assistant.log. This file is reset on start of Home Assistant.

    + +

    My component does not show up

    + +

    When a component does not show up, many different things can be the case. Before you try any of +these steps, make sure to look at the home-assistant.log file and see if there are any errors +related to your component you are trying to set up.

    + +

    Problems with the configuration

    + +

    configuration.yaml does not allow multiple sections to have the same name. If you want a + specific component to be loaded twice, append a number to the name.

    + +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +
    sensor:
    +  platform: mqtt
    +  []
    +
    +sensor 2:
    +  platform: bitcoin
    +  []
    +
    + + +

    Another common problem is that a required configuration setting is missing. If this is the +case, the component will report this to home-assistant.log. You can have a look at +the component page for instructions how to setup the components. If you find any +errors or want to expand the documentation, please +let us know.

    + +

    Problems with dependencies
    +Almost all components have external dependencies to communicate with your devices and services. +Sometimes Home Assistant is unable to install the necessary dependencies. If this is the case, it +should show up in home-assistant.log.

    + +

    First step is trying to restart Home Assistant and see if the problem persists. If it does, please +report it so we can investigate what is going on.

    + +

    Problems with components
    +It can happen that some components either do not work right away or stop working after Home +Assistant has been running for a while. If this happens to you, please +report it so that we can have a look.

    + +

    +Whenever you report an issue, be aware that we are a group of volunteers that do not have access to +every single device in the world nor unlimited time to fix every problem out there. +

    + + + +
    + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/getting-started/troubleshooting.html b/getting-started/troubleshooting.html index 9cb72f1faf..6e6309fea3 100644 --- a/getting-started/troubleshooting.html +++ b/getting-started/troubleshooting.html @@ -9,20 +9,20 @@ - Troubleshooting - Home Assistant + Troubleshooting installation problems - Home Assistant - + - + - + @@ -98,58 +98,34 @@

    - Troubleshooting + Troubleshooting Installation Problems


    -

    It can happen that you run into trouble while installing Home Assistant. This page is here to help you figure out the most common problems.

    +

    It can happen that you run into trouble while installing Home Assistant. This page is here to help +you figure out the most common problems.

    -

    python3: command not found
    -Check if Python 3.4 is installed by running python3 --version. If it is not installed, download it here.

    +

    pip3: command not found
    +This utility should have been installed as part of the Python 3.4 installation. Check if Python 3.4 +is installed by running python3 --version. If it is not installed, +download it here.

    + +

    If you are to succesfully run python3 --version but not pip3, run the following command instead +to install Home Assistant: python3 -m pip install homeassistant.

    No module named pip
    -Pip should come bundled with the latest Python 3 but is ommitted by some distributions. If you are unable to run python3 -m pip --version you can install pip by downloading the installer and run it with Python 3: python3 get-pip.py.

    - -

    git: command not found
    -Check if Git is installed by running git --version. If you are unable to run this command you can install it by following these instructions.

    - -

    No module named ‘pytz’
    -There is a problem with installing dependencies on the fly. Install the dependencies manually in advance.

    - -
    1
    -2
    -
    python3 -m pip install --upgrade pip
    -python3 -m pip install --upgrade -r requirements.txt
    -
    - - -

    Ubuntu 14.04: … returned non-zero exit status
    -There is a known issue with installing on Ubuntu 14.04 and possibly many other newer Debian based distributions. The venv Python 3.4 package that has been bundled in the apt-get repository are known to be broken. This has been documented in this bug report. If you are encountering an error that looks like the following while creating the virtual environment, you are experiencing this bug.

    - -
    1
    -
    Error: Command '['home-assistant/bin/python3.4', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status
    -
    - - -

    This error can be fixed permanently by running the following commands.

    - -
    1
    -2
    -3
    -4
    -
    cd ~/Downloads
    -wget https://gist.githubusercontent.com/rmkraus/c3972492a9de875203c6/raw/46629b63857537deedc85ec4a11cd8284816e2a0/install_ensurepip.py
    -sudo python3 install_ensurepip.py
    -rm install_ensurepip.py
    -
    - - -

    After these commands have been successfully executed, the venv package will be fixed system-wide.

    +Pip should come bundled with the latest Python 3 but is ommitted +by some distributions. If you are unable to run python3 -m pip --version you can install pip by +downloading the installer and run it with Python 3: +python3 get-pip.py.

    No access to the frontend
    -In newer Linux distributions (at least Fedora 22/CentOS 7) the access to a host are very limited. This means that you can’t access the Home Assistant Frontend that is running on a host in your network. Check the Post-installation section on the Getting started page and follow the instruction that match your distribution to allow access to port 8123.

    +In newer Linux distributions (at least Fedora 22/CentOS 7) the access to a host are very limited. +This means that you can’t access the Home Assistant Frontend that is running on a host in your +network. Check the Post-installation section on the Getting started page and +follow the instruction that match your distribution to allow access to port 8123.

    diff --git a/images/hero_screenshot.png b/images/hero_screenshot.png index 009fe1a2d3..fe27179e04 100644 Binary files a/images/hero_screenshot.png and b/images/hero_screenshot.png differ diff --git a/images/screenshots/ui2015.png b/images/screenshots/ui2015.png new file mode 100644 index 0000000000..a5e278b039 Binary files /dev/null and b/images/screenshots/ui2015.png differ diff --git a/images/supported_brands/actiontec.png b/images/supported_brands/actiontec.png new file mode 100644 index 0000000000..490c055231 Binary files /dev/null and b/images/supported_brands/actiontec.png differ diff --git a/images/supported_brands/technicolor.png b/images/supported_brands/technicolor.png new file mode 100644 index 0000000000..203bbc5927 Binary files /dev/null and b/images/supported_brands/technicolor.png differ diff --git a/images/supported_brands/verizon.png b/images/supported_brands/verizon.png new file mode 100644 index 0000000000..ba2c40f873 Binary files /dev/null and b/images/supported_brands/verizon.png differ diff --git a/index.html b/index.html index 01a12f3ea7..3d9a1d8d6d 100644 --- a/index.html +++ b/index.html @@ -96,15 +96,19 @@

    Awaken your home

    -

    Home Assistant is an open-source home automation platform running on Python 3. Track and control all devices at home and automate control. Installation in less than a minute.

    + +$ pip3 install homeassistant
    +$ hass --open-ui +

    - View demo - Get started - Browse code on GitHub + View demo + Get started + Browse code on GitHub

    +
    @@ -137,10 +141,9 @@ Home Assistant is an open-source home automation platform running on Python 3. T

    Home Assistant will track the state of all the devices in your home, so you don’t have to.

    - + - @@ -150,6 +153,7 @@ Home Assistant is an open-source home automation platform running on Python 3. T +

    Browse all »

    diff --git a/sitemap.xml b/sitemap.xml index 6d94b739c1..7fc5939744 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,5 +1,10 @@ + + https://home-assistant.io/blog/2015/08/31/version-7-revamped-ui-and-improved-distribution/ + 2015-08-31T14:12:00-07:00 + 0.8 + https://home-assistant.io/blog/2015/08/26/laundry-automation-with-moteino-mqtt-and-home-assistant/ 2015-08-26T08:12:00-07:00 @@ -102,570 +107,618 @@ https://home-assistant.io/developers/add_new_platform.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/getting-started/android.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/developers/api.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/developers/architecture.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/arduino.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/automation.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/browser.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/camera.generic.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/getting-started/configuration.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/configurator.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/conversation.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/developers/creating_components.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/developers/credits.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/device_sun_light_trigger.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 + weekly + 0.7 + + + https://home-assistant.io/components/device_tracker.actiontec.html + 2015-09-01T01:42:38-07:00 + weekly + 0.7 + + + https://home-assistant.io/components/device_tracker.aruba.html + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/device_tracker.asuswrt.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/device_tracker.ddwrt.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/device_tracker.luci.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/device_tracker.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/device_tracker.netgear.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/device_tracker.nmap_scanner.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 + weekly + 0.7 + + + https://home-assistant.io/components/device_tracker.thomson.html + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/device_tracker.tomato.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/device_tracker.tplink.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/discovery.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/downloader.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/developers/frontend.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/group.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/history.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/blog/archives/ - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/ - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 1.0 https://home-assistant.io/blog/ - 2015-08-29T09:17:01-07:00 - weekly - 0.7 - - - https://home-assistant.io/components/ - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/developers/ - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 + weekly + 0.7 + + + https://home-assistant.io/components/ + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/help/ - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/getting-started/ - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/isy994.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/keyboard.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/light.hue.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/light.limitlessled.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/light.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/logbook.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/media_player.cast.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/media_player.kodi.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/media_player.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/media_player.mpd.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/media_player.squeezebox.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/modbus.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/mqtt.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/notify.file.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/notify.instapush.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/notify.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/notify.nma.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/notify.pushbullet.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/notify.pushover.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/notify.slack.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/notify.smtp.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/notify.syslog.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/notify.xmpp.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/developers/python_api.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/developers/rest_api.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/scene.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/scheduler.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/script.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.bitcoin.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 + weekly + 0.7 + + + https://home-assistant.io/components/sensor.dht.html + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.efergy.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.forecast.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 + weekly + 0.7 + + + https://home-assistant.io/components/sensor.mqtt.html + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.mysensors.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.openweathermap.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.rfxtrx.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 + weekly + 0.7 + + + https://home-assistant.io/components/sensor.rpi_gpio.html + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.sabnzbd.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.swiss_public_transport.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.systemmonitor.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.temper.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.time_date.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sensor.transmission.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/simple_alarm.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/sun.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/switch.command_switch.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/switch.edimax.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/switch.hikvision.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/switch.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 + weekly + 0.7 + + + https://home-assistant.io/components/switch.mqtt.html + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/switch.rpi_gpio.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/switch.transmission.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/switch.wemo.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/tellstick.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/thermostat.heat_control.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/thermostat.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/thermostat.nest.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 + weekly + 0.7 + + + https://home-assistant.io/getting-started/troubleshooting-configuration.html + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/getting-started/troubleshooting.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/vera.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/verisure.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/developers/website.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/wink.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/components/zwave.html - 2015-08-29T09:17:01-07:00 + 2015-09-01T01:42:38-07:00 weekly 0.7 https://home-assistant.io/demo/frontend.html - 2015-07-17T23:45:46-07:00 + 2015-08-31T01:01:03-07:00 0.6 https://home-assistant.io/demo/index.html - 2015-06-23T23:48:32-07:00 + 2015-08-31T01:01:03-07:00 0.6 diff --git a/static/favicon-192x192.png b/static/favicon-192x192.png deleted file mode 100644 index 2959efdf89..0000000000 Binary files a/static/favicon-192x192.png and /dev/null differ diff --git a/static/splash.png b/static/splash.png new file mode 100644 index 0000000000..582140a2bc Binary files /dev/null and b/static/splash.png differ diff --git a/stylesheets/screen.css b/stylesheets/screen.css index e664592251..b4caa4d613 100644 --- a/stylesheets/screen.css +++ b/stylesheets/screen.css @@ -26,4 +26,4 @@ * Email: dave@fontawesome.io * Twitter: http://twitter.com/davegandy * Work: Lead Product Designer @ Kyruus - http://kyruus.com - */@font-face{font-family:'FontAwesome';src:url("../font/fontawesome-webfont.eot?v=3.2.1");src:url("../font/fontawesome-webfont.eot?#iefix&v=3.2.1") format("embedded-opentype"),url("../font/fontawesome-webfont.woff?v=3.2.1") format("woff"),url("../font/fontawesome-webfont.ttf?v=3.2.1") format("truetype"),url("../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1") format("svg");font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em}[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none}.icon-large:before{vertical-align:-10%;font-size:1.33333em}a [class^="icon-"],a [class*=" icon-"]{display:inline}[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.14286em;text-align:right;padding-right:0.28571em}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.42857em}.icons-ul{margin-left:2.14286em;list-style-type:none}.icons-ul>li{position:relative}.icons-ul .icon-li{position:absolute;left:-2.14286em;width:2.14286em;text-align:center;line-height:inherit}[class^="icon-"].hide,[class*=" icon-"].hide{display:none}.icon-muted{color:#eee}.icon-light{color:#fff}.icon-dark{color:#333}.icon-border{border:solid 1px #eee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.icon-2x{font-size:2em}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.icon-3x{font-size:3em}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.icon-4x{font-size:4em}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.icon-5x{font-size:5em}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.pull-right{float:right}.pull-left{float:left}[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em}[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em}.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em}.icon-stack .icon-stack-base{font-size:2em;*line-height:1em}.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear}a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1)}.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2)}.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block}.icon-glass:before{content:"\f000"}.icon-music:before{content:"\f001"}.icon-search:before{content:"\f002"}.icon-envelope-alt:before{content:"\f003"}.icon-heart:before{content:"\f004"}.icon-star:before{content:"\f005"}.icon-star-empty:before{content:"\f006"}.icon-user:before{content:"\f007"}.icon-film:before{content:"\f008"}.icon-th-large:before{content:"\f009"}.icon-th:before{content:"\f00a"}.icon-th-list:before{content:"\f00b"}.icon-ok:before{content:"\f00c"}.icon-remove:before{content:"\f00d"}.icon-zoom-in:before{content:"\f00e"}.icon-zoom-out:before{content:"\f010"}.icon-power-off:before,.icon-off:before{content:"\f011"}.icon-signal:before{content:"\f012"}.icon-gear:before,.icon-cog:before{content:"\f013"}.icon-trash:before{content:"\f014"}.icon-home:before{content:"\f015"}.icon-file-alt:before{content:"\f016"}.icon-time:before{content:"\f017"}.icon-road:before{content:"\f018"}.icon-download-alt:before{content:"\f019"}.icon-download:before{content:"\f01a"}.icon-upload:before{content:"\f01b"}.icon-inbox:before{content:"\f01c"}.icon-play-circle:before{content:"\f01d"}.icon-rotate-right:before,.icon-repeat:before{content:"\f01e"}.icon-refresh:before{content:"\f021"}.icon-list-alt:before{content:"\f022"}.icon-lock:before{content:"\f023"}.icon-flag:before{content:"\f024"}.icon-headphones:before{content:"\f025"}.icon-volume-off:before{content:"\f026"}.icon-volume-down:before{content:"\f027"}.icon-volume-up:before{content:"\f028"}.icon-qrcode:before{content:"\f029"}.icon-barcode:before{content:"\f02a"}.icon-tag:before{content:"\f02b"}.icon-tags:before{content:"\f02c"}.icon-book:before{content:"\f02d"}.icon-bookmark:before{content:"\f02e"}.icon-print:before{content:"\f02f"}.icon-camera:before{content:"\f030"}.icon-font:before{content:"\f031"}.icon-bold:before{content:"\f032"}.icon-italic:before{content:"\f033"}.icon-text-height:before{content:"\f034"}.icon-text-width:before{content:"\f035"}.icon-align-left:before{content:"\f036"}.icon-align-center:before{content:"\f037"}.icon-align-right:before{content:"\f038"}.icon-align-justify:before{content:"\f039"}.icon-list:before{content:"\f03a"}.icon-indent-left:before{content:"\f03b"}.icon-indent-right:before{content:"\f03c"}.icon-facetime-video:before{content:"\f03d"}.icon-picture:before{content:"\f03e"}.icon-pencil:before{content:"\f040"}.icon-map-marker:before{content:"\f041"}.icon-adjust:before{content:"\f042"}.icon-tint:before{content:"\f043"}.icon-edit:before{content:"\f044"}.icon-share:before{content:"\f045"}.icon-check:before{content:"\f046"}.icon-move:before{content:"\f047"}.icon-step-backward:before{content:"\f048"}.icon-fast-backward:before{content:"\f049"}.icon-backward:before{content:"\f04a"}.icon-play:before{content:"\f04b"}.icon-pause:before{content:"\f04c"}.icon-stop:before{content:"\f04d"}.icon-forward:before{content:"\f04e"}.icon-fast-forward:before{content:"\f050"}.icon-step-forward:before{content:"\f051"}.icon-eject:before{content:"\f052"}.icon-chevron-left:before{content:"\f053"}.icon-chevron-right:before{content:"\f054"}.icon-plus-sign:before{content:"\f055"}.icon-minus-sign:before{content:"\f056"}.icon-remove-sign:before{content:"\f057"}.icon-ok-sign:before{content:"\f058"}.icon-question-sign:before{content:"\f059"}.icon-info-sign:before{content:"\f05a"}.icon-screenshot:before{content:"\f05b"}.icon-remove-circle:before{content:"\f05c"}.icon-ok-circle:before{content:"\f05d"}.icon-ban-circle:before{content:"\f05e"}.icon-arrow-left:before{content:"\f060"}.icon-arrow-right:before{content:"\f061"}.icon-arrow-up:before{content:"\f062"}.icon-arrow-down:before{content:"\f063"}.icon-mail-forward:before,.icon-share-alt:before{content:"\f064"}.icon-resize-full:before{content:"\f065"}.icon-resize-small:before{content:"\f066"}.icon-plus:before{content:"\f067"}.icon-minus:before{content:"\f068"}.icon-asterisk:before{content:"\f069"}.icon-exclamation-sign:before{content:"\f06a"}.icon-gift:before{content:"\f06b"}.icon-leaf:before{content:"\f06c"}.icon-fire:before{content:"\f06d"}.icon-eye-open:before{content:"\f06e"}.icon-eye-close:before{content:"\f070"}.icon-warning-sign:before{content:"\f071"}.icon-plane:before{content:"\f072"}.icon-calendar:before{content:"\f073"}.icon-random:before{content:"\f074"}.icon-comment:before{content:"\f075"}.icon-magnet:before{content:"\f076"}.icon-chevron-up:before{content:"\f077"}.icon-chevron-down:before{content:"\f078"}.icon-retweet:before{content:"\f079"}.icon-shopping-cart:before{content:"\f07a"}.icon-folder-close:before{content:"\f07b"}.icon-folder-open:before{content:"\f07c"}.icon-resize-vertical:before{content:"\f07d"}.icon-resize-horizontal:before{content:"\f07e"}.icon-bar-chart:before{content:"\f080"}.icon-twitter-sign:before{content:"\f081"}.icon-facebook-sign:before{content:"\f082"}.icon-camera-retro:before{content:"\f083"}.icon-key:before{content:"\f084"}.icon-gears:before,.icon-cogs:before{content:"\f085"}.icon-comments:before{content:"\f086"}.icon-thumbs-up-alt:before{content:"\f087"}.icon-thumbs-down-alt:before{content:"\f088"}.icon-star-half:before{content:"\f089"}.icon-heart-empty:before{content:"\f08a"}.icon-signout:before{content:"\f08b"}.icon-linkedin-sign:before{content:"\f08c"}.icon-pushpin:before{content:"\f08d"}.icon-external-link:before{content:"\f08e"}.icon-signin:before{content:"\f090"}.icon-trophy:before{content:"\f091"}.icon-github-sign:before{content:"\f092"}.icon-upload-alt:before{content:"\f093"}.icon-lemon:before{content:"\f094"}.icon-phone:before{content:"\f095"}.icon-unchecked:before,.icon-check-empty:before{content:"\f096"}.icon-bookmark-empty:before{content:"\f097"}.icon-phone-sign:before{content:"\f098"}.icon-twitter:before{content:"\f099"}.icon-facebook:before{content:"\f09a"}.icon-github:before{content:"\f09b"}.icon-unlock:before{content:"\f09c"}.icon-credit-card:before{content:"\f09d"}.icon-rss:before{content:"\f09e"}.icon-hdd:before{content:"\f0a0"}.icon-bullhorn:before{content:"\f0a1"}.icon-bell:before{content:"\f0a2"}.icon-certificate:before{content:"\f0a3"}.icon-hand-right:before{content:"\f0a4"}.icon-hand-left:before{content:"\f0a5"}.icon-hand-up:before{content:"\f0a6"}.icon-hand-down:before{content:"\f0a7"}.icon-circle-arrow-left:before{content:"\f0a8"}.icon-circle-arrow-right:before{content:"\f0a9"}.icon-circle-arrow-up:before{content:"\f0aa"}.icon-circle-arrow-down:before{content:"\f0ab"}.icon-globe:before{content:"\f0ac"}.icon-wrench:before{content:"\f0ad"}.icon-tasks:before{content:"\f0ae"}.icon-filter:before{content:"\f0b0"}.icon-briefcase:before{content:"\f0b1"}.icon-fullscreen:before{content:"\f0b2"}.icon-group:before{content:"\f0c0"}.icon-link:before{content:"\f0c1"}.icon-cloud:before{content:"\f0c2"}.icon-beaker:before{content:"\f0c3"}.icon-cut:before{content:"\f0c4"}.icon-copy:before{content:"\f0c5"}.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6"}.icon-save:before{content:"\f0c7"}.icon-sign-blank:before{content:"\f0c8"}.icon-reorder:before{content:"\f0c9"}.icon-list-ul:before{content:"\f0ca"}.icon-list-ol:before{content:"\f0cb"}.icon-strikethrough:before{content:"\f0cc"}.icon-underline:before{content:"\f0cd"}.icon-table:before{content:"\f0ce"}.icon-magic:before{content:"\f0d0"}.icon-truck:before{content:"\f0d1"}.icon-pinterest:before{content:"\f0d2"}.icon-pinterest-sign:before{content:"\f0d3"}.icon-google-plus-sign:before{content:"\f0d4"}.icon-google-plus:before{content:"\f0d5"}.icon-money:before{content:"\f0d6"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-columns:before{content:"\f0db"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-envelope:before{content:"\f0e0"}.icon-linkedin:before{content:"\f0e1"}.icon-rotate-left:before,.icon-undo:before{content:"\f0e2"}.icon-legal:before{content:"\f0e3"}.icon-dashboard:before{content:"\f0e4"}.icon-comment-alt:before{content:"\f0e5"}.icon-comments-alt:before{content:"\f0e6"}.icon-bolt:before{content:"\f0e7"}.icon-sitemap:before{content:"\f0e8"}.icon-umbrella:before{content:"\f0e9"}.icon-paste:before{content:"\f0ea"}.icon-lightbulb:before{content:"\f0eb"}.icon-exchange:before{content:"\f0ec"}.icon-cloud-download:before{content:"\f0ed"}.icon-cloud-upload:before{content:"\f0ee"}.icon-user-md:before{content:"\f0f0"}.icon-stethoscope:before{content:"\f0f1"}.icon-suitcase:before{content:"\f0f2"}.icon-bell-alt:before{content:"\f0f3"}.icon-coffee:before{content:"\f0f4"}.icon-food:before{content:"\f0f5"}.icon-file-text-alt:before{content:"\f0f6"}.icon-building:before{content:"\f0f7"}.icon-hospital:before{content:"\f0f8"}.icon-ambulance:before{content:"\f0f9"}.icon-medkit:before{content:"\f0fa"}.icon-fighter-jet:before{content:"\f0fb"}.icon-beer:before{content:"\f0fc"}.icon-h-sign:before{content:"\f0fd"}.icon-plus-sign-alt:before{content:"\f0fe"}.icon-double-angle-left:before{content:"\f100"}.icon-double-angle-right:before{content:"\f101"}.icon-double-angle-up:before{content:"\f102"}.icon-double-angle-down:before{content:"\f103"}.icon-angle-left:before{content:"\f104"}.icon-angle-right:before{content:"\f105"}.icon-angle-up:before{content:"\f106"}.icon-angle-down:before{content:"\f107"}.icon-desktop:before{content:"\f108"}.icon-laptop:before{content:"\f109"}.icon-tablet:before{content:"\f10a"}.icon-mobile-phone:before{content:"\f10b"}.icon-circle-blank:before{content:"\f10c"}.icon-quote-left:before{content:"\f10d"}.icon-quote-right:before{content:"\f10e"}.icon-spinner:before{content:"\f110"}.icon-circle:before{content:"\f111"}.icon-mail-reply:before,.icon-reply:before{content:"\f112"}.icon-github-alt:before{content:"\f113"}.icon-folder-close-alt:before{content:"\f114"}.icon-folder-open-alt:before{content:"\f115"}.icon-expand-alt:before{content:"\f116"}.icon-collapse-alt:before{content:"\f117"}.icon-smile:before{content:"\f118"}.icon-frown:before{content:"\f119"}.icon-meh:before{content:"\f11a"}.icon-gamepad:before{content:"\f11b"}.icon-keyboard:before{content:"\f11c"}.icon-flag-alt:before{content:"\f11d"}.icon-flag-checkered:before{content:"\f11e"}.icon-terminal:before{content:"\f120"}.icon-code:before{content:"\f121"}.icon-reply-all:before{content:"\f122"}.icon-mail-reply-all:before{content:"\f122"}.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123"}.icon-location-arrow:before{content:"\f124"}.icon-crop:before{content:"\f125"}.icon-code-fork:before{content:"\f126"}.icon-unlink:before{content:"\f127"}.icon-question:before{content:"\f128"}.icon-info:before{content:"\f129"}.icon-exclamation:before{content:"\f12a"}.icon-superscript:before{content:"\f12b"}.icon-subscript:before{content:"\f12c"}.icon-eraser:before{content:"\f12d"}.icon-puzzle-piece:before{content:"\f12e"}.icon-microphone:before{content:"\f130"}.icon-microphone-off:before{content:"\f131"}.icon-shield:before{content:"\f132"}.icon-calendar-empty:before{content:"\f133"}.icon-fire-extinguisher:before{content:"\f134"}.icon-rocket:before{content:"\f135"}.icon-maxcdn:before{content:"\f136"}.icon-chevron-sign-left:before{content:"\f137"}.icon-chevron-sign-right:before{content:"\f138"}.icon-chevron-sign-up:before{content:"\f139"}.icon-chevron-sign-down:before{content:"\f13a"}.icon-html5:before{content:"\f13b"}.icon-css3:before{content:"\f13c"}.icon-anchor:before{content:"\f13d"}.icon-unlock-alt:before{content:"\f13e"}.icon-bullseye:before{content:"\f140"}.icon-ellipsis-horizontal:before{content:"\f141"}.icon-ellipsis-vertical:before{content:"\f142"}.icon-rss-sign:before{content:"\f143"}.icon-play-sign:before{content:"\f144"}.icon-ticket:before{content:"\f145"}.icon-minus-sign-alt:before{content:"\f146"}.icon-check-minus:before{content:"\f147"}.icon-level-up:before{content:"\f148"}.icon-level-down:before{content:"\f149"}.icon-check-sign:before{content:"\f14a"}.icon-edit-sign:before{content:"\f14b"}.icon-external-link-sign:before{content:"\f14c"}.icon-share-sign:before{content:"\f14d"}.icon-compass:before{content:"\f14e"}.icon-collapse:before{content:"\f150"}.icon-collapse-top:before{content:"\f151"}.icon-expand:before{content:"\f152"}.icon-euro:before,.icon-eur:before{content:"\f153"}.icon-gbp:before{content:"\f154"}.icon-dollar:before,.icon-usd:before{content:"\f155"}.icon-rupee:before,.icon-inr:before{content:"\f156"}.icon-yen:before,.icon-jpy:before{content:"\f157"}.icon-renminbi:before,.icon-cny:before{content:"\f158"}.icon-won:before,.icon-krw:before{content:"\f159"}.icon-bitcoin:before,.icon-btc:before{content:"\f15a"}.icon-file:before{content:"\f15b"}.icon-file-text:before{content:"\f15c"}.icon-sort-by-alphabet:before{content:"\f15d"}.icon-sort-by-alphabet-alt:before{content:"\f15e"}.icon-sort-by-attributes:before{content:"\f160"}.icon-sort-by-attributes-alt:before{content:"\f161"}.icon-sort-by-order:before{content:"\f162"}.icon-sort-by-order-alt:before{content:"\f163"}.icon-thumbs-up:before{content:"\f164"}.icon-thumbs-down:before{content:"\f165"}.icon-youtube-sign:before{content:"\f166"}.icon-youtube:before{content:"\f167"}.icon-xing:before{content:"\f168"}.icon-xing-sign:before{content:"\f169"}.icon-youtube-play:before{content:"\f16a"}.icon-dropbox:before{content:"\f16b"}.icon-stackexchange:before{content:"\f16c"}.icon-instagram:before{content:"\f16d"}.icon-flickr:before{content:"\f16e"}.icon-adn:before{content:"\f170"}.icon-bitbucket:before{content:"\f171"}.icon-bitbucket-sign:before{content:"\f172"}.icon-tumblr:before{content:"\f173"}.icon-tumblr-sign:before{content:"\f174"}.icon-long-arrow-down:before{content:"\f175"}.icon-long-arrow-up:before{content:"\f176"}.icon-long-arrow-left:before{content:"\f177"}.icon-long-arrow-right:before{content:"\f178"}.icon-apple:before{content:"\f179"}.icon-windows:before{content:"\f17a"}.icon-android:before{content:"\f17b"}.icon-linux:before{content:"\f17c"}.icon-dribbble:before{content:"\f17d"}.icon-skype:before{content:"\f17e"}.icon-foursquare:before{content:"\f180"}.icon-trello:before{content:"\f181"}.icon-female:before{content:"\f182"}.icon-male:before{content:"\f183"}.icon-gittip:before{content:"\f184"}.icon-sun:before{content:"\f185"}.icon-moon:before{content:"\f186"}.icon-archive:before{content:"\f187"}.icon-bug:before{content:"\f188"}.icon-vk:before{content:"\f189"}.icon-weibo:before{content:"\f18a"}.icon-renren:before{content:"\f18b"}body,html{background-color:#f5f5f5;color:#222;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;height:100%}a{color:#049cdb;text-decoration:none}a:visited{color:#0378a9}.menu a{color:#049cdb}.gist{font-size:0.75em}@media only screen and (max-width: 480px){.title.indent::before{display:none}}.title.indent::before{content:"// ";color:#049cdb}.divider,.usp hr,.hero hr{border:none;border-bottom:2px solid #049cdb;clear:both;margin:2em 0}article.post img,article.page img,article.listing img{border:5px solid #fff;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,0.25)}article.post img.right,article.page img.right,article.listing img.right{float:right;margin:0 0 10px 20px}article.post img.left,article.page img.left,article.listing img.left{float:left;margin:0 20px 10px 0}.grid-wrapper{margin:auto;max-width:1100px;padding:0 25px}.grid-center{text-align:center}.grid-center>.grid__item{text-align:left}body>header{-webkit-box-shadow:0 0 3px rgba(0,0,0,0.25);-moz-box-shadow:0 0 3px rgba(0,0,0,0.25);-ms-box-shadow:0 0 3px rgba(0,0,0,0.25);-o-box-shadow:0 0 3px rgba(0,0,0,0.25);box-shadow:0 0 3px rgba(0,0,0,0.25);background-color:#fff;margin-bottom:2em}body>header .site-title{color:#222;font-size:1.7em;font-weight:bold;line-height:2.5em}body{-webkit-animation:bugfix infinite 1s}@-webkit-keyframes bugfix{from{padding:0}to{padding:0}}.header{position:relative}#toggle,.toggle{display:none}.menu li{list-style:none;float:left}@media only screen and (max-width: 790px){.menu{display:none;opacity:0;width:100%;position:absolute;right:0}.menu li{display:block;width:100%;margin:0}.menu li a{display:block;width:100%;text-decoration:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.toggle{display:block;position:relative;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}#toggle:checked ~ .menu{display:block;opacity:1;z-index:999}}ul.menu li{position:relative}ul.menu li:hover ul{display:block}ul.menu li ul{display:none;z-index:10;position:absolute;top:68px;margin-left:0;background-color:white}ul.menu li ul li{white-space:nowrap;float:none}ul.menu li ul li a{display:block;padding:20px 10px}ul.menu li ul li a:hover,ul.menu li ul li a:focus{background:#eee}header .grid{height:68px}.menu{margin:0;top:68px}.menu li a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;-o-transition:all 0.25s linear;transition:all 0.25s linear;display:block;padding:32px 20px;text-decoration:none;font-weight:normal;font-size:16px;line-height:1}.menu>li>a:hover,.menu>li>a:focus{background:#f5f5f5;box-shadow:inset 0px 5px #049cdb;color:#049cdb;padding:40px 20px 24px}.toggle{z-index:20}@media only screen and (max-width: 790px){.menu{background:#fff;border-top:1px solid #049cdb;border-bottom:4px solid #049cdb}.menu,.menu li,.menu li a{height:auto}.menu li a{padding:15px 15px !important}.menu li a:hover,.menu li a:focus{background:#eee;box-shadow:inset 5px 0px #049cdb;padding:15px 15px 15px 25px}.toggle{position:absolute;top:17px;right:10px}.toggle::after{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:all 0.5s linear;-moz-transition:all 0.5s linear;-o-transition:all 0.5s linear;transition:all 0.5s linear;font-family:"FontAwesome";content:"\f0c9";display:inline-block;width:100%;padding:10px 15px;background:#049cdb;text-align:center;font-size:12px;color:#fff;white-space:nowrap}.toggle:hover::after{background:#0383b8}#toggle:checked+.toggle::after{content:attr(data-close)}ul.menu li ul{display:block;position:relative;top:0}}#page-wrap{min-height:100%;margin-bottom:-100px}#page-wrap::after{content:"";display:block;height:100px}body>footer{-webkit-box-shadow:0 0 3px rgba(0,0,0,0.25);-moz-box-shadow:0 0 3px rgba(0,0,0,0.25);-ms-box-shadow:0 0 3px rgba(0,0,0,0.25);-o-box-shadow:0 0 3px rgba(0,0,0,0.25);box-shadow:0 0 3px rgba(0,0,0,0.25);background-color:#fff;margin-top:3em}.copyright{margin:0;padding:20px 0;text-align:center}article blockquote{border-left:2px solid #049cdb;color:#484848;font-family:Georgia,"Times New Roman",Times,serif;font-size:1.25em;font-style:italic;padding-left:15px}article blockquote footer{float:right;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.8em}article blockquote footer strong::after{content:" \2014 "}article blockquote footer a{text-decoration:underline}article .pullquote-left::before,article .pullquote-right::before{border:medium none;color:#049cdb;content:"\201C" attr(data-pullquote) "\201D";float:right;font-family:Georgia,"Times New Roman",Times,serif;font-size:1.4em;font-style:italic;line-height:1.45em;margin:0.3em 0 1em 1.5em;padding:0;position:relative;top:7px;width:45%}@media only screen and (max-width: 480px){article .pullquote-left::before,article .pullquote-right::before{border-top:1px dotted #049cdb;border-bottom:1px dotted #049cdb;padding:0 10px;width:100%}}article .tags{display:inline}article .tags li{margin-right:2px}article .tags li::after{content:","}article .tags li:last-child::after{content:""}article .tags li a{color:#555;text-decoration:none}article .tags li a:hover{text-decoration:underline}article .meta{font-size:12px;padding:0 0 5px}article .meta>*{margin-right:15px;white-space:nowrap}article .meta>*:last-child{margin-right:0}article .meta .comments::before{content:"\f075";font-family:"FontAwesome";padding-right:3px}article.listing{margin-bottom:20px}article.listing h1{margin-bottom:0}article.listing h1 a{color:#049cdb;text-decoration:none}article.listing .entry-content{margin:10px 0}article.listing+hr{border:none;border-bottom:1px solid #049cdb}@media only screen and (max-width: 480px){article.post .tags{clear:both;margin-top:7px}}article.post h1{margin-bottom:0}article.post .meta{border-bottom:1px solid #049cdb;margin-bottom:20px}#archive-list article h1{margin-bottom:0}.sans,html .gist .gist-file .gist-meta{font-family:"Helvetica Neue",Arial,sans-serif}.mono,pre,p code,li code{font-family:Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace}.highlight table{margin-bottom:0}.highlight .gutter,.highlight .code{padding:0}.highlight .gutter .line-number{display:block}.highlight,html .gist .gist-file .gist-syntax .gist-highlight{border:1px solid #05232b !important}.highlight table td.code,html .gist .gist-file .gist-syntax .gist-highlight table td.code{width:100%}.highlight .line-numbers,html .gist .gist-file .gist-syntax .highlight .line_numbers{text-align:right;font-size:13px;line-height:1.45em;background:#073642 url('/images/noise.png?1419195603') top left !important;border-right:1px solid #00232c !important;-webkit-box-shadow:#083e4b -1px 0 inset;-moz-box-shadow:#083e4b -1px 0 inset;-ms-box-shadow:#083e4b -1px 0 inset;-o-box-shadow:#083e4b -1px 0 inset;box-shadow:#083e4b -1px 0 inset;text-shadow:#021014 0 -1px;padding:.8em !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.highlight .line-numbers span,html .gist .gist-file .gist-syntax .highlight .line_numbers span{color:#586e75 !important}figure.code,.gist-file,pre{-webkit-box-shadow:rgba(0,0,0,0.06) 0 0 10px;-moz-box-shadow:rgba(0,0,0,0.06) 0 0 10px;-ms-box-shadow:rgba(0,0,0,0.06) 0 0 10px;-o-box-shadow:rgba(0,0,0,0.06) 0 0 10px;box-shadow:rgba(0,0,0,0.06) 0 0 10px}figure.code .highlight pre,.gist-file .highlight pre,pre .highlight pre{-webkit-box-shadow:none;-moz-box-shadow:none;-ms-box-shadow:none;-o-box-shadow:none;box-shadow:none}.gist .highlight *::-moz-selection,figure.code .highlight *::-moz-selection{background:#386774;color:inherit;text-shadow:#002b36 0 1px}.gist .highlight *::-webkit-selection,figure.code .highlight *::-webkit-selection{background:#386774;color:inherit;text-shadow:#002b36 0 1px}.gist .highlight *::selection,figure.code .highlight *::selection{background:#386774;color:inherit;text-shadow:#002b36 0 1px}html .gist .gist-file{margin-bottom:1.8em;position:relative;border:none;padding-top:26px !important}html .gist .gist-file .highlight{margin-bottom:0}html .gist .gist-file .gist-syntax{border-bottom:0 !important;background:none !important}html .gist .gist-file .gist-syntax .gist-highlight{background:#002b36 !important}html .gist .gist-file .gist-syntax .highlight pre{padding:0}html .gist .gist-file .gist-meta{padding:.6em 0.8em;border:1px solid #083e4b !important;color:#586e75;font-size:.7em !important;background:#073642 url('/images/noise.png?1419195603') top left;line-height:1.5em}html .gist .gist-file .gist-meta a{color:#75878b !important}html .gist .gist-file .gist-meta a:hover{color:#93a1a1 !important}html .gist .gist-file .gist-meta a[href*='#file']{position:absolute;top:0;left:0;right:-10px;color:#474747 !important}html .gist .gist-file .gist-meta a[href*='#file']:hover{color:#049cdb !important}html .gist .gist-file .gist-meta a[href*=raw]{top:.4em}pre{background:#002b36 url('/images/noise.png?1419195603') top left;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;border-radius:0.4em;border:1px solid #05232b;line-height:1.45em;font-size:13px;margin-bottom:2.1em;padding:.8em 1em;color:#93a1a1;overflow:auto}h3.filename+pre{-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px}p code,li code{display:inline-block;white-space:no-wrap;background:#fff;font-size:.8em;line-height:1.5em;color:#555;border:1px solid #ddd;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;border-radius:0.4em;padding:0 .3em;margin:-1px 0}p pre code,li pre code{font-size:1em !important;background:none;border:none}.pre-code,html .gist .gist-file .gist-syntax .highlight pre,.highlight code{font-family:Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace !important;overflow:scroll;overflow-y:hidden;display:block;padding:.8em;overflow-x:auto;line-height:1.45em;background:#002b36 url('/images/noise.png?1419195603') top left !important;color:#93a1a1 !important}.pre-code span,html .gist .gist-file .gist-syntax .highlight pre span,.highlight code span{color:#93a1a1 !important}.pre-code span,html .gist .gist-file .gist-syntax .highlight pre span,.highlight code span{font-style:normal !important;font-weight:normal !important}.pre-code .c,html .gist .gist-file .gist-syntax .highlight pre .c,.highlight code .c{color:#586e75 !important;font-style:italic !important}.pre-code .cm,html .gist .gist-file .gist-syntax .highlight pre .cm,.highlight code .cm{color:#586e75 !important;font-style:italic !important}.pre-code .cp,html .gist .gist-file .gist-syntax .highlight pre .cp,.highlight code .cp{color:#586e75 !important;font-style:italic !important}.pre-code .c1,html .gist .gist-file .gist-syntax .highlight pre .c1,.highlight code .c1{color:#586e75 !important;font-style:italic !important}.pre-code .cs,html .gist .gist-file .gist-syntax .highlight pre .cs,.highlight code .cs{color:#586e75 !important;font-weight:bold !important;font-style:italic !important}.pre-code .err,html .gist .gist-file .gist-syntax .highlight pre .err,.highlight code .err{color:#dc322f !important;background:none !important}.pre-code .k,html .gist .gist-file .gist-syntax .highlight pre .k,.highlight code .k{color:#cb4b16 !important}.pre-code .o,html .gist .gist-file .gist-syntax .highlight pre .o,.highlight code .o{color:#93a1a1 !important;font-weight:bold !important}.pre-code .p,html .gist .gist-file .gist-syntax .highlight pre .p,.highlight code .p{color:#93a1a1 !important}.pre-code .ow,html .gist .gist-file .gist-syntax .highlight pre .ow,.highlight code .ow{color:#2aa198 !important;font-weight:bold !important}.pre-code .gd,html .gist .gist-file .gist-syntax .highlight pre .gd,.highlight code .gd{color:#93a1a1 !important;background-color:#372c34 !important;display:inline-block}.pre-code .gd .x,html .gist .gist-file .gist-syntax .highlight pre .gd .x,.highlight code .gd .x{color:#93a1a1 !important;background-color:#4d2d33 !important;display:inline-block}.pre-code .ge,html .gist .gist-file .gist-syntax .highlight pre .ge,.highlight code .ge{color:#93a1a1 !important;font-style:italic !important}.pre-code .gh,html .gist .gist-file .gist-syntax .highlight pre .gh,.highlight code .gh{color:#586e75 !important}.pre-code .gi,html .gist .gist-file .gist-syntax .highlight pre .gi,.highlight code .gi{color:#93a1a1 !important;background-color:#1a412b !important;display:inline-block}.pre-code .gi .x,html .gist .gist-file .gist-syntax .highlight pre .gi .x,.highlight code .gi .x{color:#93a1a1 !important;background-color:#355720 !important;display:inline-block}.pre-code .gs,html .gist .gist-file .gist-syntax .highlight pre .gs,.highlight code .gs{color:#93a1a1 !important;font-weight:bold !important}.pre-code .gu,html .gist .gist-file .gist-syntax .highlight pre .gu,.highlight code .gu{color:#6c71c4 !important}.pre-code .kc,html .gist .gist-file .gist-syntax .highlight pre .kc,.highlight code .kc{color:#859900 !important;font-weight:bold !important}.pre-code .kd,html .gist .gist-file .gist-syntax .highlight pre .kd,.highlight code .kd{color:#268bd2 !important}.pre-code .kp,html .gist .gist-file .gist-syntax .highlight pre .kp,.highlight code .kp{color:#cb4b16 !important;font-weight:bold !important}.pre-code .kr,html .gist .gist-file .gist-syntax .highlight pre .kr,.highlight code .kr{color:#d33682 !important;font-weight:bold !important}.pre-code .kt,html .gist .gist-file .gist-syntax .highlight pre .kt,.highlight code .kt{color:#2aa198 !important}.pre-code .n,html .gist .gist-file .gist-syntax .highlight pre .n,.highlight code .n{color:#268bd2 !important}.pre-code .na,html .gist .gist-file .gist-syntax .highlight pre .na,.highlight code .na{color:#268bd2 !important}.pre-code .nb,html .gist .gist-file .gist-syntax .highlight pre .nb,.highlight code .nb{color:#859900 !important}.pre-code .nc,html .gist .gist-file .gist-syntax .highlight pre .nc,.highlight code .nc{color:#d33682 !important}.pre-code .no,html .gist .gist-file .gist-syntax .highlight pre .no,.highlight code .no{color:#b58900 !important}.pre-code .nl,html .gist .gist-file .gist-syntax .highlight pre .nl,.highlight code .nl{color:#859900 !important}.pre-code .ne,html .gist .gist-file .gist-syntax .highlight pre .ne,.highlight code .ne{color:#268bd2 !important;font-weight:bold !important}.pre-code .nf,html .gist .gist-file .gist-syntax .highlight pre .nf,.highlight code .nf{color:#268bd2 !important;font-weight:bold !important}.pre-code .nn,html .gist .gist-file .gist-syntax .highlight pre .nn,.highlight code .nn{color:#b58900 !important}.pre-code .nt,html .gist .gist-file .gist-syntax .highlight pre .nt,.highlight code .nt{color:#268bd2 !important;font-weight:bold !important}.pre-code .nx,html .gist .gist-file .gist-syntax .highlight pre .nx,.highlight code .nx{color:#b58900 !important}.pre-code .vg,html .gist .gist-file .gist-syntax .highlight pre .vg,.highlight code .vg{color:#268bd2 !important}.pre-code .vi,html .gist .gist-file .gist-syntax .highlight pre .vi,.highlight code .vi{color:#268bd2 !important}.pre-code .nv,html .gist .gist-file .gist-syntax .highlight pre .nv,.highlight code .nv{color:#268bd2 !important}.pre-code .mf,html .gist .gist-file .gist-syntax .highlight pre .mf,.highlight code .mf{color:#2aa198 !important}.pre-code .m,html .gist .gist-file .gist-syntax .highlight pre .m,.highlight code .m{color:#2aa198 !important}.pre-code .mh,html .gist .gist-file .gist-syntax .highlight pre .mh,.highlight code .mh{color:#2aa198 !important}.pre-code .mi,html .gist .gist-file .gist-syntax .highlight pre .mi,.highlight code .mi{color:#2aa198 !important}.pre-code .s,html .gist .gist-file .gist-syntax .highlight pre .s,.highlight code .s{color:#2aa198 !important}.pre-code .sd,html .gist .gist-file .gist-syntax .highlight pre .sd,.highlight code .sd{color:#2aa198 !important}.pre-code .s2,html .gist .gist-file .gist-syntax .highlight pre .s2,.highlight code .s2{color:#2aa198 !important}.pre-code .se,html .gist .gist-file .gist-syntax .highlight pre .se,.highlight code .se{color:#dc322f !important}.pre-code .si,html .gist .gist-file .gist-syntax .highlight pre .si,.highlight code .si{color:#268bd2 !important}.pre-code .sr,html .gist .gist-file .gist-syntax .highlight pre .sr,.highlight code .sr{color:#2aa198 !important}.pre-code .s1,html .gist .gist-file .gist-syntax .highlight pre .s1,.highlight code .s1{color:#2aa198 !important}.pre-code div .gd,html .gist .gist-file .gist-syntax .highlight pre div .gd,.highlight code div .gd,.pre-code div .gd .x,html .gist .gist-file .gist-syntax .highlight pre div .gd .x,.highlight code div .gd .x,.pre-code div .gi,html .gist .gist-file .gist-syntax .highlight pre div .gi,.highlight code div .gi,.pre-code div .gi .x,html .gist .gist-file .gist-syntax .highlight pre div .gi .x,.highlight code div .gi .x{display:inline-block;width:100%}.highlight,.gist-highlight{margin-bottom:1.8em;background:#002b36;overflow-y:hidden;overflow-x:auto}.highlight pre,.gist-highlight pre{background:none;-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px;border:none;padding:0;margin-bottom:0}pre::-webkit-scrollbar,.highlight::-webkit-scrollbar,.gist-highlight::-webkit-scrollbar{height:.5em;background:rgba(255,255,255,0.15)}pre::-webkit-scrollbar-thumb:horizontal,.highlight::-webkit-scrollbar-thumb:horizontal,.gist-highlight::-webkit-scrollbar-thumb:horizontal{background:rgba(255,255,255,0.2);-webkit-border-radius:4px;border-radius:4px}.highlight code{background:#000}figure.code{background:none;padding:0;border:0;margin-bottom:1.5em}figure.code pre{margin-bottom:0}figure.code figcaption{position:relative}figure.code .highlight{margin-bottom:0}.code-title,html .gist .gist-file .gist-meta a[href*='#file'],h3.filename,figure.code figcaption{text-align:center;font-size:13px;line-height:2em;text-shadow:#cbcccc 0 1px 0;color:#474747;font-weight:normal;margin-bottom:0;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;font-family:"Helvetica Neue", Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif;background:#aaa url('/images/code_bg.png?1419195603') top repeat-x;border:1px solid #565656;border-top-color:#cbcbcb;border-left-color:#a5a5a5;border-right-color:#a5a5a5;border-bottom:0}.download-source,html .gist .gist-file .gist-meta a[href*=raw],figure.code figcaption a{position:absolute;right:.8em;color:#666 !important;z-index:1;font-size:13px;text-shadow:#cbcccc 0 1px 0;padding-left:3em}@media only screen and (min-width: 1024px){.aside-module:first-child .title{margin-top:0}}.aside-module .title{border-bottom:1px solid #049cdb;color:#333;margin:1em 0 0.5em;padding-bottom:5px}.aside-module .title .btn{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:5px 10px;text-decoration:none}.aside-module .loading{display:block;font-size:2em;text-align:center}#github-repos li p{font-size:0.6em;margin-bottom:0}#pinboard .pin-item>p{margin-bottom:0}#pinboard .pin-item>p a:hover{text-decoration:underline}#pinboard .pin-item>p a::after{content:","}#pinboard .pin-item>p a:last-child::after{content:""}@media only screen and (min-width: 481px){.social ul{-webkit-column-count:2;-moz-column-count:2;column-count:2;-webkit-column-gap:10px;-moz-column-gap:10px;column-gap:10px}}.social a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#e8e8e8;border:1px solid #dcdcdc;border-radius:4px;color:#222;display:inline-block;font-size:0.8em;margin-bottom:7px;padding:1em;padding-right:0.5em;position:relative;text-decoration:none;width:100%;z-index:5;-webkit-transition:box-shadow 200ms,color 400ms,transform 400ms;-moz-transition:box-shadow 200ms,color 400ms,transform 400ms;-o-transition:box-shadow 200ms,color 400ms,transform 400ms;transition:box-shadow 200ms,color 400ms,transform 400ms}.social a:hover{color:#fff !important;text-decoration:none;text-shadow:1px 1px 0 rgba(0,0,0,0.25);z-index:7}.social a:hover::before{border:1px solid #000;height:100%;top:0;width:100%}.social a::before{background-color:#222;border-radius:4px;content:"";height:1px;position:absolute;top:50%;left:0%;width:0;z-index:-1;-webkit-transition:border 200ms,height 200ms 200ms,top 200ms 200ms,width 200ms;-moz-transition:border 200ms,height 200ms 200ms,top 200ms 200ms,width 200ms;-o-transition:border 200ms,height 200ms 200ms,top 200ms 200ms,width 200ms;transition:border 200ms,height 200ms 200ms,top 200ms 200ms,width 200ms}.social a i{font-size:2em;line-height:0.8em;margin-right:0.35em}.social a.adn{color:#4a484c}.social a.adn::before{background-color:#4a484c;border-color:#3d3c3f}.social a.dribbble{color:#ea4c89}.social a.dribbble::before{background-color:#ea4c89;border-color:#e7357a}.social a.facebook{color:#3b5998}.social a.facebook::before{background-color:#3b5998;border-color:#344e86}.social a.github{color:#333}.social a.github::before{background-color:#333;border-color:#262626}.social a.gplus{color:#db4a39}.social a.gplus::before{background-color:#db4a39;border-color:#d43927}.social a.linkedin{color:#4875b4}.social a.linkedin::before{background-color:#4875b4;border-color:#4169a2}.social a.pinterest{color:#cc2127}.social a.pinterest::before{background-color:#cc2127;border-color:#b61d23}.social a.stackoverflow{color:#fe7a15}.social a.stackoverflow::before{background-color:#fe7a15;border-color:#f86c01}.social a.twitter{color:#00a0d1}.social a.twitter::before{background-color:#00a0d1;border-color:#008cb7}.social a.youtube{color:#cc181e}.social a.youtube::before{background-color:#cc181e;border-color:#b5151b}.usp{text-align:center}@media only screen and (min-width: 481px) and (max-width: 1023px){.usp{margin-bottom:25px}}.usp .icon i{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;border:10px solid #049cdb;color:#222;display:inline-block;font-size:6em;height:1.85em;line-height:normal;padding:0.3em;width:1.85em}.usp .title{color:#222;font-size:1.1em;line-height:3em;margin:0;text-align:center;text-transform:capitalize}.usp .title+hr{margin:0;margin-bottom:1em}.usp hr{margin-bottom:1em}.usp p{text-align:left}.hero{background-color:#0b6b94;background-position:0 50%;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;border-bottom:1px solid #fff;color:#fff;font-weight:bold;margin-top:-2em;margin-bottom:1.5em;padding:50px 0;position:relative}.hero>.grid-wrapper{position:relative;z-index:7}.hero .credit{font-size:0.75em;font-style:italic;position:absolute;bottom:0;right:10px;z-index:7}.hero .credit a{border-bottom:1px solid;color:#fff;text-decoration:none}.hero .credit .licence{border:none}.hero .avatar{text-align:center}@media only screen and (max-width: 1023px){.hero .avatar{margin-bottom:30px}}.hero .avatar img{-webkit-border-radius:100%;-moz-border-radius:100%;border-radius:100%;border:10px solid #049cdb}.hero h1{font-size:3.5em;line-height:1em;text-shadow:2px 2px 0 rgba(0,0,0,0.75)}.hero hr{box-shadow:1px 1px 0 rgba(0,0,0,0.75)}.hero p{text-shadow:1px 1px 0 rgba(0,0,0,0.75)}.hero p small{color:#eee;font-size:.65em}.pull-left{float:left}.pull-right{float:right}.clearfix,article blockquote{*zoom:1}.clearfix::before,article blockquote::before,.clearfix::after,article blockquote::after{display:table;content:"";line-height:0}.clearfix::after,article blockquote::after{clear:both}ul.unstyled,ul.inline,article ul.tags,ul.divided,ol.unstyled,ol.inline,article ol.tags,ol.divided{list-style-type:none;margin:0}ul.inline,article ul.tags,ol.inline,article ol.tags{list-style-type:none}ul.inline>li,article ul.tags>li,ol.inline>li,article ol.tags>li{display:inline}ul.divided>li,ol.divided>li{border-top:1px solid #fff;border-bottom:1px solid #e8e8e8;padding:0.5em 0}ul.divided>li:first-child,ol.divided>li:first-child{border-top:none;padding-top:0}ul.divided>li:last-child,ol.divided>li:last-child{border-bottom:none}.btn{background-color:#0494d1;background-image:-moz-linear-gradient(top, #049cdb, #048ac2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#049cdb), to(#048ac2));background-image:-webkit-linear-gradient(top, #049cdb, #048ac2);background-image:-o-linear-gradient(top, #049cdb, #048ac2);background-image:linear-gradient(to bottom, #049cdb,#048ac2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF049CDB', endColorstr='#FF048AC2', GradientType=0);-webkit-box-shadow:0 0 3px rgba(0,0,0,0.25);-moz-box-shadow:0 0 3px rgba(0,0,0,0.25);-ms-box-shadow:0 0 3px rgba(0,0,0,0.25);-o-box-shadow:0 0 3px rgba(0,0,0,0.25);box-shadow:0 0 3px rgba(0,0,0,0.25);border-radius:3px;color:#fff;display:inline-block;padding:7px 15px;text-decoration:none;text-shadow:1px 1px 0 rgba(0,0,0,0.25)}.btn:hover{text-decoration:underline}.btn:visited{color:#fff}.grid{letter-spacing:-1rem}.opera:-o-prefocus,.grid{word-spacing:-1rem}.grid__item{letter-spacing:normal;word-spacing:normal}@media only screen and (min-width: 481px){.flex{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-moz-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:start;-moz-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.flex__item{-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0;-webkit-box-flex:0;-moz-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}}.supported-brands{text-align:center}.supported-brands img{border:none !important;box-shadow:none !important;max-height:50px;max-width:200px;margin:10px}.brand{border:none !important;box-shadow:none !important;max-height:50px;max-width:200px;margin:10px}.brand.overview{max-width:100px}h1:hover a.title-link,h2:hover a.title-link,h3:hover a.title-link,h4:hover a.title-link,h5:hover a.title-link,h6:hover a.title-link{position:relative}h1:hover a.title-link::before,h2:hover a.title-link::before,h3:hover a.title-link::before,h4:hover a.title-link::before,h5:hover a.title-link::before,h6:hover a.title-link::before{position:absolute;left:-50px;padding-right:40px;font-family:"FontAwesome";content:"\f0c1"}.ha-title{white-space:nowrap}.ha-title img{width:40px;vertical-align:middle}.usp ul{text-align:left;margin-left:27px;margin-top:-18px}.usp .icon i{border:none !important}.hero-buttons a{margin:0 30px 10px 0}.hero-buttons a:last-child{margin:0}article.post img,article.post table,article.page img,article.page table,article.listing img,article.listing table{border-radius:3px;box-shadow:rgba(0,0,0,0.06) 0 0 10px}article.post img.no-shadow,article.page img.no-shadow,article.listing img.no-shadow{border:0;box-shadow:none}article.post>table,article.page>table,article.listing>table{background-color:#F3FCF5}article.post p.img,article.page p.img,article.listing p.img{background-color:#FFF;border-radius:5px;text-align:center;padding-bottom:3px;font-size:.9rem;box-shadow:rgba(0,0,0,0.06) 0 0 10px}article.post p.img img,article.page p.img img,article.listing p.img img{display:block;box-shadow:none;margin:0 auto}article.post li,article.page li,article.listing li{margin-bottom:10px}article.post li>p,article.page li>p,article.listing li>p{margin-bottom:0}article.post li:last-child,article.page li:last-child,article.listing li:last-child{margin-bottom:0}p.note{position:relative;background:#e7f2fa;padding:40px 12px 6px 12px;box-shadow:rgba(0,0,0,0.06) 0 0 10px}p.note::before{font-family:"FontAwesome";content:"\f05a" " Note " attr(data-title);background-color:#6ab0de;color:white;font-weight:bold;border-top-left-radius:3px;border-top-right-radius:3px;padding:6px 14px;line-height:1.5em;position:absolute;top:0;left:0;right:0}p.note.warning{background-color:#F7F9E1}p.note.warning::before{background-color:#bbb90d;content:"\f071" " Warning " attr(data-title)}.install-instructions-container #normal-install,.install-instructions-container #raspberry-install,.install-instructions-container #docker-install,.install-instructions-container .install-instructions{display:none}.install-instructions-container label.menu-selector{display:inline-block;text-align:center;padding:20px;white-space:nowrap;border-bottom:5px solid #999;transition:border-bottom-color .5s}.install-instructions-container label.menu-selector+label.menu-selector{margin-left:10px}.install-instructions-container #normal-install:checked ~ .menu-selector.normal,.install-instructions-container #raspberry-install:checked ~ .menu-selector.raspberry,.install-instructions-container #docker-install:checked ~ .menu-selector.docker{border-bottom-color:#049cdb}.install-instructions-container #normal-install:checked ~ .install-instructions.normal,.install-instructions-container #raspberry-install:checked ~ .install-instructions.raspberry,.install-instructions-container #docker-install:checked ~ .install-instructions.docker{display:block}.install-instructions-container .install-instructions{margin-top:30px}.prep-instructions-container #generic-prep,.prep-instructions-container #fedora-prep,.prep-instructions-container #centos-prep,.prep-instructions-container .prep-instructions{display:none}.prep-instructions-container label.menu-selector{display:inline-block;text-align:center;padding:10px;white-space:nowrap;border-bottom:2px solid #999;transition:border-bottom-color .5s}.prep-instructions-container label.menu-selector+label.menu-selector{margin-left:10px}.prep-instructions-container #generic-prep:checked ~ .menu-selector.generic,.prep-instructions-container #fedora-prep:checked ~ .menu-selector.fedora,.prep-instructions-container #centos-prep:checked ~ .menu-selector.centos{border-bottom-color:#049cdb}.prep-instructions-container #generic-prep:checked ~ .prep-instructions.generic,.prep-instructions-container #fedora-prep:checked ~ .prep-instructions.fedora,.prep-instructions-container #centos-prep:checked ~ .prep-instructions.centos{display:block}.prep-instructions-container .prep-instructions{margin-top:20px}.post-instructions-container #generic-post,.post-instructions-container #fedora-post,.post-instructions-container #debian-post,.post-instructions-container .post-instructions{display:none}.post-instructions-container label.menu-selector{display:inline-block;text-align:center;padding:10px;white-space:nowrap;border-bottom:2px solid #999;transition:border-bottom-color .5s}.post-instructions-container label.menu-selector+label.menu-selector{margin-left:10px}.post-instructions-container #generic-post:checked ~ .menu-selector.generic-post,.post-instructions-container #fedora-post:checked ~ .menu-selector.fedora-post,.post-instructions-container #debian-post:checked ~ .menu-selector.debian-post{border-bottom-color:#049cdb}.post-instructions-container #generic-post:checked ~ .post-instructions.generic-post,.post-instructions-container #fedora-post:checked ~ .post-instructions.fedora-post,.post-instructions-container #debian-post:checked ~ .post-instructions.debian-post{display:block}.post-instructions-container .post-instructions{margin-top:20px} + */@font-face{font-family:'FontAwesome';src:url("../font/fontawesome-webfont.eot?v=3.2.1");src:url("../font/fontawesome-webfont.eot?#iefix&v=3.2.1") format("embedded-opentype"),url("../font/fontawesome-webfont.woff?v=3.2.1") format("woff"),url("../font/fontawesome-webfont.ttf?v=3.2.1") format("truetype"),url("../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1") format("svg");font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em}[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none}.icon-large:before{vertical-align:-10%;font-size:1.33333em}a [class^="icon-"],a [class*=" icon-"]{display:inline}[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.14286em;text-align:right;padding-right:0.28571em}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.42857em}.icons-ul{margin-left:2.14286em;list-style-type:none}.icons-ul>li{position:relative}.icons-ul .icon-li{position:absolute;left:-2.14286em;width:2.14286em;text-align:center;line-height:inherit}[class^="icon-"].hide,[class*=" icon-"].hide{display:none}.icon-muted{color:#eee}.icon-light{color:#fff}.icon-dark{color:#333}.icon-border{border:solid 1px #eee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.icon-2x{font-size:2em}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.icon-3x{font-size:3em}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.icon-4x{font-size:4em}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.icon-5x{font-size:5em}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.pull-right{float:right}.pull-left{float:left}[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em}[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em}.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em}.icon-stack .icon-stack-base{font-size:2em;*line-height:1em}.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear}a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1)}.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2)}.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)}.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block}.icon-glass:before{content:"\f000"}.icon-music:before{content:"\f001"}.icon-search:before{content:"\f002"}.icon-envelope-alt:before{content:"\f003"}.icon-heart:before{content:"\f004"}.icon-star:before{content:"\f005"}.icon-star-empty:before{content:"\f006"}.icon-user:before{content:"\f007"}.icon-film:before{content:"\f008"}.icon-th-large:before{content:"\f009"}.icon-th:before{content:"\f00a"}.icon-th-list:before{content:"\f00b"}.icon-ok:before{content:"\f00c"}.icon-remove:before{content:"\f00d"}.icon-zoom-in:before{content:"\f00e"}.icon-zoom-out:before{content:"\f010"}.icon-power-off:before,.icon-off:before{content:"\f011"}.icon-signal:before{content:"\f012"}.icon-gear:before,.icon-cog:before{content:"\f013"}.icon-trash:before{content:"\f014"}.icon-home:before{content:"\f015"}.icon-file-alt:before{content:"\f016"}.icon-time:before{content:"\f017"}.icon-road:before{content:"\f018"}.icon-download-alt:before{content:"\f019"}.icon-download:before{content:"\f01a"}.icon-upload:before{content:"\f01b"}.icon-inbox:before{content:"\f01c"}.icon-play-circle:before{content:"\f01d"}.icon-rotate-right:before,.icon-repeat:before{content:"\f01e"}.icon-refresh:before{content:"\f021"}.icon-list-alt:before{content:"\f022"}.icon-lock:before{content:"\f023"}.icon-flag:before{content:"\f024"}.icon-headphones:before{content:"\f025"}.icon-volume-off:before{content:"\f026"}.icon-volume-down:before{content:"\f027"}.icon-volume-up:before{content:"\f028"}.icon-qrcode:before{content:"\f029"}.icon-barcode:before{content:"\f02a"}.icon-tag:before{content:"\f02b"}.icon-tags:before{content:"\f02c"}.icon-book:before{content:"\f02d"}.icon-bookmark:before{content:"\f02e"}.icon-print:before{content:"\f02f"}.icon-camera:before{content:"\f030"}.icon-font:before{content:"\f031"}.icon-bold:before{content:"\f032"}.icon-italic:before{content:"\f033"}.icon-text-height:before{content:"\f034"}.icon-text-width:before{content:"\f035"}.icon-align-left:before{content:"\f036"}.icon-align-center:before{content:"\f037"}.icon-align-right:before{content:"\f038"}.icon-align-justify:before{content:"\f039"}.icon-list:before{content:"\f03a"}.icon-indent-left:before{content:"\f03b"}.icon-indent-right:before{content:"\f03c"}.icon-facetime-video:before{content:"\f03d"}.icon-picture:before{content:"\f03e"}.icon-pencil:before{content:"\f040"}.icon-map-marker:before{content:"\f041"}.icon-adjust:before{content:"\f042"}.icon-tint:before{content:"\f043"}.icon-edit:before{content:"\f044"}.icon-share:before{content:"\f045"}.icon-check:before{content:"\f046"}.icon-move:before{content:"\f047"}.icon-step-backward:before{content:"\f048"}.icon-fast-backward:before{content:"\f049"}.icon-backward:before{content:"\f04a"}.icon-play:before{content:"\f04b"}.icon-pause:before{content:"\f04c"}.icon-stop:before{content:"\f04d"}.icon-forward:before{content:"\f04e"}.icon-fast-forward:before{content:"\f050"}.icon-step-forward:before{content:"\f051"}.icon-eject:before{content:"\f052"}.icon-chevron-left:before{content:"\f053"}.icon-chevron-right:before{content:"\f054"}.icon-plus-sign:before{content:"\f055"}.icon-minus-sign:before{content:"\f056"}.icon-remove-sign:before{content:"\f057"}.icon-ok-sign:before{content:"\f058"}.icon-question-sign:before{content:"\f059"}.icon-info-sign:before{content:"\f05a"}.icon-screenshot:before{content:"\f05b"}.icon-remove-circle:before{content:"\f05c"}.icon-ok-circle:before{content:"\f05d"}.icon-ban-circle:before{content:"\f05e"}.icon-arrow-left:before{content:"\f060"}.icon-arrow-right:before{content:"\f061"}.icon-arrow-up:before{content:"\f062"}.icon-arrow-down:before{content:"\f063"}.icon-mail-forward:before,.icon-share-alt:before{content:"\f064"}.icon-resize-full:before{content:"\f065"}.icon-resize-small:before{content:"\f066"}.icon-plus:before{content:"\f067"}.icon-minus:before{content:"\f068"}.icon-asterisk:before{content:"\f069"}.icon-exclamation-sign:before{content:"\f06a"}.icon-gift:before{content:"\f06b"}.icon-leaf:before{content:"\f06c"}.icon-fire:before{content:"\f06d"}.icon-eye-open:before{content:"\f06e"}.icon-eye-close:before{content:"\f070"}.icon-warning-sign:before{content:"\f071"}.icon-plane:before{content:"\f072"}.icon-calendar:before{content:"\f073"}.icon-random:before{content:"\f074"}.icon-comment:before{content:"\f075"}.icon-magnet:before{content:"\f076"}.icon-chevron-up:before{content:"\f077"}.icon-chevron-down:before{content:"\f078"}.icon-retweet:before{content:"\f079"}.icon-shopping-cart:before{content:"\f07a"}.icon-folder-close:before{content:"\f07b"}.icon-folder-open:before{content:"\f07c"}.icon-resize-vertical:before{content:"\f07d"}.icon-resize-horizontal:before{content:"\f07e"}.icon-bar-chart:before{content:"\f080"}.icon-twitter-sign:before{content:"\f081"}.icon-facebook-sign:before{content:"\f082"}.icon-camera-retro:before{content:"\f083"}.icon-key:before{content:"\f084"}.icon-gears:before,.icon-cogs:before{content:"\f085"}.icon-comments:before{content:"\f086"}.icon-thumbs-up-alt:before{content:"\f087"}.icon-thumbs-down-alt:before{content:"\f088"}.icon-star-half:before{content:"\f089"}.icon-heart-empty:before{content:"\f08a"}.icon-signout:before{content:"\f08b"}.icon-linkedin-sign:before{content:"\f08c"}.icon-pushpin:before{content:"\f08d"}.icon-external-link:before{content:"\f08e"}.icon-signin:before{content:"\f090"}.icon-trophy:before{content:"\f091"}.icon-github-sign:before{content:"\f092"}.icon-upload-alt:before{content:"\f093"}.icon-lemon:before{content:"\f094"}.icon-phone:before{content:"\f095"}.icon-unchecked:before,.icon-check-empty:before{content:"\f096"}.icon-bookmark-empty:before{content:"\f097"}.icon-phone-sign:before{content:"\f098"}.icon-twitter:before{content:"\f099"}.icon-facebook:before{content:"\f09a"}.icon-github:before{content:"\f09b"}.icon-unlock:before{content:"\f09c"}.icon-credit-card:before{content:"\f09d"}.icon-rss:before{content:"\f09e"}.icon-hdd:before{content:"\f0a0"}.icon-bullhorn:before{content:"\f0a1"}.icon-bell:before{content:"\f0a2"}.icon-certificate:before{content:"\f0a3"}.icon-hand-right:before{content:"\f0a4"}.icon-hand-left:before{content:"\f0a5"}.icon-hand-up:before{content:"\f0a6"}.icon-hand-down:before{content:"\f0a7"}.icon-circle-arrow-left:before{content:"\f0a8"}.icon-circle-arrow-right:before{content:"\f0a9"}.icon-circle-arrow-up:before{content:"\f0aa"}.icon-circle-arrow-down:before{content:"\f0ab"}.icon-globe:before{content:"\f0ac"}.icon-wrench:before{content:"\f0ad"}.icon-tasks:before{content:"\f0ae"}.icon-filter:before{content:"\f0b0"}.icon-briefcase:before{content:"\f0b1"}.icon-fullscreen:before{content:"\f0b2"}.icon-group:before{content:"\f0c0"}.icon-link:before{content:"\f0c1"}.icon-cloud:before{content:"\f0c2"}.icon-beaker:before{content:"\f0c3"}.icon-cut:before{content:"\f0c4"}.icon-copy:before{content:"\f0c5"}.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6"}.icon-save:before{content:"\f0c7"}.icon-sign-blank:before{content:"\f0c8"}.icon-reorder:before{content:"\f0c9"}.icon-list-ul:before{content:"\f0ca"}.icon-list-ol:before{content:"\f0cb"}.icon-strikethrough:before{content:"\f0cc"}.icon-underline:before{content:"\f0cd"}.icon-table:before{content:"\f0ce"}.icon-magic:before{content:"\f0d0"}.icon-truck:before{content:"\f0d1"}.icon-pinterest:before{content:"\f0d2"}.icon-pinterest-sign:before{content:"\f0d3"}.icon-google-plus-sign:before{content:"\f0d4"}.icon-google-plus:before{content:"\f0d5"}.icon-money:before{content:"\f0d6"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-columns:before{content:"\f0db"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-envelope:before{content:"\f0e0"}.icon-linkedin:before{content:"\f0e1"}.icon-rotate-left:before,.icon-undo:before{content:"\f0e2"}.icon-legal:before{content:"\f0e3"}.icon-dashboard:before{content:"\f0e4"}.icon-comment-alt:before{content:"\f0e5"}.icon-comments-alt:before{content:"\f0e6"}.icon-bolt:before{content:"\f0e7"}.icon-sitemap:before{content:"\f0e8"}.icon-umbrella:before{content:"\f0e9"}.icon-paste:before{content:"\f0ea"}.icon-lightbulb:before{content:"\f0eb"}.icon-exchange:before{content:"\f0ec"}.icon-cloud-download:before{content:"\f0ed"}.icon-cloud-upload:before{content:"\f0ee"}.icon-user-md:before{content:"\f0f0"}.icon-stethoscope:before{content:"\f0f1"}.icon-suitcase:before{content:"\f0f2"}.icon-bell-alt:before{content:"\f0f3"}.icon-coffee:before{content:"\f0f4"}.icon-food:before{content:"\f0f5"}.icon-file-text-alt:before{content:"\f0f6"}.icon-building:before{content:"\f0f7"}.icon-hospital:before{content:"\f0f8"}.icon-ambulance:before{content:"\f0f9"}.icon-medkit:before{content:"\f0fa"}.icon-fighter-jet:before{content:"\f0fb"}.icon-beer:before{content:"\f0fc"}.icon-h-sign:before{content:"\f0fd"}.icon-plus-sign-alt:before{content:"\f0fe"}.icon-double-angle-left:before{content:"\f100"}.icon-double-angle-right:before{content:"\f101"}.icon-double-angle-up:before{content:"\f102"}.icon-double-angle-down:before{content:"\f103"}.icon-angle-left:before{content:"\f104"}.icon-angle-right:before{content:"\f105"}.icon-angle-up:before{content:"\f106"}.icon-angle-down:before{content:"\f107"}.icon-desktop:before{content:"\f108"}.icon-laptop:before{content:"\f109"}.icon-tablet:before{content:"\f10a"}.icon-mobile-phone:before{content:"\f10b"}.icon-circle-blank:before{content:"\f10c"}.icon-quote-left:before{content:"\f10d"}.icon-quote-right:before{content:"\f10e"}.icon-spinner:before{content:"\f110"}.icon-circle:before{content:"\f111"}.icon-mail-reply:before,.icon-reply:before{content:"\f112"}.icon-github-alt:before{content:"\f113"}.icon-folder-close-alt:before{content:"\f114"}.icon-folder-open-alt:before{content:"\f115"}.icon-expand-alt:before{content:"\f116"}.icon-collapse-alt:before{content:"\f117"}.icon-smile:before{content:"\f118"}.icon-frown:before{content:"\f119"}.icon-meh:before{content:"\f11a"}.icon-gamepad:before{content:"\f11b"}.icon-keyboard:before{content:"\f11c"}.icon-flag-alt:before{content:"\f11d"}.icon-flag-checkered:before{content:"\f11e"}.icon-terminal:before{content:"\f120"}.icon-code:before{content:"\f121"}.icon-reply-all:before{content:"\f122"}.icon-mail-reply-all:before{content:"\f122"}.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123"}.icon-location-arrow:before{content:"\f124"}.icon-crop:before{content:"\f125"}.icon-code-fork:before{content:"\f126"}.icon-unlink:before{content:"\f127"}.icon-question:before{content:"\f128"}.icon-info:before{content:"\f129"}.icon-exclamation:before{content:"\f12a"}.icon-superscript:before{content:"\f12b"}.icon-subscript:before{content:"\f12c"}.icon-eraser:before{content:"\f12d"}.icon-puzzle-piece:before{content:"\f12e"}.icon-microphone:before{content:"\f130"}.icon-microphone-off:before{content:"\f131"}.icon-shield:before{content:"\f132"}.icon-calendar-empty:before{content:"\f133"}.icon-fire-extinguisher:before{content:"\f134"}.icon-rocket:before{content:"\f135"}.icon-maxcdn:before{content:"\f136"}.icon-chevron-sign-left:before{content:"\f137"}.icon-chevron-sign-right:before{content:"\f138"}.icon-chevron-sign-up:before{content:"\f139"}.icon-chevron-sign-down:before{content:"\f13a"}.icon-html5:before{content:"\f13b"}.icon-css3:before{content:"\f13c"}.icon-anchor:before{content:"\f13d"}.icon-unlock-alt:before{content:"\f13e"}.icon-bullseye:before{content:"\f140"}.icon-ellipsis-horizontal:before{content:"\f141"}.icon-ellipsis-vertical:before{content:"\f142"}.icon-rss-sign:before{content:"\f143"}.icon-play-sign:before{content:"\f144"}.icon-ticket:before{content:"\f145"}.icon-minus-sign-alt:before{content:"\f146"}.icon-check-minus:before{content:"\f147"}.icon-level-up:before{content:"\f148"}.icon-level-down:before{content:"\f149"}.icon-check-sign:before{content:"\f14a"}.icon-edit-sign:before{content:"\f14b"}.icon-external-link-sign:before{content:"\f14c"}.icon-share-sign:before{content:"\f14d"}.icon-compass:before{content:"\f14e"}.icon-collapse:before{content:"\f150"}.icon-collapse-top:before{content:"\f151"}.icon-expand:before{content:"\f152"}.icon-euro:before,.icon-eur:before{content:"\f153"}.icon-gbp:before{content:"\f154"}.icon-dollar:before,.icon-usd:before{content:"\f155"}.icon-rupee:before,.icon-inr:before{content:"\f156"}.icon-yen:before,.icon-jpy:before{content:"\f157"}.icon-renminbi:before,.icon-cny:before{content:"\f158"}.icon-won:before,.icon-krw:before{content:"\f159"}.icon-bitcoin:before,.icon-btc:before{content:"\f15a"}.icon-file:before{content:"\f15b"}.icon-file-text:before{content:"\f15c"}.icon-sort-by-alphabet:before{content:"\f15d"}.icon-sort-by-alphabet-alt:before{content:"\f15e"}.icon-sort-by-attributes:before{content:"\f160"}.icon-sort-by-attributes-alt:before{content:"\f161"}.icon-sort-by-order:before{content:"\f162"}.icon-sort-by-order-alt:before{content:"\f163"}.icon-thumbs-up:before{content:"\f164"}.icon-thumbs-down:before{content:"\f165"}.icon-youtube-sign:before{content:"\f166"}.icon-youtube:before{content:"\f167"}.icon-xing:before{content:"\f168"}.icon-xing-sign:before{content:"\f169"}.icon-youtube-play:before{content:"\f16a"}.icon-dropbox:before{content:"\f16b"}.icon-stackexchange:before{content:"\f16c"}.icon-instagram:before{content:"\f16d"}.icon-flickr:before{content:"\f16e"}.icon-adn:before{content:"\f170"}.icon-bitbucket:before{content:"\f171"}.icon-bitbucket-sign:before{content:"\f172"}.icon-tumblr:before{content:"\f173"}.icon-tumblr-sign:before{content:"\f174"}.icon-long-arrow-down:before{content:"\f175"}.icon-long-arrow-up:before{content:"\f176"}.icon-long-arrow-left:before{content:"\f177"}.icon-long-arrow-right:before{content:"\f178"}.icon-apple:before{content:"\f179"}.icon-windows:before{content:"\f17a"}.icon-android:before{content:"\f17b"}.icon-linux:before{content:"\f17c"}.icon-dribbble:before{content:"\f17d"}.icon-skype:before{content:"\f17e"}.icon-foursquare:before{content:"\f180"}.icon-trello:before{content:"\f181"}.icon-female:before{content:"\f182"}.icon-male:before{content:"\f183"}.icon-gittip:before{content:"\f184"}.icon-sun:before{content:"\f185"}.icon-moon:before{content:"\f186"}.icon-archive:before{content:"\f187"}.icon-bug:before{content:"\f188"}.icon-vk:before{content:"\f189"}.icon-weibo:before{content:"\f18a"}.icon-renren:before{content:"\f18b"}body,html{background-color:#f5f5f5;color:#222;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;height:100%}a{color:#049cdb;text-decoration:none}a:visited{color:#0378a9}.menu a{color:#049cdb}.gist{font-size:0.75em}@media only screen and (max-width: 480px){.title.indent::before{display:none}}.title.indent::before{content:"// ";color:#049cdb}.divider,.usp hr,.hero hr{border:none;border-bottom:2px solid #049cdb;clear:both;margin:2em 0}article.post img,article.page img,article.listing img{border:5px solid #fff;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,0.25)}article.post img.right,article.page img.right,article.listing img.right{float:right;margin:0 0 10px 20px}article.post img.left,article.page img.left,article.listing img.left{float:left;margin:0 20px 10px 0}.grid-wrapper{margin:auto;max-width:1100px;padding:0 25px}.grid-center{text-align:center}.grid-center>.grid__item{text-align:left}body>header{-webkit-box-shadow:0 0 3px rgba(0,0,0,0.25);-moz-box-shadow:0 0 3px rgba(0,0,0,0.25);-ms-box-shadow:0 0 3px rgba(0,0,0,0.25);-o-box-shadow:0 0 3px rgba(0,0,0,0.25);box-shadow:0 0 3px rgba(0,0,0,0.25);background-color:#fff;margin-bottom:2em}body>header .site-title{color:#222;font-size:1.7em;font-weight:bold;line-height:2.5em}body{-webkit-animation:bugfix infinite 1s}@-webkit-keyframes bugfix{from{padding:0}to{padding:0}}.header{position:relative}#toggle,.toggle{display:none}.menu li{list-style:none;float:left}@media only screen and (max-width: 790px){.menu{display:none;opacity:0;width:100%;position:absolute;right:0}.menu li{display:block;width:100%;margin:0}.menu li a{display:block;width:100%;text-decoration:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.toggle{display:block;position:relative;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}#toggle:checked ~ .menu{display:block;opacity:1;z-index:999}}ul.menu li{position:relative}ul.menu li:hover ul{display:block}ul.menu li ul{display:none;z-index:10;position:absolute;top:68px;margin-left:0;background-color:white}ul.menu li ul li{white-space:nowrap;float:none}ul.menu li ul li a{display:block;padding:20px 10px}ul.menu li ul li a:hover,ul.menu li ul li a:focus{background:#eee}header .grid{height:68px}.menu{margin:0;top:68px}.menu li a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:all 0.25s linear;-moz-transition:all 0.25s linear;-o-transition:all 0.25s linear;transition:all 0.25s linear;display:block;padding:32px 20px;text-decoration:none;font-weight:normal;font-size:16px;line-height:1}.menu>li>a:hover,.menu>li>a:focus{background:#f5f5f5;box-shadow:inset 0px 5px #049cdb;color:#049cdb;padding:40px 20px 24px}.toggle{z-index:20}@media only screen and (max-width: 790px){.menu{background:#fff;border-top:1px solid #049cdb;border-bottom:4px solid #049cdb}.menu,.menu li,.menu li a{height:auto}.menu li a{padding:15px 15px !important}.menu li a:hover,.menu li a:focus{background:#eee;box-shadow:inset 5px 0px #049cdb;padding:15px 15px 15px 25px}.toggle{position:absolute;top:17px;right:10px}.toggle::after{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:all 0.5s linear;-moz-transition:all 0.5s linear;-o-transition:all 0.5s linear;transition:all 0.5s linear;font-family:"FontAwesome";content:"\f0c9";display:inline-block;width:100%;padding:10px 15px;background:#049cdb;text-align:center;font-size:12px;color:#fff;white-space:nowrap}.toggle:hover::after{background:#0383b8}#toggle:checked+.toggle::after{content:attr(data-close)}ul.menu li ul{display:block;position:relative;top:0}}#page-wrap{min-height:100%;margin-bottom:-100px}#page-wrap::after{content:"";display:block;height:100px}body>footer{-webkit-box-shadow:0 0 3px rgba(0,0,0,0.25);-moz-box-shadow:0 0 3px rgba(0,0,0,0.25);-ms-box-shadow:0 0 3px rgba(0,0,0,0.25);-o-box-shadow:0 0 3px rgba(0,0,0,0.25);box-shadow:0 0 3px rgba(0,0,0,0.25);background-color:#fff;margin-top:3em}.copyright{margin:0;padding:20px 0;text-align:center}article blockquote{border-left:2px solid #049cdb;color:#484848;font-family:Georgia,"Times New Roman",Times,serif;font-size:1.25em;font-style:italic;padding-left:15px}article blockquote footer{float:right;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.8em}article blockquote footer strong::after{content:" \2014 "}article blockquote footer a{text-decoration:underline}article .pullquote-left::before,article .pullquote-right::before{border:medium none;color:#049cdb;content:"\201C" attr(data-pullquote) "\201D";float:right;font-family:Georgia,"Times New Roman",Times,serif;font-size:1.4em;font-style:italic;line-height:1.45em;margin:0.3em 0 1em 1.5em;padding:0;position:relative;top:7px;width:45%}@media only screen and (max-width: 480px){article .pullquote-left::before,article .pullquote-right::before{border-top:1px dotted #049cdb;border-bottom:1px dotted #049cdb;padding:0 10px;width:100%}}article .tags{display:inline}article .tags li{margin-right:2px}article .tags li::after{content:","}article .tags li:last-child::after{content:""}article .tags li a{color:#555;text-decoration:none}article .tags li a:hover{text-decoration:underline}article .meta{font-size:12px;padding:0 0 5px}article .meta>*{margin-right:15px;white-space:nowrap}article .meta>*:last-child{margin-right:0}article .meta .comments::before{content:"\f075";font-family:"FontAwesome";padding-right:3px}article.listing{margin-bottom:20px}article.listing h1{margin-bottom:0}article.listing h1 a{color:#049cdb;text-decoration:none}article.listing .entry-content{margin:10px 0}article.listing+hr{border:none;border-bottom:1px solid #049cdb}@media only screen and (max-width: 480px){article.post .tags{clear:both;margin-top:7px}}article.post h1{margin-bottom:0}article.post .meta{border-bottom:1px solid #049cdb;margin-bottom:20px}#archive-list article h1{margin-bottom:0}.sans,html .gist .gist-file .gist-meta{font-family:"Helvetica Neue",Arial,sans-serif}.mono,pre,p code,li code{font-family:Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace}.highlight table{margin-bottom:0}.highlight .gutter,.highlight .code{padding:0}.highlight .gutter .line-number{display:block}.highlight,html .gist .gist-file .gist-syntax .gist-highlight{border:1px solid #05232b !important}.highlight table td.code,html .gist .gist-file .gist-syntax .gist-highlight table td.code{width:100%}.highlight .line-numbers,html .gist .gist-file .gist-syntax .highlight .line_numbers{text-align:right;font-size:13px;line-height:1.45em;background:#073642 url('/images/noise.png?1419195603') top left !important;border-right:1px solid #00232c !important;-webkit-box-shadow:#083e4b -1px 0 inset;-moz-box-shadow:#083e4b -1px 0 inset;-ms-box-shadow:#083e4b -1px 0 inset;-o-box-shadow:#083e4b -1px 0 inset;box-shadow:#083e4b -1px 0 inset;text-shadow:#021014 0 -1px;padding:.8em !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.highlight .line-numbers span,html .gist .gist-file .gist-syntax .highlight .line_numbers span{color:#586e75 !important}figure.code,.gist-file,pre{-webkit-box-shadow:rgba(0,0,0,0.06) 0 0 10px;-moz-box-shadow:rgba(0,0,0,0.06) 0 0 10px;-ms-box-shadow:rgba(0,0,0,0.06) 0 0 10px;-o-box-shadow:rgba(0,0,0,0.06) 0 0 10px;box-shadow:rgba(0,0,0,0.06) 0 0 10px}figure.code .highlight pre,.gist-file .highlight pre,pre .highlight pre{-webkit-box-shadow:none;-moz-box-shadow:none;-ms-box-shadow:none;-o-box-shadow:none;box-shadow:none}.gist .highlight *::-moz-selection,figure.code .highlight *::-moz-selection{background:#386774;color:inherit;text-shadow:#002b36 0 1px}.gist .highlight *::-webkit-selection,figure.code .highlight *::-webkit-selection{background:#386774;color:inherit;text-shadow:#002b36 0 1px}.gist .highlight *::selection,figure.code .highlight *::selection{background:#386774;color:inherit;text-shadow:#002b36 0 1px}html .gist .gist-file{margin-bottom:1.8em;position:relative;border:none;padding-top:26px !important}html .gist .gist-file .highlight{margin-bottom:0}html .gist .gist-file .gist-syntax{border-bottom:0 !important;background:none !important}html .gist .gist-file .gist-syntax .gist-highlight{background:#002b36 !important}html .gist .gist-file .gist-syntax .highlight pre{padding:0}html .gist .gist-file .gist-meta{padding:.6em 0.8em;border:1px solid #083e4b !important;color:#586e75;font-size:.7em !important;background:#073642 url('/images/noise.png?1419195603') top left;line-height:1.5em}html .gist .gist-file .gist-meta a{color:#75878b !important}html .gist .gist-file .gist-meta a:hover{color:#93a1a1 !important}html .gist .gist-file .gist-meta a[href*='#file']{position:absolute;top:0;left:0;right:-10px;color:#474747 !important}html .gist .gist-file .gist-meta a[href*='#file']:hover{color:#049cdb !important}html .gist .gist-file .gist-meta a[href*=raw]{top:.4em}pre{background:#002b36 url('/images/noise.png?1419195603') top left;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;border-radius:0.4em;border:1px solid #05232b;line-height:1.45em;font-size:13px;margin-bottom:2.1em;padding:.8em 1em;color:#93a1a1;overflow:auto}h3.filename+pre{-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px}p code,li code{display:inline-block;white-space:no-wrap;background:#fff;font-size:.8em;line-height:1.5em;color:#555;border:1px solid #ddd;-webkit-border-radius:0.4em;-moz-border-radius:0.4em;border-radius:0.4em;padding:0 .3em;margin:-1px 0}p pre code,li pre code{font-size:1em !important;background:none;border:none}.pre-code,html .gist .gist-file .gist-syntax .highlight pre,.highlight code{font-family:Menlo,Monaco,"Andale Mono","lucida console","Courier New",monospace !important;overflow:scroll;overflow-y:hidden;display:block;padding:.8em;overflow-x:auto;line-height:1.45em;background:#002b36 url('/images/noise.png?1419195603') top left !important;color:#93a1a1 !important}.pre-code span,html .gist .gist-file .gist-syntax .highlight pre span,.highlight code span{color:#93a1a1 !important}.pre-code span,html .gist .gist-file .gist-syntax .highlight pre span,.highlight code span{font-style:normal !important;font-weight:normal !important}.pre-code .c,html .gist .gist-file .gist-syntax .highlight pre .c,.highlight code .c{color:#586e75 !important;font-style:italic !important}.pre-code .cm,html .gist .gist-file .gist-syntax .highlight pre .cm,.highlight code .cm{color:#586e75 !important;font-style:italic !important}.pre-code .cp,html .gist .gist-file .gist-syntax .highlight pre .cp,.highlight code .cp{color:#586e75 !important;font-style:italic !important}.pre-code .c1,html .gist .gist-file .gist-syntax .highlight pre .c1,.highlight code .c1{color:#586e75 !important;font-style:italic !important}.pre-code .cs,html .gist .gist-file .gist-syntax .highlight pre .cs,.highlight code .cs{color:#586e75 !important;font-weight:bold !important;font-style:italic !important}.pre-code .err,html .gist .gist-file .gist-syntax .highlight pre .err,.highlight code .err{color:#dc322f !important;background:none !important}.pre-code .k,html .gist .gist-file .gist-syntax .highlight pre .k,.highlight code .k{color:#cb4b16 !important}.pre-code .o,html .gist .gist-file .gist-syntax .highlight pre .o,.highlight code .o{color:#93a1a1 !important;font-weight:bold !important}.pre-code .p,html .gist .gist-file .gist-syntax .highlight pre .p,.highlight code .p{color:#93a1a1 !important}.pre-code .ow,html .gist .gist-file .gist-syntax .highlight pre .ow,.highlight code .ow{color:#2aa198 !important;font-weight:bold !important}.pre-code .gd,html .gist .gist-file .gist-syntax .highlight pre .gd,.highlight code .gd{color:#93a1a1 !important;background-color:#372c34 !important;display:inline-block}.pre-code .gd .x,html .gist .gist-file .gist-syntax .highlight pre .gd .x,.highlight code .gd .x{color:#93a1a1 !important;background-color:#4d2d33 !important;display:inline-block}.pre-code .ge,html .gist .gist-file .gist-syntax .highlight pre .ge,.highlight code .ge{color:#93a1a1 !important;font-style:italic !important}.pre-code .gh,html .gist .gist-file .gist-syntax .highlight pre .gh,.highlight code .gh{color:#586e75 !important}.pre-code .gi,html .gist .gist-file .gist-syntax .highlight pre .gi,.highlight code .gi{color:#93a1a1 !important;background-color:#1a412b !important;display:inline-block}.pre-code .gi .x,html .gist .gist-file .gist-syntax .highlight pre .gi .x,.highlight code .gi .x{color:#93a1a1 !important;background-color:#355720 !important;display:inline-block}.pre-code .gs,html .gist .gist-file .gist-syntax .highlight pre .gs,.highlight code .gs{color:#93a1a1 !important;font-weight:bold !important}.pre-code .gu,html .gist .gist-file .gist-syntax .highlight pre .gu,.highlight code .gu{color:#6c71c4 !important}.pre-code .kc,html .gist .gist-file .gist-syntax .highlight pre .kc,.highlight code .kc{color:#859900 !important;font-weight:bold !important}.pre-code .kd,html .gist .gist-file .gist-syntax .highlight pre .kd,.highlight code .kd{color:#268bd2 !important}.pre-code .kp,html .gist .gist-file .gist-syntax .highlight pre .kp,.highlight code .kp{color:#cb4b16 !important;font-weight:bold !important}.pre-code .kr,html .gist .gist-file .gist-syntax .highlight pre .kr,.highlight code .kr{color:#d33682 !important;font-weight:bold !important}.pre-code .kt,html .gist .gist-file .gist-syntax .highlight pre .kt,.highlight code .kt{color:#2aa198 !important}.pre-code .n,html .gist .gist-file .gist-syntax .highlight pre .n,.highlight code .n{color:#268bd2 !important}.pre-code .na,html .gist .gist-file .gist-syntax .highlight pre .na,.highlight code .na{color:#268bd2 !important}.pre-code .nb,html .gist .gist-file .gist-syntax .highlight pre .nb,.highlight code .nb{color:#859900 !important}.pre-code .nc,html .gist .gist-file .gist-syntax .highlight pre .nc,.highlight code .nc{color:#d33682 !important}.pre-code .no,html .gist .gist-file .gist-syntax .highlight pre .no,.highlight code .no{color:#b58900 !important}.pre-code .nl,html .gist .gist-file .gist-syntax .highlight pre .nl,.highlight code .nl{color:#859900 !important}.pre-code .ne,html .gist .gist-file .gist-syntax .highlight pre .ne,.highlight code .ne{color:#268bd2 !important;font-weight:bold !important}.pre-code .nf,html .gist .gist-file .gist-syntax .highlight pre .nf,.highlight code .nf{color:#268bd2 !important;font-weight:bold !important}.pre-code .nn,html .gist .gist-file .gist-syntax .highlight pre .nn,.highlight code .nn{color:#b58900 !important}.pre-code .nt,html .gist .gist-file .gist-syntax .highlight pre .nt,.highlight code .nt{color:#268bd2 !important;font-weight:bold !important}.pre-code .nx,html .gist .gist-file .gist-syntax .highlight pre .nx,.highlight code .nx{color:#b58900 !important}.pre-code .vg,html .gist .gist-file .gist-syntax .highlight pre .vg,.highlight code .vg{color:#268bd2 !important}.pre-code .vi,html .gist .gist-file .gist-syntax .highlight pre .vi,.highlight code .vi{color:#268bd2 !important}.pre-code .nv,html .gist .gist-file .gist-syntax .highlight pre .nv,.highlight code .nv{color:#268bd2 !important}.pre-code .mf,html .gist .gist-file .gist-syntax .highlight pre .mf,.highlight code .mf{color:#2aa198 !important}.pre-code .m,html .gist .gist-file .gist-syntax .highlight pre .m,.highlight code .m{color:#2aa198 !important}.pre-code .mh,html .gist .gist-file .gist-syntax .highlight pre .mh,.highlight code .mh{color:#2aa198 !important}.pre-code .mi,html .gist .gist-file .gist-syntax .highlight pre .mi,.highlight code .mi{color:#2aa198 !important}.pre-code .s,html .gist .gist-file .gist-syntax .highlight pre .s,.highlight code .s{color:#2aa198 !important}.pre-code .sd,html .gist .gist-file .gist-syntax .highlight pre .sd,.highlight code .sd{color:#2aa198 !important}.pre-code .s2,html .gist .gist-file .gist-syntax .highlight pre .s2,.highlight code .s2{color:#2aa198 !important}.pre-code .se,html .gist .gist-file .gist-syntax .highlight pre .se,.highlight code .se{color:#dc322f !important}.pre-code .si,html .gist .gist-file .gist-syntax .highlight pre .si,.highlight code .si{color:#268bd2 !important}.pre-code .sr,html .gist .gist-file .gist-syntax .highlight pre .sr,.highlight code .sr{color:#2aa198 !important}.pre-code .s1,html .gist .gist-file .gist-syntax .highlight pre .s1,.highlight code .s1{color:#2aa198 !important}.pre-code div .gd,html .gist .gist-file .gist-syntax .highlight pre div .gd,.highlight code div .gd,.pre-code div .gd .x,html .gist .gist-file .gist-syntax .highlight pre div .gd .x,.highlight code div .gd .x,.pre-code div .gi,html .gist .gist-file .gist-syntax .highlight pre div .gi,.highlight code div .gi,.pre-code div .gi .x,html .gist .gist-file .gist-syntax .highlight pre div .gi .x,.highlight code div .gi .x{display:inline-block;width:100%}.highlight,.gist-highlight{margin-bottom:1.8em;background:#002b36;overflow-y:hidden;overflow-x:auto}.highlight pre,.gist-highlight pre{background:none;-webkit-border-radius:0px;-moz-border-radius:0px;border-radius:0px;border:none;padding:0;margin-bottom:0}pre::-webkit-scrollbar,.highlight::-webkit-scrollbar,.gist-highlight::-webkit-scrollbar{height:.5em;background:rgba(255,255,255,0.15)}pre::-webkit-scrollbar-thumb:horizontal,.highlight::-webkit-scrollbar-thumb:horizontal,.gist-highlight::-webkit-scrollbar-thumb:horizontal{background:rgba(255,255,255,0.2);-webkit-border-radius:4px;border-radius:4px}.highlight code{background:#000}figure.code{background:none;padding:0;border:0;margin-bottom:1.5em}figure.code pre{margin-bottom:0}figure.code figcaption{position:relative}figure.code .highlight{margin-bottom:0}.code-title,html .gist .gist-file .gist-meta a[href*='#file'],h3.filename,figure.code figcaption{text-align:center;font-size:13px;line-height:2em;text-shadow:#cbcccc 0 1px 0;color:#474747;font-weight:normal;margin-bottom:0;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;font-family:"Helvetica Neue", Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif;background:#aaa url('/images/code_bg.png?1419195603') top repeat-x;border:1px solid #565656;border-top-color:#cbcbcb;border-left-color:#a5a5a5;border-right-color:#a5a5a5;border-bottom:0}.download-source,html .gist .gist-file .gist-meta a[href*=raw],figure.code figcaption a{position:absolute;right:.8em;color:#666 !important;z-index:1;font-size:13px;text-shadow:#cbcccc 0 1px 0;padding-left:3em}@media only screen and (min-width: 1024px){.aside-module:first-child .title{margin-top:0}}.aside-module .title{border-bottom:1px solid #049cdb;color:#333;margin:1em 0 0.5em;padding-bottom:5px}.aside-module .title .btn{border-bottom-left-radius:0;border-bottom-right-radius:0;padding:5px 10px;text-decoration:none}.aside-module .loading{display:block;font-size:2em;text-align:center}#github-repos li p{font-size:0.6em;margin-bottom:0}#pinboard .pin-item>p{margin-bottom:0}#pinboard .pin-item>p a:hover{text-decoration:underline}#pinboard .pin-item>p a::after{content:","}#pinboard .pin-item>p a:last-child::after{content:""}@media only screen and (min-width: 481px){.social ul{-webkit-column-count:2;-moz-column-count:2;column-count:2;-webkit-column-gap:10px;-moz-column-gap:10px;column-gap:10px}}.social a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#e8e8e8;border:1px solid #dcdcdc;border-radius:4px;color:#222;display:inline-block;font-size:0.8em;margin-bottom:7px;padding:1em;padding-right:0.5em;position:relative;text-decoration:none;width:100%;z-index:5;-webkit-transition:box-shadow 200ms,color 400ms,transform 400ms;-moz-transition:box-shadow 200ms,color 400ms,transform 400ms;-o-transition:box-shadow 200ms,color 400ms,transform 400ms;transition:box-shadow 200ms,color 400ms,transform 400ms}.social a:hover{color:#fff !important;text-decoration:none;text-shadow:1px 1px 0 rgba(0,0,0,0.25);z-index:7}.social a:hover::before{border:1px solid #000;height:100%;top:0;width:100%}.social a::before{background-color:#222;border-radius:4px;content:"";height:1px;position:absolute;top:50%;left:0%;width:0;z-index:-1;-webkit-transition:border 200ms,height 200ms 200ms,top 200ms 200ms,width 200ms;-moz-transition:border 200ms,height 200ms 200ms,top 200ms 200ms,width 200ms;-o-transition:border 200ms,height 200ms 200ms,top 200ms 200ms,width 200ms;transition:border 200ms,height 200ms 200ms,top 200ms 200ms,width 200ms}.social a i{font-size:2em;line-height:0.8em;margin-right:0.35em}.social a.adn{color:#4a484c}.social a.adn::before{background-color:#4a484c;border-color:#3d3c3f}.social a.dribbble{color:#ea4c89}.social a.dribbble::before{background-color:#ea4c89;border-color:#e7357a}.social a.facebook{color:#3b5998}.social a.facebook::before{background-color:#3b5998;border-color:#344e86}.social a.github{color:#333}.social a.github::before{background-color:#333;border-color:#262626}.social a.gplus{color:#db4a39}.social a.gplus::before{background-color:#db4a39;border-color:#d43927}.social a.linkedin{color:#4875b4}.social a.linkedin::before{background-color:#4875b4;border-color:#4169a2}.social a.pinterest{color:#cc2127}.social a.pinterest::before{background-color:#cc2127;border-color:#b61d23}.social a.stackoverflow{color:#fe7a15}.social a.stackoverflow::before{background-color:#fe7a15;border-color:#f86c01}.social a.twitter{color:#00a0d1}.social a.twitter::before{background-color:#00a0d1;border-color:#008cb7}.social a.youtube{color:#cc181e}.social a.youtube::before{background-color:#cc181e;border-color:#b5151b}.usp{text-align:center}@media only screen and (min-width: 481px) and (max-width: 1023px){.usp{margin-bottom:25px}}.usp .icon i{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;border:10px solid #049cdb;color:#222;display:inline-block;font-size:6em;height:1.85em;line-height:normal;padding:0.3em;width:1.85em}.usp .title{color:#222;font-size:1.1em;line-height:3em;margin:0;text-align:center;text-transform:capitalize}.usp .title+hr{margin:0;margin-bottom:1em}.usp hr{margin-bottom:1em}.usp p{text-align:left}.hero{background-color:#0b6b94;background-position:0 50%;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;border-bottom:1px solid #fff;color:#fff;font-weight:bold;margin-top:-2em;margin-bottom:1.5em;padding:50px 0;position:relative}.hero>.grid-wrapper{position:relative;z-index:7}.hero .credit{font-size:0.75em;font-style:italic;position:absolute;bottom:0;right:10px;z-index:7}.hero .credit a{border-bottom:1px solid;color:#fff;text-decoration:none}.hero .credit .licence{border:none}.hero .avatar{text-align:center}@media only screen and (max-width: 1023px){.hero .avatar{margin-bottom:30px}}.hero .avatar img{-webkit-border-radius:100%;-moz-border-radius:100%;border-radius:100%;border:10px solid #049cdb}.hero h1{font-size:3.5em;line-height:1em;text-shadow:2px 2px 0 rgba(0,0,0,0.75)}.hero hr{box-shadow:1px 1px 0 rgba(0,0,0,0.75)}.hero p{text-shadow:1px 1px 0 rgba(0,0,0,0.75)}.hero p small{color:#eee;font-size:.65em}.pull-left{float:left}.pull-right{float:right}.clearfix,article blockquote{*zoom:1}.clearfix::before,article blockquote::before,.clearfix::after,article blockquote::after{display:table;content:"";line-height:0}.clearfix::after,article blockquote::after{clear:both}ul.unstyled,ul.inline,article ul.tags,ul.divided,ol.unstyled,ol.inline,article ol.tags,ol.divided{list-style-type:none;margin:0}ul.inline,article ul.tags,ol.inline,article ol.tags{list-style-type:none}ul.inline>li,article ul.tags>li,ol.inline>li,article ol.tags>li{display:inline}ul.divided>li,ol.divided>li{border-top:1px solid #fff;border-bottom:1px solid #e8e8e8;padding:0.5em 0}ul.divided>li:first-child,ol.divided>li:first-child{border-top:none;padding-top:0}ul.divided>li:last-child,ol.divided>li:last-child{border-bottom:none}.btn{background-color:#0494d1;background-image:-moz-linear-gradient(top, #049cdb, #048ac2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#049cdb), to(#048ac2));background-image:-webkit-linear-gradient(top, #049cdb, #048ac2);background-image:-o-linear-gradient(top, #049cdb, #048ac2);background-image:linear-gradient(to bottom, #049cdb,#048ac2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF049CDB', endColorstr='#FF048AC2', GradientType=0);-webkit-box-shadow:0 0 3px rgba(0,0,0,0.25);-moz-box-shadow:0 0 3px rgba(0,0,0,0.25);-ms-box-shadow:0 0 3px rgba(0,0,0,0.25);-o-box-shadow:0 0 3px rgba(0,0,0,0.25);box-shadow:0 0 3px rgba(0,0,0,0.25);border-radius:3px;color:#fff;display:inline-block;padding:7px 15px;text-decoration:none;text-shadow:1px 1px 0 rgba(0,0,0,0.25)}.btn:hover{text-decoration:underline}.btn:visited{color:#fff}.grid{letter-spacing:-1rem}.opera:-o-prefocus,.grid{word-spacing:-1rem}.grid__item{letter-spacing:normal;word-spacing:normal}@media only screen and (min-width: 481px){.flex{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-moz-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:start;-moz-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.flex__item{-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0;-webkit-box-flex:0;-moz-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}}.hero{background-color:#038FC7;padding-bottom:0}.hero .lead{margin-bottom:16px}.hero .hero-buttons a{color:white;text-transform:uppercase;white-space:nowrap;display:inline-block}.hero .front-install{background-color:#333;margin-bottom:16px;display:inline-block;padding:8px;color:#DDD}.hero .front-install .sh{color:#c82829}.supported-brands{text-align:center}.supported-brands img{border:none !important;box-shadow:none !important;max-height:50px;max-width:200px;margin:10px}.brand{border:none !important;box-shadow:none !important;max-height:50px;max-width:200px;margin:10px}.brand.overview{max-width:100px}h1:hover a.title-link,h2:hover a.title-link,h3:hover a.title-link,h4:hover a.title-link,h5:hover a.title-link,h6:hover a.title-link{position:relative}h1:hover a.title-link::before,h2:hover a.title-link::before,h3:hover a.title-link::before,h4:hover a.title-link::before,h5:hover a.title-link::before,h6:hover a.title-link::before{position:absolute;left:-50px;padding-right:40px;font-family:"FontAwesome";content:"\f0c1"}.ha-title{white-space:nowrap}.ha-title img{width:40px;vertical-align:middle}.usp ul{text-align:left;margin-left:27px;margin-top:-18px}.usp .icon i{border:none !important}.hero-buttons a{margin:0 30px 10px 0}.hero-buttons a:last-child{margin:0}article.post img,article.post table,article.page img,article.page table,article.listing img,article.listing table{border-radius:3px;box-shadow:rgba(0,0,0,0.06) 0 0 10px}article.post img.no-shadow,article.page img.no-shadow,article.listing img.no-shadow{border:0;box-shadow:none}article.post>table,article.page>table,article.listing>table{background-color:#F3FCF5}article.post p.img,article.page p.img,article.listing p.img{background-color:#FFF;border-radius:5px;text-align:center;padding-bottom:3px;font-size:.9rem;box-shadow:rgba(0,0,0,0.06) 0 0 10px}article.post p.img img,article.page p.img img,article.listing p.img img{display:block;box-shadow:none;margin:0 auto}article.post li,article.page li,article.listing li{margin-bottom:10px}article.post li>p,article.page li>p,article.listing li>p{margin-bottom:0}article.post li:last-child,article.page li:last-child,article.listing li:last-child{margin-bottom:0}p.note{position:relative;background:#e7f2fa;padding:40px 12px 6px 12px;box-shadow:rgba(0,0,0,0.06) 0 0 10px}p.note::before{font-family:"FontAwesome";content:"\f05a" " Note " attr(data-title);background-color:#6ab0de;color:white;font-weight:bold;border-top-left-radius:3px;border-top-right-radius:3px;padding:6px 14px;line-height:1.5em;position:absolute;top:0;left:0;right:0}p.note.warning{background-color:#F7F9E1}p.note.warning::before{background-color:#bbb90d;content:"\f071" " Warning " attr(data-title)}.install-instructions-container #normal-install,.install-instructions-container #raspberry-install,.install-instructions-container #docker-install,.install-instructions-container .install-instructions{display:none}.install-instructions-container label.menu-selector{display:inline-block;text-align:center;padding:20px;white-space:nowrap;border-bottom:5px solid #999;transition:border-bottom-color .5s}.install-instructions-container label.menu-selector+label.menu-selector{margin-left:10px}.install-instructions-container #normal-install:checked ~ .menu-selector.normal,.install-instructions-container #raspberry-install:checked ~ .menu-selector.raspberry,.install-instructions-container #docker-install:checked ~ .menu-selector.docker{border-bottom-color:#049cdb}.install-instructions-container #normal-install:checked ~ .install-instructions.normal,.install-instructions-container #raspberry-install:checked ~ .install-instructions.raspberry,.install-instructions-container #docker-install:checked ~ .install-instructions.docker{display:block}.install-instructions-container .install-instructions{margin-top:30px}.prep-instructions-container #generic-prep,.prep-instructions-container #fedora-prep,.prep-instructions-container #centos-prep,.prep-instructions-container .prep-instructions{display:none}.prep-instructions-container label.menu-selector{display:inline-block;text-align:center;padding:10px;white-space:nowrap;border-bottom:2px solid #999;transition:border-bottom-color .5s}.prep-instructions-container label.menu-selector+label.menu-selector{margin-left:10px}.prep-instructions-container #generic-prep:checked ~ .menu-selector.generic,.prep-instructions-container #fedora-prep:checked ~ .menu-selector.fedora,.prep-instructions-container #centos-prep:checked ~ .menu-selector.centos{border-bottom-color:#049cdb}.prep-instructions-container #generic-prep:checked ~ .prep-instructions.generic,.prep-instructions-container #fedora-prep:checked ~ .prep-instructions.fedora,.prep-instructions-container #centos-prep:checked ~ .prep-instructions.centos{display:block}.prep-instructions-container .prep-instructions{margin-top:20px}.post-instructions-container #generic-post,.post-instructions-container #fedora-post,.post-instructions-container #debian-post,.post-instructions-container .post-instructions{display:none}.post-instructions-container label.menu-selector{display:inline-block;text-align:center;padding:10px;white-space:nowrap;border-bottom:2px solid #999;transition:border-bottom-color .5s}.post-instructions-container label.menu-selector+label.menu-selector{margin-left:10px}.post-instructions-container #generic-post:checked ~ .menu-selector.generic-post,.post-instructions-container #fedora-post:checked ~ .menu-selector.fedora-post,.post-instructions-container #debian-post:checked ~ .menu-selector.debian-post{border-bottom-color:#049cdb}.post-instructions-container #generic-post:checked ~ .post-instructions.generic-post,.post-instructions-container #fedora-post:checked ~ .post-instructions.fedora-post,.post-instructions-container #debian-post:checked ~ .post-instructions.debian-post{display:block}.post-instructions-container .post-instructions{margin-top:20px}